深入解析TMS320F2837xD的McBSP发送中断机制与配置实战

📅 2026/7/22 18:14:58 👁️ 阅读次数 📝 编程学习
深入解析TMS320F2837xD的McBSP发送中断机制与配置实战

1. McBSP发送中断机制深度解析

在TMS320F2837xD这类高性能数字信号处理器(DSP)的嵌入式开发中,多通道缓冲串行端口(McBSP)是实现高速、可靠串行通信的核心外设。它不仅仅是简单的串口,而是一个集成了复杂时序控制、多通道管理和数据缓冲的专业级通信引擎。对于需要处理音频流、调制解调器数据或工业现场总线协议的工程师来说,深入理解其发送中断(XINT)的生成机制,是构建高效、稳定数据链路的关键。很多开发者初次接触McBSP时,往往只关注基本的收发功能,对中断配置一知半解,结果在实际项目中遇到数据丢失、时序错乱或CPU负载过高等问题。今天,我就结合手册中的寄存器细节和十多年的实战经验,把McBSP发送中断那点事儿彻底讲透,让你不仅能配置,更能理解其背后的设计逻辑和避坑要点。

发送中断的本质,是让硬件在特定事件发生时主动通知CPU或DMA控制器:“我这里有个情况需要你处理一下”。这避免了CPU不断轮询状态位的低效操作,将宝贵的计算资源留给真正的算法任务。McBSP的发送中断机制设计得非常灵活,它允许你根据应用场景,选择在四种不同的事件下触发中断:数据就绪(XRDY)、块传输完成(EOBX)、帧同步信号到达(FSX)或帧同步错误(XSYNCERR)。这种灵活性是一把双刃剑,配置得当能极大提升系统效率,配置不当则可能引入难以调试的时序问题。

整个中断生成路径可以看作一个精密的逻辑电路。其核心是SPCR2(Serial Port Control Register 2)寄存器中的XINTM(Transmit Interrupt Mode)位域(第5-4位)。这两位像一个“事件选择器”,决定了哪个硬件事件能最终通向中断输出。但光有事件选择还不够,路径上还有一个总开关——XINTENA位(虽然手册图表中标注,但需注意在F2837xD中,中断使能通常由外设级使能位和PIE模块共同控制,具体需查阅芯片手册的PIE章节)。只有当事件选择器指向了某个已发生的事件,并且总开关是打开的,中断信号XINT(到CPU)和MXINT(到DMA)才会被激活。理解这个“选择-使能-触发”的链条,是掌握McBSP中断配置的第一课。

1.1 四种中断源及其应用场景剖析

手册中的图21-66和表21-73清晰地展示了四种中断源。我们不仅要记住它们的名字,更要理解每种模式适用的场景,这是做出正确设计选择的基础。

XRDY模式(XINTM = 00b):这是最常用、最直观的模式。当发送数据寄存器(DXR)中的数据被成功搬运到发送移位寄存器(XSR)中,准备发送下一个字时,XRDY标志位会从0变为1。如果此时XINTM设置为00,这个上升沿就会触发一个发送中断。你可以把这个过程想象成厨房的传菜口:厨师(CPU/DMA)把做好的菜(数据)放到传菜台(DXR)上,然后按一下铃(XRDY变1)。服务员(中断服务程序)听到铃声,就知道可以来取走这道菜(把新数据写入DXR),并准备下一道。这种模式适用于流式数据传输,比如连续不断的音频采样发送,它能确保数据寄存器永远不会“空转”,实现最高的吞吐率。

EOBX模式(XINTM = 01b):这个模式专为多通道操作设计。在多通道模式下,一个数据帧被划分为多个时隙(通道),例如128个通道。EOBX(End Of Block)事件在每个16通道块的边界处产生。假设你配置为使用32个通道(即2个块),那么每传输完16个通道的数据(一个块),就会产生一次中断。这有什么用呢?在电信的TDM(时分复用)系统中,不同的通道可能承载不同的语音通话或数据流。使用EOBX中断,你可以在每个块传输结束后,有机会动态地更新下一个块中各个通道的使能状态或数据源,实现灵活的通道管理。相比于每个字都中断一次(XRDY模式),它大大降低了中断频率,适合对实时性要求稍低但通道配置复杂的场景。

FSX模式(XINTM = 10b):此模式下,每次检测到帧同步信号(FSX)就会产生中断,无论发送器是否处于复位状态。帧同步信号标志着一帧数据的开始。这个模式特别适合需要严格帧级控制的应用。例如,在某些工业通信协议中,每一帧的开头可能需要插入特定的同步头或控制字。通过FSX中断,你可以在每一帧开始时,精确地写入帧头数据到DXR,确保它作为该帧的第一个字被发送出去。它给了你一个在“帧边界”进行处理的钩子(hook)。需要注意的是,如果帧率很高,此模式可能产生密集的中断,需要评估CPU的中断处理能力。

XSYNCERR模式(XINTM = 11b):这是一种错误处理模式。当发送器检测到非预期的帧同步信号(例如,在当前帧还未传输完时就收到了下一个帧同步)时,XSYNCERR标志位会被置位。如果XINTM设置为11,这个错误事件将立即触发中断。在噪声环境或主从设备时钟不同步的系统中,帧同步错误可能导致数据错位。使用此中断模式,可以让系统快速响应错误,进行错误计数、重同步或告警,而不是等到数据完全混乱后才被发现。它相当于一个安全哨兵。

1.2 中断信号的双重路径:CPU与DMA

McBSP模块很贴心地为同一中断事件提供了两路输出信号:XINT通向CPU,MXINT通向DMA控制器。这意味着你可以根据数据搬运策略,灵活选择中断的处理者。

  • CPU中断路径:当选择的事件发生且中断使能时,XINT信号会发送到CPU的中断系统。你需要在外设级(如SPCR2的相关使能)、PIE(外设中断扩展器)级和CPU级(IER寄存器)都正确使能该中断,并编写对应的中断服务函数(ISR)。在ISR中,你通常需要检查状态位(如XRDY),然后向DXR写入下一个要发送的数据。这种方式灵活,但会占用CPU时间。
  • DMA事件路径:MXINT信号被映射为DMA的同步事件(例如XEVT)。你可以配置DMA控制器,在接收到此事件时,自动从内存中读取一个数据字并写入McBSP的DXR寄存器。这实现了数据搬运的完全硬件自动化,CPU在整个发送过程中无需干预,极大地解放了CPU资源,适用于大数据量、高带宽的传输场景。在实际项目中,我强烈建议在数据流稳定且数据量大的场合优先使用DMA,它带来的性能提升是数量级的。

理解这两条路径,就能理解手册中“One set is used for the CPU and the other set is for DMA”这句话的深层含义:它赋予了系统架构师根据实时性要求和CPU负载进行优化的权力。

2. 核心寄存器SPCR2的逐位精讲

配置发送中断,主战场就在SPCR2寄存器。这个寄存器好比McBSP发送部分的“神经中枢”,控制着复位、状态、中断模式等关键功能。我们结合表21-83,把每个相关位掰开揉碎了讲。

XRST(位0,发送器复位):这是发送通道的总开关。XRST=0时,发送器处于复位状态,时钟停止,所有状态机清零。XRST=1时,发送器被使能,开始等待帧同步信号以启动传输。一个至关重要的实操细节:在初始化McBSP时,必须确保在配置其他控制寄存器(如RCR2、XCR2、SRGR等)时,保持XRST=0。只有在所有参数配置完毕后,最后才将XRST置1。顺序错了,可能导致配置无法正确加载或产生不可预知的行为。

XRDY(位1,发送器就绪):这是一个只读状态位。它是最核心的“数据需求”指示器。当XRDY=1时,表明DXR寄存器已空,可以(并且需要)写入新的发送数据了。其置位时机是:当DXR中的数据被拷贝到XSR的那一刻。这里有一个极易踩坑的地方:对于字长大于16位的数据(例如24位音频数据),需要使用DXR2和DXR1两个寄存器。手册明确提示,必须先写DXR2(高16位),再写DXR1(低16位)。写入DXR1的操作会触发DXR到XSR的拷贝动作,并清除XRDY位。如果顺序颠倒,XSR将使用旧的DXR2值,导致数据错误。

XEMPTY(位2,发送器空):这也是一个只读状态位。它指示了一个更“紧急”的状态:发送移位寄存器(XSR)已经移空了当前字的所有位,但DXR里还没有新数据补充进来(即XRDY=0且XSR已空)。此时XEMPTY=0。在正常连续传输中,我们应该通过及时响应XRDY中断来避免XEMPTY状态。一旦出现XEMPTY,发送引脚(DX)将输出默认值(通常为0),造成数据流中出现非预期的间隙。在调试时,监控XEMPTY位有助于判断数据供应是否及时。

XSYNCERR(位3,发送帧同步错误):这是一个可读可写的状态/标志位。当发送器检测到非预期的帧同步脉冲时,此位被硬件置1。非预期帧同步是指:在当前帧数据尚未完全移出时,又来了一个新的FSX脉冲。你可以通过软件写0来清除此标志。关键点在于:如果XINTM=11b,那么XSYNCERR被置位的同时就会产生中断。否则,它只是一个需要轮询查询的状态位。在噪声敏感的环境中,启用此中断进行快速错误恢复是明智之举。

XINTM(位5-4,发送中断模式):我们已经详细讨论了它的四种模式(00, 01, 10, 11)。配置时直接写入对应的2位二进制值即可。切换模式需要注意时机:最好在发送器复位(XRST=0)或确定无数据传输时进行修改,避免在传输中途改变模式导致中断行为紊乱。

GRST(位6,采样率生成器复位) & FRST(位7,帧同步逻辑复位):这两个位控制着McBSP内部的时钟和帧同步生成引擎。GRST是采样率生成器(产生内部时钟CLKG)的复位,FRST是帧同步生成逻辑(产生内部帧同步FSG)的复位。它们的复位状态都是0(低有效)。初始化顺序通常是:先保持GRST=FRST=0,配置好采样率生成器寄存器(SRGR1/2),然后置GRST=1启动时钟,等待至少2个CLKG周期稳定后,再置FRST=1启动帧同步。这个“先时钟后同步”的顺序必须遵守。

FREE、SOFT(位9、8):这两个位与仿真调试有关。当你在调试器中设置断点时,FREESOFT决定了McBSP时钟的行为。FREE=1则全速运行,不受断点影响;FREE=0时,由SOFT决定:SOFT=0立即停止,SOFT=1则完成当前传输后再停止。在调试实时音频或通信应用时,合理设置这两个位可以避免断点导致的数据流断裂。

2.1 配置流程与避坑指南

基于以上分析,一个稳健的发送中断初始化流程如下:

  1. 全局禁用中断:在CPU的IER寄存器中,暂时屏蔽对应中断线,防止配置过程中产生意外中断。
  2. 复位发送器与时钟:设置SPCR2.XRST = 0SPCR2.GRST = 0SPCR2.FRST = 0。让整个发送通道和时钟源处于确定状态。
  3. 配置通信参数:在发送器复位状态下,安全地配置其他所有寄存器:
    • RCR1/RCR2XCR1/XCR2:设置字长、帧长、压扩模式、数据延迟等。
    • SRGR1/SRGR2:设置采样率生成器的时钟分频(CLKGDV)、帧周期(FPER)、脉冲宽度(FWID),并选择时钟源(CLKSM)。
    • PCR:配置引脚功能(如FSXM, CLKXM决定帧同步和时钟由内部产生还是外部输入)、极性(FSXP, CLKXP)。
    • MCR1/MCR2:如果使用多通道模式,在此配置分区和通道使能。
    • SPCR1:配置接收部分参数(如接收中断模式RINTM)和数字回环等。
  4. 配置中断模式:将SPCR2.XINTM设置为所需模式(例如00b代表XRDY中断)。
  5. 启动时钟:置SPCR2.GRST = 1,启动采样率生成器。如果需要内部生成帧同步,则继续下一步。
  6. 启动帧同步:如果需要内部帧同步,置SPCR2.FRST = 1
  7. 使能发送器:最后,置SPCR2.XRST = 1,释放发送器。此时,发送器将根据PCR的配置,开始等待内部或外部的帧同步信号。
  8. 使能中断:在PIE和CPU的IER寄存器中,使能对应的McBSP发送中断。如果使用DMA,则配置DMA通道,将MXINT事件作为同步源。

避坑要点

  • 顺序是王道:务必遵循“复位 -> 配参 -> 启动时钟 -> 启动同步 -> 使能模块 -> 使能中断”的顺序。
  • 时钟同步等待:在置位GRSTFRST后,软件需要等待至少2个CLKG周期(如果使用内部时钟)或2个外部时钟周期,以确保内部逻辑稳定。简单的做法是执行几条空操作(NOP)指令或进行短延时。
  • 多通道模式下的中断选择:在多通道模式下,如果选择EOBX中断(XINTM=01b),务必清楚你的通道分区(由MCR2.XPABLK/XPBBLK或MCR1.RPABLK/RPBBLK定义)以及每个块包含的通道数(固定为16),以确保中断频率符合预期。
  • 错误处理:即使你不使用XSYNCERR中断,也建议在初始化流程的最后、使能发送器之前,先读取并清除一次XSYNCERR位,以消除任何可能因上电或复位残留的虚假错误标志。

3. 实战:以外部设备为帧同步主设备的初始化特例

手册第21.14节专门讨论了一个非常经典且容易出错的场景:当外部设备(如音频编解码器)作为帧同步主设备(Master),而McBSP作为从设备(Slave)时,如何确保第一帧数据的正确发送。这个问题是很多工程师的“噩梦”,数据流总是莫名其妙地错位一个单词。

3.1 问题根源:首帧数据竞争

FSXM=0(FSX由外部输入)且XRST从0变为1后,发送器立即进入等待状态,期盼第一个外部FSX脉冲的到来。一旦FSX到来,无论DXR中是否有有效数据,发送器都会立即开始将XSR中的数据移出到DX引脚。问题在于:在XRST使能后到第一个FSX到来的这个时间窗口可能极短,CPU或DMA可能来不及将第一个数据字写入DXR。此时,XSR中装载的是默认值(通常是0或复位值),导致发送的第一帧第一个字是无效数据,整个数据流从此错位。

3.2 解决方案:延迟使能发送器

手册提供的解决方案非常巧妙:利用FSX本身来触发发送器的使能。具体步骤如下,我将其转化为可操作的代码逻辑:

  1. 保持发送器复位:初始化时,配置FSXM=0(外部FSX),但保持XRST=0。同时,将XINTM设置为10b(FSX检测中断)。注意:此时先不要使能CPU的XINT中断(即不在IER中置位)。
  2. 完成其他所有配置:如前所述,配置好引脚、时钟、字长、帧长等参数。
  3. 同步与错误清除:等待时钟稳定,并执行一个清除潜在XSYNCERR的步骤(即先置XRST=1,短暂等待,再置XRST=0)。
  4. 准备数据服务:如果使用DMA,此时启动DMA;如果使用CPU,则准备好第一个数据。
  5. 使能FSX中断:在CPU的IER寄存器中,使能McBSP发送中断。关键点:此时XRST仍为0,发送器处于复位状态,不会发送任何数据。
  6. 中断服务程序(ISR)中的操作:当第一个外部FSX到来时,由于XINTM=10b,即使XRST=0也会产生中断。在这个ISR中,你必须按顺序做两件事: a.修改中断模式:将XINTM改为正常操作所需的模式(例如00b用于XRDY中断)。如果后续打算用轮询,则在此禁用McBSP中断。 b.使能发送器:置XRST=1。至此,发送器才真正开始工作。
  7. 服务数据寄存器:在退出这个ISR后,CPU应立即或在下一个XRDY中断中,向DXR写入第一个有效数据字。
  8. 捕获第二帧:当第二个外部FSX到来时,此时DXR中已经准备好了第一个数据字,发送器会将其正确移出。数据流从第一帧的第一个字开始就是正确的。

这个过程的精妙之处在于,它利用第一个FSX作为“唤醒”信号,并利用第一个FSX到第二个FSX之间的整个帧周期作为“准备数据”的缓冲时间,完美避开了数据竞争窗口。

3.3 代码示例与思考

下面是一个简化的伪代码示例,展示如何实现上述逻辑:

// 步骤1-4:初始化配置(发送器保持复位) void McBSP_ExternalFSMaster_Init(void) { // 1. 禁止全局中断 DINT; // 2. 确保发送器、采样率生成器、帧同步逻辑复位 SpcRegs.SPCR2.bit.XRST = 0; SpcRegs.SPCR2.bit.GRST = 0; SpcRegs.SPCR2.bit.FRST = 0; // 3. 配置其他寄存器 (示例) SpcRegs.PCR.bit.FSXM = 0; // FSX 外部输入 SpcRegs.PCR.bit.CLKXM = 0; // CLKX 外部输入(假设时钟也来自外部) SpcRegs.RCR2.bit.RPHASE = 0; // 单相帧 SpcRegs.RCR2.bit.RFRLEN1 = 0; // 每帧1个字 SpcRegs.RCR2.bit.RWDLEN1 = 2; // 字长16位 SpcRegs.XCR2.bit.XPHASE = 0; SpcRegs.XCR2.bit.XFRLEN1 = 0; SpcRegs.XCR2.bit.XWDLEN1 = 2; // 4. 配置为FSX检测中断模式,但发送器仍复位 SpcRegs.SPCR2.bit.XINTM = 2; // 10b, FSX检测中断 // 5. (可选)清除可能存在的虚假同步错误 SpcRegs.SPCR2.bit.XRST = 1; DELAY_US(1); // 短暂等待,几个时钟周期即可 SpcRegs.SPCR2.bit.XRST = 0; // 6. 如果使用DMA,在此配置并启动DMA(略) // 7. 准备第一个数据到内存缓冲区(略) // 8. 使能PIE和CPU级的中断(但发送器仍未启动) // 假设McBSP发送中断对应INTx.y PieCtrlRegs.PIEIERx.bit.INTy = 1; // 使能PIE组内中断 IER |= M_INTx; // 使能CPU级中断 EINT; // 开启全局中断 // 此时,程序等待第一个外部FSX的到来,并触发中断 } // 步骤6:第一个FSX的中断服务程序 __interrupt void McBSP_TX_FSX_First_ISR(void) { // a. 修改中断模式为正常数据就绪模式 SpcRegs.SPCR2.bit.XINTM = 0; // 00b, XRDY中断 // b. 使能发送器! SpcRegs.SPCR2.bit.XRST = 1; // c. (如果是CPU中断模式)立即写入第一个数据 // 注意:如果字长>16位,先写DXR2,再写DXR1 // SpcRegs.DXR2.all = first_data_high; // SpcRegs.DXR1.all = first_data_low; // d. 清除中断标志(根据具体的中断标志寄存器操作) // 例如:SpcRegs.xxx = ... 或 PieCtrlRegs.PIEACK.bit.ACKx = 1; // 退出中断,等待第二个FSX和数据传输 }

4. 多通道模式下的中断与寄存器配置

McBSP的强大之处在于其多通道能力,最多可支持128个独立的时分复用通道。与此相关的寄存器主要是MCR1(接收多通道控制)、MCR2(发送多通道控制)以及一系列XCERx/RCERx(通道使能)寄存器。

4.1 模式选择与分区管理

  • XMCM/RMCM(发送/接收多通道选择模式):这两位是总开关。XMCM=0/RMCM=0时,所有通道自动使能,无需配置XCER/RCER。XMCM=110b11b时,进入多通道选择模式,需要通过XCER寄存器来精细控制每个通道的使能/屏蔽。
  • XMCME/RMCME(发送/接收扩展模式):这决定了是使用2分区(32通道)还是8分区(128通道)模式。XMCME=0为2分区,只使用A、B两个分区(对应XCERA/XCERB)。XMCME=1为8分区,使用A到H八个分区(对应XCERA到XCERH)。接收端RMCME同理。
  • XPABLK/XPBBLK(发送分区A/B块选择):在2分区模式下,你需要指定哪两个16通道的“块”分别属于分区A和B。例如,设置XPABLK=0(块0,通道0-15),XPBBLK=1(块1,通道16-31)。XCERA的16个位就对应控制分区A(块0)的16个通道,XCERB对应控制分区B(块1)的16个通道。
  • XCBLK/RCBLK(当前块指示):这是一个只读状态位,实时指示当前正在传输或接收的是哪个16通道块(0-7)。在动态切换通道使能的应用中,这个位非常有用。

4.2 多通道中断配置实战

在多通道模式下配置中断,需要将通道管理与中断事件结合起来。

  1. 配置为EOBX中断:如果你希望在每个16通道块传输完成时得到通知,以便动态更新下一个块的通道使能表,那么应将XINTM设置为01b。中断服务程序中,你可以读取XCBLK的值,知道是哪个块传输完了,然后为下一个要传输的块更新XCERx寄存器的值。这里有一个重要的时序:更新通道使能寄存器的操作,必须在下一个块的传输开始前完成。通常可以在当前块的中断服务程序中,提前更新下一个块对应的XCERx寄存器。
  2. 结合XRDY中断:即使是在多通道模式下,你也可以使用XINTM=00b(XRDY中断)。此时,中断会在每个字传输完成后产生。这对于需要为每个通道实时提供不同数据的应用是必要的,但中断频率会很高(128通道帧就是每秒128*帧率次中断),对CPU压力大,此时更应考虑使用DMA。
  3. 使用DMA配合多通道:这是最理想的方案。将XINTM设置为00b01b,让McBSP产生XRDY或EOBX事件触发DMA。DMA控制器可以配置为多通道循环模式,从一个包含所有通道数据的大缓冲区中,根据当前XCBLK的值自动索引到正确的数据地址进行搬运。这完全解放了CPU。

4.3 通道使能寄存器(XCERx/RCERx)操作详解

以XCERA为例,它是一个16位寄存器,每一位控制一个通道的使能与屏蔽。其具体含义取决于XMCM的模式:

  • XMCM=01b:所有通道默认禁用。XCERA.bit.CEx = 1使能并解除屏蔽对应通道;=0则禁用并屏蔽。
  • XMCM=10b:所有通道默认使能但被屏蔽(数据不会发出)。XCERA.bit.CEx = 1解除屏蔽对应通道;=0则保持屏蔽。
  • XMCM=11b(对称收发):通道的使能由接收通道使能寄存器(RCERx)决定,但发送还需要XCERx来解除屏蔽。XCERA.bit.CEx = 1解除发送屏蔽;=0则屏蔽发送,即使接收使能了该通道。

操作心得:在修改通道使能寄存器时,最好在一个通道块的非活动期进行。可以通过检查XCBLK的值,确保不是在修改当前正在传输的块对应的使能寄存器,避免出现传输数据错乱。

5. 常见问题排查与调试技巧

即使理解了所有原理,实际调试McBSP时还是会遇到各种问题。下面是我总结的几个典型问题及排查思路。

5.1 问题一:没有中断产生

  • 检查清单
    1. 中断使能链:这是最常见的原因。确认三层使能:SPCR2中的相关模式已设(XINTM),PIE模块中对应外设的中断已使能(PIEIER),CPU总中断已使能(IER和INTM位)。
    2. 发送器状态XRST是否已置1?XRDY是否为1(如果等待数据)?用仿真器或读取SPCR2寄存器确认。
    3. 事件是否发生:如果你配置的是XRDY中断,是否已经向DXR写了数据触发了DXR->XSR的拷贝?如果你配置的是FSX中断,外部FSX信号是否真的来了?用示波器测量FSX引脚。
    4. 时钟与帧同步:CLKX��FSX信号是否正常?没有时钟,数据不会移动,状态不会改变。没有帧同步,传输不会开始。
    5. 中断标志:有些架构中,需要手动清除外设中断标志位(PIEIFR)或向PIEACK写1来应答中断。查看手册确认。

5.2 问题二:数据错位或丢失

  • 检查清单
    1. 字长和帧长配置XWDLENXFRLEN是否与对方设备匹配?XFRLEN写入的值是“字数-1”。
    2. 数据延迟(XDATDLY):通常设置为1-bit delay(即1个时钟周期后开始发数据),这是最常用的。0延迟可能导致与帧同步边沿冲突,2延迟可能不符合某些协议。
    3. 时钟极性(CLKXP/CLKRP):发送和接收设备的时钟极性(在哪个边沿采样数据)必须匹配。一个在上升沿发,另一个必须在上升沿收。
    4. 帧同步极性(FSXP/FSRP):帧同步的有效电平(高有效或低有效)必须匹配。
    5. 多通道配置:如果只使能了部分通道,确保你写入DXR的数据速率与你使能的通道速率一致。例如,一帧128个通道,但只使能了第0和第64通道,那么你只需要在每帧的这两个时隙写入数据,其他时隙的数据不会被发送。
    6. DMA覆盖:如果使用DMA,检查DMA的传输缓冲区和传输次数配置是否正确,避免DMA覆盖了还未发送的数据。

5.3 问题三:使用DMA时数据发送不连续

  • 检查清单
    1. DMA同步事件:确保DMA配置为由McBSP的XEVT(对应MXINT)事件触发。
    2. DMA传输大小:DMA的传输数据单元(一个字)必须与McBSP的字长一致。
    3. DMA与McBSP的缓冲协调:DMA的写入目标地址是McBSP的DXR寄存器地址。确保DMA的写入速度能跟上McBSP的发送速度。如果DMA一次搬运一个数据块后停止,而McBSP需要连续数据流,则需要配置DMA为自动重载(Ping-Pong模式或连续模式)。
    4. 中断与DMA的优先级:如果同时使用了CPU中断和DMA,确保它们的优先级设置合理,避免DMA访问被中断服务程序长时间阻塞。

5.4 调试工具与技巧

  1. 寄存器查看:在调试器中实时监控SPCR2、SPCR1等关键寄存器,观察XRDY、XEMPTY、XSYNCERR等状态位的变化。
  2. 引脚信号测量:使用示波器或逻辑分析仪,同时抓取CLKX、FSX、DX三条信号线。这是定位时序问题的终极手段。你可以清晰地看到帧同步、时钟边沿和数据位之间的关系。
  3. 数据回环测试:将McBSP配置为数字回环模式(SPCR1.DLB=1),自己发,自己收。这可以排除外部设备的问题,快速验证McBSP自身的配置和软件数据流是否正确。
  4. 简化测试:先从最简单的配置开始:单相帧、单字、内部时钟和帧同步。测试通过后,再逐步增加复杂度,如改为外部时钟、多字、多通道等。