1. 项目概述与核心价值
在嵌入式DSP开发,尤其是基于TI C2000系列微控制器的项目中,多通道缓冲串行端口(McBSP)是一个功能强大但配置也相对复杂的模块。它不仅是实现与音频编解码器、数字传感器、通信模块等外设进行高速、多通道串行通信的桥梁,其内置的采样率生成器(SRG)更是实现精确时序控制的核心。很多工程师在初次接触McBSP时,面对手册中数十个寄存器位域,常常感到无从下手,配置出的通信链路要么时钟不稳,要么帧同步错位,调试过程耗时费力。
我经历过不少这样的项目,从最初的磕磕绊绊到后来的驾轻就熟,深刻理解到透彻掌握SRG的时钟生成机制和发送器的系统化配置流程,是驯服这个“强大野兽”的关键。本文将以TMS320F2837xS的McBSP为例,抛开手册式的罗列,从一个实际开发者的视角,深入解析采样率生成器(SRG)的时钟源选择与极性配置逻辑,并梳理出一套清晰、可复现的发送器(Transmitter)配置全流程。无论你是正在调试一块音频板卡,还是需要实现一个自定义的同步串行协议,这篇文章提供的思路和实操细节,都能帮你绕过我踩过的那些坑,快速建立起稳定可靠的McBSP通信。
2. 采样率生成器(SRG)核心机制深度解析
采样率生成器是McBSP的“心脏”,它产生的内部时钟(CLKG)和帧同步信号(FSG)为数据的收发提供了最基础的节拍。理解它的工作模式,是进行任何高级配置的前提。
2.1 SRG时钟模式(CLKSM与SCLKME)的选择逻辑
SRG本身并不产生原始的时钟信号,它需要一个输入时钟作为“种子”。根据表20-45,输入时钟有四个来源,由PCR[7](SCLKME)和SRGR2[13](CLKSM)两个位共同决定。
1. 内部低速时钟(LSPCLK)模式
- 配置:
SCLKME = 0, CLKSM = 0。这是复位后的默认状态。 - 原理与场景:此时SRG的输入时钟来源于芯片内部的低速外设时钟(LSPCLK)。LSPCLK通常由系统时钟(SYSCLK)分频得到,频率稳定且易于通过软件调整。这是最常用、最可靠的模式,适用于与芯片内部时钟同步的外设通信,例如与片外ADC/DAC进行音频数据传输。它的优势在于无需占用额外的外部引脚,且时钟完全由软件控制,相位噪声小。
2. 外部接收时钟(MCLKR)模式
- 配置:
SCLKME = 1, CLKSM = 0。 - 原理与场景:SRG的输入时钟来自
MCLKR引脚。这意味着整个McBSP(包括发送器)的时钟节拍都由一个外部主设备通过MCLKR引脚提供。这种模式通常用于“从设备(Slave)”配置。例如,当你的DSP板卡作为一个从设备,需要接收一个主处理器(如FPGA或另一颗DSP)提供的时钟和数据进行同步时,就采用此模式。此时,你的DSP的发送时序也必须严格跟随这个外部时钟。
3. 外部发送时钟(MCLKX)模式
- 配置:
SCLKME = 1, CLKSM = 1。 - 原理与场景:SRG的输入时钟来自
MCLKX引脚。这听起来有点反直觉:发送时钟引脚为何能作为整个SRG的源?这其实是一种灵活的“时钟回环”应用。典型场景是“主设备(Master)”配置,但时钟由外部晶振或时钟芯片直接驱动。你可以配置MCLKX引脚为输出,并驱动一个外部时钟源(如晶振缓冲器的输出),然后这个时钟信号再被McBSP通过MCLKX引脚采集回来,作为SRG的输入。这样,你既提供了系统主时钟,又保证了McBSP内部时钟与外部物理时钟的严格同步。
4. 保留模式
- 配置:
SCLKME = 0, CLKSM = 1。手册标注为“Reserved”。 - 实操注意:绝对不要使用此模式。在未定义的模式下,SRG的行为是不可预测的,可能导致通信彻底失败或产生难以排查的时序错误。
经验之谈:模式选择的决策树在实际项目中,我通常遵循这个简单的决策流程:
- 我的DSP是否需要控制通信节奏(作为Master)?
- 是-> 优先选择模式1(内部LSPCLK)。简单可靠。
- 否-> 进入下一步。
- 外部主设备是否提供了一个专用的接收时钟(MCLKR)?
- 是-> 选择模式2(外部MCLKR)。配置为Slave模式。
- 否-> 外部主设备可能只提供了数据线和帧同步,时钟需要你来回馈?考虑模式3(外部MCLKX)的特定应用,但更常见的是使用SPI模式(CLKSTP)。
2.2 SRG输入时钟极性(CLKXP/CLKRP)的精确设定
选定了时钟源,下一步是确定时钟的有效边沿。这是一个极易出错的细节,配置错误会导致数据采样错位一个时钟周期。
极性控制位的作用:
CLKXP(PCR[1]):当SRG时钟源来自MCLKX引脚(即SCLKME=1, CLKSM=1)时,此位决定哪个边沿触发CLKG/FSG的跳变。CLKXP = 0:MCLKX引脚的上升沿触发CLKG和FSG跳变。CLKXP = 1:MCLKX引脚的下降沿触发CLKG和FSG跳变。
CLKRP(PCR[0]):当SRG时钟源来自MCLKR引脚(即SCLKME=1, CLKSM=0)时,此位决定有效边沿。CLKRP = 0:MCLKR引脚的下降沿触发CLKG和FSG跳变。CLKRP = 1:MCLKR引脚的上升沿触发CLKG和FSG跳变。
为什么需要配置极性?这必须与通信对端设备的时序要求相匹配。以最常见的I2S音频协议为例,发送方通常在时钟的下降沿更新数据,接收方在随后的上升沿采样数据。如果你的McBSP作为I2S主设备(提供BCLK和LRCK),那么你需要确保内部生成的CLKG(对应BCLK)的边沿关系符合此规范。通过CLKXP的配置,你可以调整内部时钟相位与外部引脚输出相位的关系。
一个关键陷阱:很多人会混淆CLKXP/CLKRP与发送/接收数据时的时钟极性(CLKXP在PCR中还有另一重身份,用于控制发送时钟极性,但那是另一个上下文)。在SRG配置语境下,它们只影响SRG内部时钟生成器的触发边沿。而数据在引脚上的采样或驱动边沿,由发送时钟模式(CLKXM)和时钟停止模式(CLKSTP)等共同决定。务必根据当前配置的是SRG时钟源,来查阅对应的极性位。
避坑指南:极性配置的“对齐”思维我调试时序问题时,会使用示波器同时抓取
MCLKX/MCLKR、CLKG(可通过GPIO模拟输出查看)、FSX/FSR以及数据线。首先确认SRG的输入时钟(外部或内部)是否稳定。然后,重点观察CLKG的边沿与FSG脉冲的起始边沿是否严格对齐(或满足预期的延迟关系)。如果发现FSG脉冲的边沿没有对齐在CLKG的某个边沿上,首先检查的就是CLKXP或CLKRP的配置是否正确。记住一个原则:SRG输入时钟的“有效边沿”就是CLKG和FSG状态更新的时刻。
3. 发送器(Transmitter)系统化配置流程详解
配置发送器不是简单地填寄存器,而是一个有严格顺序的系统工程。手册中的步骤(复位->编程->使能)是骨架,我们需要填入血肉。
3.1 全局行为配置:搭建工作舞台
在配置具体的数据格式之前,需要先设定McBSP的全局工作环境。
1. 引脚功能复用(GPxMUXn)这是第一步,也是最容易遗忘的一步。TMS320F2837xS的引脚功能高度复用。你必须查阅芯片的DataSheet,找到对应McBSP模块(例如McBSP-A)的CLKX、FSX、DX等引脚,并将其对应的GPxMUXn寄存器位配置为McBSP功能模式(通常是模式1或2)。如果忘记这一步,无��内部寄存器如何配置,信号都无法输出到正确的物理引脚上。
2. 数字回环模式(DLB)SPCR1[15](DLB) 位。将此位置1,McBSP内部会将发送数据(DX)连接到接收数据(DR),发送帧同步(FSX)连接到接收帧同步(FSR),发送时钟(CLKX)连接到接收时钟(CLKR)。
- 用途:这是极其重要的自测试和调试工具。在开发初期,硬件连接尚未完成或需要验证配置是否正确时,开启数字回环模式。这样,你发送的数据会被自己立即接收回来。通过比较发送和接收的数据缓冲区,可以快速验证数据通路、时钟和帧同步配置是否正确,而无需依赖外部设备。
- 注意:在数字回环模式下,外部引脚上的信号可能无效或处于高阻态,具体取决于其他配置。
3. 时钟停止模式(CLKSTP)SPCR1[12:11](CLKSTP) 位。此模式专为SPI协议设计。
CLKSTP = 0Xb:禁用时钟停止模式,用于非SPI的正常McBSP操作(如I2S, TDM)。CLKSTP = 10b或11b:启用时钟停止模式,用于SPI主从通信。CLKSTP=10b表示时钟无延迟启动,11b表示有半周期延迟。具体与CLKXP、CLKRP配合,形成SPI的4种时钟模式(CPOL和CPHA)。如果你的应用不是SPI,务必将其保持为00b。
4. 发送多通道选择模式(XMCM)MCR2[1:0](XMCM) 位。McBSP强大之处在于支持多达128个时分复用(TDM)通道。此位决定哪些通道被启用或屏蔽。
XMCM = 00b:所有通道均启用且未屏蔽。最简单模式,适用于单通道或所有通道均需传输的场景。XMCM = 01b:所有通道默认禁用,只有在XCER(发送通道使能寄存器)中显式使能的通道才会被传输。适用于需要精确控制少数通道的场景。XMCM = 10b:所有通道默认启用但被屏蔽,只有在XCER中选中的通道才会被解除屏蔽并传输。适用于需要屏蔽少数通道的场景。XMCM = 11b:用于对称收发。发送通道的使能依赖于接收通道使能寄存器(RCER),而XCER仅用于解除屏蔽。这在全双工、通道一一对应的系统中非常高效。
3.2 数据格式配置:定义通信语言
这部分定义了“数据包”的具体结构,是协议匹配的核心。
1. 帧相位(XPHASE)与字长(XWDLEN1/2)
XCR2[15](XPHASE):决定帧是单相位(XPHASE=0)还是双相位(XPHASE=1)。单相位帧只有一个数据块,双相位帧包含两个连续但参数可以不同的数据块。例如,在音频中,一个帧(对应左右声道一个采样对)可以配置为双相位,相位1传输左声道(16位),相位2传输右声道(16位)。XCR1[7:5](XWDLEN1) 和XCR2[7:5](XWDLEN2):分别设置相位1和相位2的字长(每个采样数据的位数)。支持8, 12, 16, 20, 24, 32位。必须与外设的数据宽度严格匹配。例如,与一个16位ADC通信,字长应设为16位(010b)。
2. 帧长度(XFRLEN1/2)
XCR1[14:8](XFRLEN1) 和XCR2[14:8](XFRLEN2):这两个字段定义的是每个相位中包含的“字数”。这里有一个关键细节:编程值是“字数减1”。- 如果你想在相位1中传输8个数据字(例如,一个TDM时隙中有8个通道),那么你需要设置
XFRLEN1 = 7(8 - 1)。 - 最大可设置值为127,即一个相位最多128个字。
- 总帧长度 = (XFRLEN1 + 1) + (如果双相位,则加上 (XFRLEN2 + 1))。
- 如果你想在相位1中传输8个数据字(例如,一个TDM时隙中有8个通道),那么你需要设置
3. 数据压缩扩展(XCOMPAND)与位序
XCR2[4:3](XCOMPAND):用于选择µ-law/A-law压缩扩展模式,或LSB先传模式。00b:无压缩,MSB先传(最常见)。01b:无压缩,但8位数据LSB先传。这是用于某些特定8位协议(非标准SPI)的便捷功能。10b/11b:µ-law / A-law压缩。启用此功能时,必须将对应相位的字长(XWDLEN)设置为8位(000b)。硬件会自动完成16位线性PCM与8位压缩码之间的转换。
4. 数据延迟(XDATDLY)
XCR2[1:0](XDATDLY):定义帧同步脉冲有效后,延迟多少个位时钟才开始传输第一个数据位。通常设置为01b(1位延迟)。这是因为许多标准(如I2S)的帧同步信号(如LRCK)在变化后,需要等待一个BCLK周期才开始传输数据。10b(2位延迟)可用于跳过某些协议中的帧定位比特。
3.3 时钟与帧同步配置:指挥数据流
这是将SRG产生的节拍与数据流绑定的环节。
1. 发送时钟模式与极性
- 时钟模式:由
PCR中的CLKXM等位控制,决定CLKX引脚是输入(Slave)还是输出(Master),以及时钟来源。 - 时钟极性:
PCR中的CLKXP位(注意,此处的CLKXP与SRG配置中的同名位是同一个物理位,但含义取决于上下文)。在发送时钟配置中,它决定数据在CLKX的哪个边沿被驱动到DX引脚。CLKXP = 0:数据在CLKX的上升沿变化。CLKXP = 1:数据在CLKX的下降沿变化。- 必须与接收方(对端设备)的采样边沿匹配。通常遵循“发送在一边沿变化,接收在另一沿采样”的原则以避免建立保持时间冲突。
2. 发送帧同步模式(FSXM与FSGM)这是配置的另一个核心,决定了帧同步信号的来源。
PCR[11](FSXM):帧同步模式。FSXM = 0:外部帧同步。帧同步信号由外部设备通过FSX引脚提供。DSP作为Slave。FSXM = 1:内部帧同步。帧同步信号由McBSP内部产生。
SRGR2[12](FSGM):当FSXM=1时,此位选择内部帧同步的来源。FSGM = 0:帧同步由DXR到XSR的数据拷贝事件产生。每次CPU或DMA向发送数据寄存器(DXR)写入数据,并拷贝到发送移位寄存器(XSR)时,会产生一个脉冲。这适用于每个数据字都需要一个帧同步的非常规场景,或用于SPI主设备产生从设备使能信号(SPISTE)。FSGM = 1:帧同步由采样率生成器(SRG)产生的FSG信号提供。这是最常用的模式。FSG的频率由SRGR寄存器中的帧周期(FPER)和脉冲宽度(FWID)控制,可以产生非常精确的、周期性的帧同步信号,适用于I2S、TDM等标准协议。
3. 帧同步忽略(XFIG)
XCR2[2](XFIG):处理“意外”帧同步脉冲。XFIG = 0:如果在一个帧传输完成前出现新的帧同步脉冲,McBSP会认为发生同步错误(XSYNCERR位置1),并中止当前传输,重新开始发送当前字。这可以用于检测总线冲突或主设备失步。XFIG = 1:忽略意外的帧同步脉冲,继续完成当前帧的传输。在稳定的、由单一主设备控制的系统中,通常设置为1以避免不必要的错误中断。
3.4 复位与使能的严谨顺序
这是手册强调但实践中仍需小心的步骤。错误的顺序可能导致DMA无法响应或数据丢失。
- 整体复位:上电或初始化时,通过将
SPCR2中的XRST、GRST、FRST全部写0,将发送器、SRG和帧同步逻辑置于复位状态。 - 配置寄存器:在复位状态下,安全地配置所有上述寄存器(PCR, SRGR, XCR, SPCR等)。特别注意:配置涉及时钟分频的
SRGR寄存器时,必须在SRG复位(GRST=0)时进行。 - 使能SRG:将
GRST位写1,释放SRG复位。此时,如果已配置好时钟源和分频,CLKG开始运行。 - 使能帧同步:如果需要SRG产生FSG,将
FRST位写1。FSG将在(FPER+1)个CLKG周期后产生第一个脉冲。 - 使能发送器:最后,将
XRST位写1,使能发送器。关键点:如果使用DMA,务必在使能XRST之前完成DMA通道的配置和使能。因为XRST从0变1的瞬间,会立即产生一个XRDY(发送就绪)事件。如果DMA尚未就绪,这个边缘事件会被错过,导致DMA无法自动启动数据传输。
4. 实战配置案例:以I2S主发送模式为例
让我们以一个具体的例子串联所有知识点:将McBSP-A配置为I2S协议的主设备(Master),发送音频数据到外部编解码器。
假设条件:
- 系统低速时钟LSPCLK = 50 MHz。
- 目标音频采样率Fs = 48 kHz,位宽16位,立体声(左右声道)。
- I2S格式:字长16位,帧长32位(左16b + 右16b),左对齐(即帧同步改变后,延迟1位时钟开始传输数据),发送数据在BCLK的下降沿变化(编解码器在上升沿采样)。
配置步骤与计算:
引脚复用:配置GPIO对应
McBSP-A的CLKX(BCLK)、FSX(LRCK)、DX(DATA)引脚为McBSP功能。SRG时钟生成(产生主时钟BCLK):
- 目标串行位时钟BCLK = Fs * 帧长 * 2(因为I2S是左右声道各一字,每字16位,但通常BCLK = Fs * 64 = 48k * 64 = 3.072 MHz)。更通用地,BCLK = 采样率 * 每帧位数。对于立体声16位I2S,每帧32位,所以BCLK = 48k * 32 = 1.536 MHz。我们以此为例。
- 选择SRG输入时钟为LSPCLK(50 MHz)。
SCLKME = 0,CLKSM = 0。 - 计算分频系数CLKGDV:
CLKG频率 = 输入时钟频率 / (CLKGDV + 1)。我们需要CLKG = BCLK = 1.536 MHz。所以CLKGDV = (50e6 / 1.536e6) - 1 ≈ 31.5。取整为31或32。取CLKGDV = 31,则实际BCLK = 50e6 / (31+1) = 1.5625 MHz,误差可接受。将SRGR1[7:0](CLKGDV) 设置为31。 - 由于是内部时钟,
CLKXP/CLKRP在SRG上下文不适用(它们针对外部时钟源)。但CLKXP作为发送时钟极性位需要配置。
SRG帧同步生成(产生LRCK):
- 帧同步频率就是采样率Fs = 48 kHz。
- 帧同步脉冲宽度(FWID):I2S的LRCK是一个占空比50%的方波。一个帧周期包含32个BCLK。所以高电平宽度应为16个BCLK周期。
FWID = 脉冲宽度 - 1 = 16 - 1 = 15。设置SRGR2[7:0](FWID) = 15。 - 帧同步周期(FPER):
FPER = 帧周期 - 1 = 32 - 1 = 31。设置SRGR2[21:8](FPER) = 31。 - 设置
FSGM = 1,使用SRG产生FSG。
发送器全局与数据配置:
DLB = 0(禁用回环),CLKSTP = 00b(非SPI模式),XMCM = 00b(所有通道使能)。XPHASE = 1(双相位帧,对应左右声道)。XWDLEN1 = 010b(相位1字长16位),XWDLEN2 = 010b(相位2字长16位)。XFRLEN1 = 0(相位1包含1个字),XFRLEN2 = 0(相位2包含1个字)。因为I2S每帧就是左右各一个字。XCOMPAND = 00b(无压缩,MSB先传)。XDATDLY = 01b(1位数据延迟,符合I2S标准)。
发送器时钟与帧同步配置:
CLKXM = 1(CLKX引脚输出,作为主设备提供BCLK)。CLKXP = 1(关键:数据在BCLK的下降沿变化,以满足I2S接收方在上升沿采样的要求)。FSXM = 1(内部帧同步),FSGM = 1(由SRG产生,已在前面设置)。FSXP = 1?这取决于编解码器对LRCK极性的要求。通常I2S标准规定左声道为低电平。你需要查阅编解码器数据手册。假设编解码器要求左声道对应LRCK低电平,那么FSG(内部高有效)输出到引脚时需要反转,所以设置FSXP = 1。XFIG = 1(忽略意外帧同步)。
执行初始化序列:
// 1. 置于复位状态 McBspaRegs.SPCR2.bit.XRST = 0; McBspaRegs.SPCR2.bit.GRST = 0; McBspaRegs.SPCR2.bit.FRST = 0; // 2. 配置所有寄存器 (此处为示例,需按上述计算值填写) McBspaRegs.PCR.bit.CLKXM = 1; McBspaRegs.PCR.bit.FSXM = 1; McBspaRegs.PCR.bit.FSXP = 1; McBspaRegs.PCR.bit.CLKXP = 1; McBspaRegs.SRGR1.bit.CLKGDV = 31; // 分频系数 McBspaRegs.SRGR2.bit.FPER = 31; // 帧周期 McBspaRegs.SRGR2.bit.FWID = 15; // 脉冲宽度 McBspaRegs.SRGR2.bit.FSGM = 1; McBspaRegs.SRGR2.bit.CLKSM = 0; McBspaRegs.PCR.bit.SCLKME = 0; // ... 配置XCR1, XCR2等 // 3. 使能SRG (先于FRST) McBspaRegs.SPCR2.bit.GRST = 1; // 4. 使能帧同步生成 McBspaRegs.SPCR2.bit.FRST = 1; // 5. (如果使用DMA,在此处完成DMA配置) // 例如:配置DMA通道,指向McBSP的DXR地址,设置传输计数等。 // 6. 最后使能发送器 McBspaRegs.SPCR2.bit.XRST = 1;
5. 常见问题排查与调试心得
即使按照手册和示例配置,在实际硬件调试中仍会遇到各种问题。以下是我总结的常见故障排查清单:
问题1:完全没有信号输出。
- 检查顺序:
- 引脚复用:确认
GPxMUXn寄存器已正确配置为McBSP功能。这是最常被忽略的一步。 - 电源与时钟:确认DSP核心和外设时钟已使能,LSPCLK频率符合预期(通过
PCLKCR0等寄存器)。 - 复位状态:确认在配置期间
XRST/GRST/FRST处于复位(0),配置完成后已正确使能(1)。特别是GRST和FRST的顺序。 - 寄存器写入:在C代码中,确保对McBSP寄存器的写操作真正执行了(检查编译优化级别,必要时使用
McBspaRegs.SPCR2.all = value;这样的整体赋值,或插入asm(“ NOP”))。
- 引脚复用:确认
问题2:有时钟(BCLK)输出,但没有帧同步(LRCK)或数据(DATA)。
- 检查顺序:
- 帧同步模式:确认
FSXM=1且FSGM=1(如果使用SRG产生)。如果FSGM=0,则需要向DXR写数据才能触发FSX脉冲。 - SRG配置:检查
FPER和FWID值是否合理。FPER为0会导致帧同步频率极高。 - 发送器使能:确认
XRST=1。 - DMA/CPU数据供给:如果使用DMA,确认DMA已正确配置并启动,且源数据缓冲区非空。如果使用CPU轮询,检查
XRDY位是否置1,并在置1后及时向DXR写入数据。
- 帧同步模式:确认
问题3:数据时序不对,编解码器收不到正确数据。
- 检查顺序:
- 时钟极性
CLKXP:这是I2S/左对齐/右对齐格式的关键。用示波器同时测量BCLK和DATA。根据协议规定,数据应在BCLK的某个边沿保持稳定,在另一个边沿变化。调整CLKXP直至匹配。 - 帧同步极性
FSXP:测量LRCK。确认其高低电平对应的声道是否符合编解码器要求。不符合则翻转FSXP。 - 数据延迟
XDATDLY:测量LRCK变化后,数据是从第几个BCLK开始有效的。I2S标准是1位延迟。如果不是,调整XDATDLY。 - 字长
XWDLEN:确保与编解码器设置的位宽一致。16位音频就是16位。
- 时钟极性
问题4:通信不稳定,偶尔出现数据错位或丢失。
- 检查顺序:
- 时钟抖动:测量BCLK的时钟质量,看是否有过大的抖动。如果使用内部LSPCLK,检查其源(PLL)是否稳定。
- 中断与DMA:如果使用中断或DMA,检查服务程序或DMA传输完成中断是否及时响应,缓冲区管理是否得当,有无溢出或下溢。
- 同步错误:检查
SPCR2中的XSYNCERR位是否被置位。如果被置位,考虑是否因干扰产生了意外帧同步,并根据需要调整XFIG位或检查硬件连接。 - 多通道屏蔽:如果使用了多通道模式(
XMCM非00),仔细检查XCER寄存器的每一位,确保需要传输的通道已被正确使能或解除屏蔽。
调试心得:善用数字回环与信号测量在硬件连接前,务必先开启数字回环模式(DLB=1)进行自测试。编写一个简单的程序,让CPU循环发送一个递增的测试数据模式,并同时接收。在内存中比较发送和接收缓冲区。如果数据完全一致,证明McBSP内核的配置、数据通路和DMA/CPU接口是正确的。这样可以迅速将问题隔离到外部硬件连接或电平匹配上。
在硬件调试时,一台带有数字解码功能的示波器是必不可少的。设置好对I2S或SPI协议的解码,可以直观地看到数据值、帧同步和时钟的关系,极大提升调试效率。首先确保BCLK和LRCK的频率、占空比符合预期,然后再观察数据时序是否正确对齐。