TMS320C6746 McASP与McBSP串行接口配置详解与实战指南

📅 2026/7/15 8:10:47 👁️ 阅读次数 📝 编程学习
TMS320C6746 McASP与McBSP串行接口配置详解与实战指南

1. 项目概述与核心价值

在嵌入式音频处理、工业通信或者任何需要高速、多通道串行数据交换的DSP项目中,TMS320C6746McASPMcBSP是两个绕不开的核心外设。我接触过不少基于这颗芯片的音频编解码器、数字音频矩阵和工业控制板卡,发现很多工程师拿到芯片手册后,面对动辄几十页的寄存器描述和时序图,往往感到无从下手,配置过程充满了“玄学”色彩——代码能跑通,但说不清为什么;时序偶尔出错,排查起来像大海捞针。

这篇文章,我就结合自己踩过的坑和项目经验,把这两个串行接口从“黑盒”变成“透明盒”。我们不止看手册上冰冷的寄存器列表和时序参数,更要深挖其设计逻辑、配置策略,以及在实际硬件调试中那些手册不会告诉你的“潜规则”。无论是刚接触C6746的新手,还是想优化现有设计的老手,都能从中找到直接可用的配置思路和避坑指南。McASP和McBSP绝不仅仅是地址不同的寄存器集合,理解它们,是释放这颗高性能DSP数据吞吐能力的关键。

2. 接口架构深度解析:McASP与McBSP的设计哲学

为什么C6746要同时提供McASP和McBSP两种串行接口?这并非简单的功能堆砌,而是TI针对不同应用场景的精准设计。理解它们的设计初衷,是正确选型和配置的第一步。

2.1 McASP:为高保真音频而生的专业接口

McASP的全称是Multichannel Audio Serial Port,顾名思义,它是为多通道、高质量音频流传输量身定制的。它的设计哲学是“灵活与精确”

  • 核心特性与适用场景
    • 独立时钟域:接收器(Receiver)和发送器(Transmitter)拥有完全独立的时钟(ACLKR, ACLKX)和帧同步(AFSR, AFSX)信号生成与控制逻辑。这意味着你可以轻松实现全双工、不同采样率的异步音频流传输。例如,从ADC以48kHz接收音频的同时,向DAC发送一个44.1kHz的音频流,两者互不干扰。
    • 强大的格式单元:通过RFMTXFMT寄存器,你可以对接收和发送的数据流进行极其精细的位级操作,包括位序调整(MSB/LSB first)、位扩展、符号扩展、数据延迟等。这对于对接各种非标准或自定义音频格式的编解码器至关重要。
    • 时分复用(TDM)支持:这是McASP的看家本领。通过RTDMXTDM寄存器,你可以灵活地将多达32个时隙(Slot)分配给最多16个串行器(Serializer)。这使得单个物理数据引脚(如AXR0)能够传输多达16个独立的音频通道(在TDM256模式下甚至更多),极大地节省了芯片引脚和PCB走线资源,是构建多通道音频系统的基石。
    • 数字音频接口传输(DIT)模式:专为传输S/PDIF或AES/EBU等消费级和专业级数字音频流而设计。在此模式下,McASP会自动插入通道状态位、用户数据位和校验位,你只需要关心音频数据本身。

实操心得:在配置多通道TDM时,最常见的错误是时隙(Slot)和串行器(Serializer)的映射关系没搞清。记住一个核心原则:RTDM/XTDM寄存器中的每一位(bit)对应一个时隙(0-31),该位为1表示当前串行器在此刻(该时隙)是激活的。你需要根据音频数据在TDM帧中的位置,来正确设置这些位。

2.2 McBSP:通用且稳健的同步串行接口

McBSP的全称是Multichannel Buffered Serial Port。它的设计哲学更偏向“通用与高效”,是DSP领域经典的串行接口,应用范围远超音频。

  • 核心特性与适用场景
    • 高度可编程的采样率发生器(SRGR):这是McBSP的灵魂。通过配置SRGR寄存器中的CLKGDV分频器,你可以从内部或外部参考时钟(CLKS)灵活地生成所需的位时钟(CLKX/CLKR)和帧同步信号(FSX/FSR)。这种设计使其能轻松适配各种非标准速率的串行设备。
    • 灵活的数据延迟RCR/XCR寄存器中的RDATDLYXDATDLY字段,允许你设置数据相对于帧同步信号的延迟(0, 1, 2个位时钟)。这个特性对于对接那些帧同步脉冲与数据起始位关系特殊的设备(如某些ADC)非常有用。
    • 多通道选择模式:虽然名字里有“Multichannel”,但McBSP的多通道能力通常指通过RCER/XCER寄存器选择128个通道中的一部分进行收发,更适用于时分复用的通信协议,而非McASP那种纯粹的、为音频优化的多通道TDM。
    • 与EDMA的无缝协作:McBSP的FIFO缓冲区和DMA事件触发机制非常成熟,配合C6746强大的EDMA控制器,可以实现极低CPU开销的连续数据块传输,特别适合作为数据采集或通信系统的前端。

配置要点:McBSP的配置流程通常比McASP更线性。一个常见的启动顺序是:1. 使采样率发生器处于复位状态(SPCR[1] GRST = 0);2. 配置引脚复用、时钟极性、帧长度等参数(PCR,RCR,XCR,SRGR);3. 退出采样率发生器复位(GRST = 1),等待时钟稳定;4. 退出发送/接收器复位(XRST = 1,RRST = 1)。打乱这个顺序常常导致时钟异常。

2.3 McASP vs. McBSP:如何选择?

特性维度McASPMcBSP选型建议
主要应用专业/消费级音频,多通道TDM音频流通用同步串行通信,语音编码,数据采集音频项目首选McASP,通用通信或已有代码复用考虑McBSP
时钟灵活性极高,收发完全独立,支持外部/内部高频时钟分频高,依赖一个采样率发生器,收发时钟可同源或独立需要完全异步的收发时钟,必须选McASP
数据格式处理极强,内置位操作、掩码、DIT模式一般,支持数据延迟和压缩扩展对接复杂或非标准位格式的音频设备,McASP省心很多
多通道支持原生、硬件级TDM支持,概念清晰(时隙->串行器)通过通道使能寄存器实现,更偏向逻辑通道选择纯粹的、固定时隙结构的多通道音频(如8入8出),McASP是唯一选择
开发复杂度较高,寄存器多,概念抽象相对较低,资料和范例更丰富新手可以从McBSP入手理解概念,但深入音频必须攻克McASP
与DMA协作通过DMA事件和AFIFO,效率高通过DMA事件和FIFO,非常成熟稳定两者均能高效协作EDMA,McBSP的范例可能更多

3. 核心寄存器详解与配置策略

手册上的寄存器列表只是地址的罗列。这里,我们聚焦于那些真正决定接口行为的“关键控制寄存器”,并解释每个关键配置位的实际影响。

3.1 McASP核心寄存器配置指南

McASP的寄存器看似繁多,但可以按功能模块化理解。

3.1.1 引脚与全局控制(PFUNC,PDIR,GBLCTL这是配置的起点,决定了McASP引脚是作为通用IO还是串行功能。

  • PFUNC: 将某个AXR[n]引脚配置为串行数据线(=0)还是通用IO(=1)。务必在初始化早期设置
  • PDIR: 当引脚用作串行功能时,配置方向。例如,ACLKX若由内部产生并输出给外部编解码器,则需设置为输出(=1)。
  • GBLCTL: 全局控制核。最重要的操作是“复位”序列:
    1. GBLCTLXRST= 0,RRST= 0 来复位收发器。
    2. GBLCTLFRST= 0 来复位帧同步发生器。
    3. 配置所有其他寄存器(时钟、格式、TDM等)。
    4. 然后按顺序使能:先置位FRST= 1,再置位XRST= 1 和RRST= 1。这���顺序不能错,否则帧同步可能无法正确产生。

3.1.2 时钟控制寄存器(ACLKXCTL,AHCLKXCTL,ACLKRCTL,AHCLKRCTL这是时序的源头,配置错误直接导致无时钟或时钟频率不对。

  • 时钟源选择(CLKXM,CLKRM=1表示该时钟由McASP内部产生(作为Master),=0表示接收外部时钟(作为Slave)。
  • 高频时钟分频(AHCLKXDIV,AHCLKRDIV:当使用内部高频时钟源(如AHCLKX)时,此分频器用于产生位时钟ACLKX/R的基准。计算公式:ACLKX频率 = 输入高频时钟频率 / (AHCLKXDIV + 1)
  • 位时钟分频(ACLKXDIV,ACLKRDI:对基准时钟进一步分频,得到最终的串行位时钟。位时钟频率 = 基准时钟频率 / (ACLKXDIV + 1)
  • 极性控制(CLKXP,CLKRP:决定数据在时钟的上升沿还是下降沿采样。必须与对接的设备严格匹配。通常,CLKXP=0表示在上升沿发送数据,CLKRP=0表示在下降沿接收数据(参见手册图6-31, 6-32)。

3.1.3 格式单元寄存器(XFMT,RFMT决定了数据在总线上的位级形态。

  • XBUSEL/RBUSEL:极其重要!它决定了CPU或DMA访问数据缓冲区XBUF/RBUF时使用的数据总线位宽。=1使用外设配置总线(通常32位),=0使用DMA总线。必须与你的数据访问方式(CPU轮询还是DMA)以及数据位宽匹配。配置错误会导致读写的数据错位。
  • XSSZ/RSSZ: 选择每个串行器字长(8, 12, 16, 20, 24, 32位)。这应与音频采样精度一致(如16位音频设为0x0代表16位)。
  • XBIT0/RBIT0: 指定数据字的哪一位最先发送/接收。=0为MSB first(常见于I2S),=1为LSB first。
  • XPAD/RPAD: 指定当串行器字长小于总线访问单元(如32位)时,填充位的值。通常设为0。

3.1.4 串行器与TDM配置(SRCTLn,XTDM,RTDM这是实现多通道的核心。

  • SRCTLn: 每个串行器(0-15)都有一个控制寄存器。你需要配置:
    • SRMOD: 模式。0x0为禁用,0x1为发送器,0x2为接收器。
    • DISMOD: 禁用时输出。对于发送串行器,当它被禁用(不在激活时隙)时,引脚状态(高阻、低、高)。
  • XTDM/RTDM: 如前所述,32位寄存器,每一位对应一个TDM时隙。你需要根据音频通道在TDM帧中的位置,将对应的位设为1。例如,一个标准的I2S TDM帧(64位时钟,包含左、右通道),左通道通常在时隙0,右通道在时隙1。那么如果使用串行器0发送左通道,就需要设置XTDM = 0x00000001;如果还用串行器1发送右通道,则需额外设置。

3.2 McBSP核心寄存器配置指南

McBSP的寄存器组更为紧凑,逻辑链清晰。

3.2.1 串行端口控制寄存器(SPCR这是总开关和状态中心。

  • RRST/XRST: 接收/发送器复位。同样,应在配置其他寄存器前将其清零,全部配好后再置位
  • GRST: 采样率发生器复位。在修改SRGR前应将其清零。
  • FRST: 帧同步发生器复位。在GRST使能后,再使能FRST
  • DXENA: 发送数据延迟使能。当使能时,会在第一个数据位前插入延迟,这有助于满足某些编解码器的建立时间要求。如果你的时序紧张,可以尝试关闭它

3.2.2 采样率发生器寄存器(SRGRMcBSP时钟的心脏。

  • CLKSM: 选择采样率发生器的时钟源。=1使用内部CPU时钟(ASYNC域),=0使用外部CLKS引脚。
  • CLKGDV: 这是核心分频系数。必须大于等于1。生成的位时钟频率 = 输入时钟频率 / (CLKGDV+ 1)。例如,输入100MHz,需要12.288MHz的位时钟(对应48kHz采样率,256倍过采样),则CLKGDV= (100 / 12.288) - 1 ≈ 7.13,取整为7,实际频率约为12.5MHz,需评估误差是否可接受。
  • FPER: 帧周期,定义两个帧同步信号之间的位时钟数。帧周期 = (FPER+ 1) * 位时钟周期。
  • FWID: 帧同步脉冲宽度,单位为位时钟数。脉冲宽度 = (FWID+ 1) * 位时钟周期。

3.2.3 接收/发送控制寄存器(RCR,XCR定义数据帧结构。

  • R/XPHASE: 单相还是双相帧。绝大多数应用使用单相帧(=0)。
  • R/XFRLEN1: 相位1的帧长度(每帧包含的字数)。例如,单声道就是1,立体声就是2。
  • R/XWDLEN1: 相位1的字长(每个字的位数)。8, 12, 16, 20, 24, 32位可选。
  • R/XDATDLY: 数据延迟。如前所述,00b表示无延迟(数据在帧同步有效后第一个时钟沿开始),01b延迟1位,10b延迟2位。这是解决数据对齐问题的关键参数

3.2.4 引脚控制寄存器(PCR配置时钟和帧同步的信号方向与极性。

  • CLKXM/CLKRM: 与McASP类似,=1内部产生(输出),=0外部输入。
  • FSXM/FSRM:=1内部产生帧同步(输出),=0外部输入。
  • CLKXP/CLKRP,FSXP/FSRP: 时钟和帧同步的极性。同样需要与外设严格匹配。

4. 时序参数解读与硬件设计要点

手册中的时序参数表(Table 6-45至6-59)不是摆设,是保证硬件稳定工作的“法律”。这里教你如何看懂并用好它们。

4.1 关键时序参数解析

以McASP0的时序要求(Table 6-45)为例,我们看几个最重要的参数:

  1. tc(ACLKRX)(Cycle time)ACLKX/R时钟的最小周期。例如在1.3V下,内部时钟模式最小值是25ns(对应最大频率40MHz)。这意味着你通过分频计算出的位时钟周期必须大于等于此值。如果你需要12.288MHz(约81.4ns周期),远大于25ns,满足要求。

  2. tsu(AXR-ACLKRX)(Setup time)th(ACLKRX-AXR)(Hold time):这是接收端的关键参数。它定义了外部设备发送给McASP的数据(AXR[n])相对于McASP接收时钟(ACLKR/X)边沿的建立时间和保持时间要求。

    • tsu: 数据必须在时钟沿到来之前至少稳定tsu时间。例如,内部时钟模式下为11.5ns。
    • th: 数据在时钟沿到来之后必须继续稳定至少th时间。注意,内部时钟模式下th-1ns负的保持时间意味着数据可以在时钟沿之后稍微提前变化,这对设计是有利的
    • 硬件设计启示:在PCB布局时,要尽量保证数据线(AXR)与对应的接收时钟线(ACLKR)等长,以减少skew,确保数据窗口满足建立保持时间。
  3. td(ACLKX-AXRV)(Delay time):这是发送端的关键参数。它定义了从McASP内部发送时钟边沿到数据引脚(AXR[n])输出有效之间的最大延迟。例如,内部时钟模式下最大为6ns。

    • 硬件设计启示:这个延迟加上PCB走线延迟,就是数据到达外部设备(如编解码器)的时间。你需要确保这个总延迟,加上外部设备自身的建立时间要求,不超过外部设备时钟周期的一半(理想情况)。这决定了McASP作为Master时能驱动的最大布线长度或负载。

4.2 同步与异步模式下的时序考量

  • 同步模式(ASYNC=0:接收器使用发送器的时钟(ACLKX)。此时,ACLKRCTL寄存器的配置可能被忽略。所有时序都围绕ACLKX展开。这种模式简化了时钟树,但要求收发设备时钟同源。
  • 异步模式(ASYNC=1:接收器和发送器使用各自独���的时钟。此时必须分别满足ACLKXACLKR相关的时序要求。在异步模式下,需要特别注意两个时钟域之间的数据缓冲(FIFO),以防数据溢出或读空。McASP的AFIFO就是为此设计。

4.3 供电电压对时序的影响

仔细观察表格,��会发现1.3V/1.2V/1.1V和1.0V核心电压下的时序参数是不同的。电压越低,芯片内部逻辑速度越慢,时序要求更宽松(最小周期变大,即最大频率降低),但输出延迟可能增大

  • 例如,tc(ACLKRX)在1.3V下最小25ns(40MHz),在1.0V下最小35ns(约28.6MHz)。
  • 设计建议:如果你的系统工作在可变电压或低功耗模式下,必须按照最差情况(最低电压)来评估最大通信速率,留有足够的时序裕量。

5. 实战配置流程与代码示例

理论说再多,不如一行代码。下面我给出一个典型的McASP配置流程,用于驱动一个I2S格式的音频编解码器(如TLV320AIC3106),工作在主模式(McASP提供时钟和帧同步),立体声,16位,48kHz采样率。

5.1 McASP 初始化配置步骤

假设使用McASP0的AXR0引脚作为音频数据线,ACLKX0AFSX0作为主时钟和帧同步输出。系统高频参考时钟AHCLKX为24.576MHz(生成48kHz * 512)。

// 1. 使能McASP模块的电源和时钟(这部分依赖具体的系统配置,如PSC模块) // 通常需要配置PSC(Power and Sleep Controller)和PINMUX(引脚复用) // 假设相关宏已定义 // 2. 配置引脚功能为McASP,而非GPIO *(volatile unsigned int *) (MCASP0_BASE + MCASP_PFUNC) = 0x00000000; // 所有AXR引脚用于串行功能 *(volatile unsigned int *) (MCASP0_BASE + MCASP_PDIR) = 0x00000003; // ACLKX0和AFSX0配置为输出,AXR0根据收发配置,此处先不设 // 3. 复位整个McASP模块 *(volatile unsigned int *) (MCASP0_BASE + MCASP_GBLCTL) = 0x0; // 清零XRST, RRST, FRST等 // 4. 配置发送器时钟(作为Master) *(volatile unsigned int *) (MCASP0_BASE + MCASP_ACLKXCTL) = (0 << 25) | // CLKXP=0, 上升沿发送数据 (I2S标准) (1 << 24) | // CLKXM=1, ACLKX由内部产生并输出 (0 << 23) | // ASYNC=0, 接收器使用发送器时钟(同步模式) (0 << 5) | // AHCLKXDIV = 0, 不对AHCLKX分频(假设输入直接是24.576MHz) (0); // ACLKXDIV = 0, 位时钟 = AHCLKX / (0+1) = 24.576MHz // 位时钟BCLK = 24.576MHz, 对应48kHz采样率的512倍过采样(LRCLK) // 5. 配置发送器帧同步 *(volatile unsigned int *) (MCASP0_BASE + MCASP_AFSXCTL) = (0 << 27) | // FSRM=0, 忽略(接收帧同步配置) (1 << 26) | // FSRMOD=0b001, 突发模式,每字一个帧同步(适用于I2S) (1 << 25) | // FSXP=0, 帧同步低有效(I2S标准,WS=0为左声道) (1 << 24) | // FSXM=1, AFSX由内部产生 (0 << 20) | // AFSXWID = 0, 帧同步脉冲宽度为1个位时钟(I2S要求) (31); // AFSXPER = 31, 帧周期为32个位时钟(对应16位左声道+16位右声道) // 6. 配置发送器数据格式 *(volatile unsigned int *) (MCASP0_BASE + MCASP_XFMT) = (1 << 25) | // XBUSEL=1, 使用32位外设总线访问(CPU直接读写) (0 << 24) | // XBIT0=0, MSB first (I2S标准) (0 << 20) | // XPAD=0, 填充0 (0 << 19) | // XSSZ=0b000, 字长为16位 (0 << 18) | // XROT=0, 不旋转 (0 << 17) | // XRVRS=0, 不反转位序 (0 << 16) | // XDLY=0b00, 无数据延迟 (0); // 保留位 // 7. 配置串行器0为发送器,并映射到TDM时隙0(左声道) *(volatile unsigned int *) (MCASP0_BASE + MCASP_SRCTL0) = (1 << 0); // SRMOD=0b01, 配置为发送串行器 // 注意:DISMOD等位可根据需要设置,例如DISMOD=0(输出高阻)当非激活时。 *(volatile unsigned int *) (MCASP0_BASE + MCASP_XTDM) = 0x00000001; // 仅时隙0激活 // 8. 配置接收器相关寄存器(如果启用接收) // 在同步模式下,接收时钟和帧同步跟随发送器,但格式和串行器需要单独配置 *(volatile unsigned int *) (MCASP0_BASE + MCASP_ACLKRCTL) = ... ; // CLKRM=0, 使用ACLKX *(volatile unsigned int *) (MCASP0_BASE + MCASP_AFSRCTL) = ... ; // FSRMOD需匹配 *(volatile unsigned int *) (MCASP0_BASE + MCASP_RFMT) = ... ; // 格式需匹配发送端 *(volatile unsigned int *) (MCASP0_BASE + MCASP_RTDM) = 0x00000001; // 接收也映射到时隙0 *(volatile unsigned int *) (MCASP0_BASE + MCASP_SRCTL1) = (2 << 0); // 配置串行器1为接收器 // 9. 使能帧同步发生器,然后使能发送器/接收器 *(volatile unsigned int *) (MCASP0_BASE + MCASP_GBLCTL) |= (1 << 2); // 置位FRST // 稍作延时,等待时钟稳定 delay_us(10); *(volatile unsigned int *) (MCASP0_BASE + MCASP_GBLCTL) |= (1 << 0); // 置位XRST *(volatile unsigned int *) (MCASP0_BASE + MCASP_GBLCTL) |= (1 << 1); // 置位RRST (如果启用接收) // 10. 现在McASP已经开始产生BCLK和LRCLK,并等待数据写入XBUF0

5.2 数据搬移与DMA配置

对于连续音频流,绝对不建议用CPU轮询XRDY标志位来搬运数据。必须使用EDMA。

  1. 配置EDMA通道:将EDMA通道的源地址指向你的音频数据缓冲区(例如Ping-Pong Buffer),目的地址固定为MCASP0_XBUF0的地址。
  2. 配置同步事件:将EDMA的同步事件设置为MCASP0_TX_EVT。这样,每当McASP发送器准备好新数据(即XRDY标志置位,实际上由XEVTCTL寄存器控制产生DMA事件),EDMA就会自动搬运一个数据单元(16位或32位,取决于XBUSEL和字长)。
  3. 配置传输参数:根据音频是立体声还是多通道,设置EDMA的传输单元大小(ESIZE)和数组/帧计数。例如,立体声16位数据,每个采样是32位(左+右),则ESIZE为32位,每次传输一个数组(包含左声道和右声道两个元素)。

避坑指南:在启用DMA前,务必确保McASP的XEVTCTL寄存器配置正确,选择了合适的事件模式(如XEVT模式,每次XRDY产生事件)。同时,注意XBUSEL的设置必须与EDMA访问的总线匹配。如果XBUSEL=1(外设配置总线),但EDMA试图通过DMA端口写入,数据将无法送达正确位置。

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

即使按照手册配置,McASP/McBSP不出数据或者数据错乱也是家常便饭。以下是我总结的排查清单:

6.1 时钟和帧同步信号无输出

  • 检查电源和时钟域:确认PSC模块已经使能了McASP所在电源域和模块时钟。用示波器测量AHCLKX输入引脚(如果使用外部高频时钟)是否有信号。
  • 检查引脚复用:确认PFUNC寄存器已将ACLKX,AFSX,AXR0等引脚配置为McASP功能,而不是GPIO。
  • 检查复位状态:确保配置寄存器前,GBLCTL中的XRST,RRST,FRST已清零。配置完成后,严格按照FRST->XRST/RRST的顺序使能。
  • 检查时钟分频计算:确认AHCLKXDIVACLKXDIV的计算值是否正确。一个快速验证方法是:将ACLKXCTL中的CLKXM设为1,ACLKXDIV设为一个较小的值(如1),用示波器看ACLKX引脚是否有方波输出。如果没有,说明前级配置或引脚复用有问题。

6.2 有时钟和帧同步,但无数据输出/输入

  • 检查串行器配置:确认SRCTLn寄存器中的SRMOD已正确设置为发送(1)或接收(2)模式,并且没有设置为禁用(0)。
  • 检查TDM时隙映射:确认XTDM/RTDM寄存器中,对应你使用的串行器编号(n)的位,在你期望数据出现的时隙上被置1。这是最容易被忽略的一点。一个时隙可以映射多个串行器,但一个串行器在某一时刻只能在一个时隙有效。
  • 检查数据缓冲区访问
    • CPU轮询:检查XSTAT寄存器的XRDY位或RSTATRRDY位。只有为1时,才能读写XBUFn/RBUFn。写XBUF会清除XRDY,读RBUF会清除RRDY
    • DMA方式:检查EDMA通道是否已正确链接并启用,同步事件是否选择正确。用CCS的Memory Browser查看XBUF地址,手动写入一个测试值(如0xAAAA5555),看是否能发送出去,可以快速判断是McASP��置问题还是DMA问题。
  • 检查数据格式:确认XFMT/RFMT中的XSSZ/RSSZ(字长)、XBIT0/RBIT0(位序)与外部设备完全一致。XBUSEL/RBUSEL必须与你的访问方式匹配(CPU用1,DMA用0)。

6.3 数据错位或杂音

  • 首要怀疑对象:时钟极性:仔细核对CLKXP,CLKRP,FSXP,FSRP与外部设备的数据手册是否一致。I2S标准通常是:FSXP=0(帧同步低电平为左声道),CLKXP=0(发送在上升沿,接收在下降沿)。用示波器同时测量ACLKX,AFSXAXR0,对照手册图6-31/6-32,检查数据边沿是否出现在正确的时钟沿和帧同步相位内。
  • 检查数据延迟:对于McBSP,检查XDATDLY/RDATDLY。对于McASP,检查XFMT/RFMT中的XDLY/RDLY。不正确的延迟会导致数据错位一个字。
  • 检查字长和时隙宽度:在TDM模式下,确保每个时隙的宽度(由AFSXCTL中的AFSXWIDAFSXPER间接定义)能够容纳你设置的字长(XSSZ)。例如,字长32位,时隙宽度必须至少为32个ACLKX周期。
  • 电源噪声:高速串行数据对电源质量敏感。确保模拟和数字电源已妥善隔离,并在McASP电源引脚附近放置足够的去耦电容(0.1uF和10uF组合)。

6.4 使用逻辑分析仪或示波器进行调试

这是最直接有效的手段。抓取ACLKX,AFSX,AXR0三个信号。

  1. 看框架:首先确认AFSX(即LRCLK)的频率是否为预期的采样率(如48kHz),ACLKX(即BCLK)的频率是否为AFSX频率的64倍或512倍等。
  2. 看对齐:放大看一个帧周期内,AFSX边沿与AXR0数据起始位之间的关系,是否符合配置的延迟。
  3. 看数据:将AXR0信号设置为总线显示,解码为I2S或TDM格式,直接查看发送的数据值是否与你写入XBUF的值一致。如果不一致,检查位序(MSB/LSB)和字长设置。

配置McASP和McBSP是一个需要耐心和细致的过程,它融合了对硬件时序的理解、对寄存器功能的掌握以及实际的调试技巧。希望这篇结合了原理、配置和实战经验的详解,能帮你把这部分知识真正消化,在下一个DSP项目中游刃有余。记住,没有一次成功的配置是偶然的,每一个不起眼的寄存器位背后,都可能藏着让系统稳定工作的关键。