1. 项目概述与核心价值

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

这篇文章,我就结合自己踩过的坑和项目经验,把这两个串行接口从“黑盒”变成“透明盒”。我们不止看手册上冰冷的寄存器列表和时序参数,更要深挖其设计逻辑、配置策略,以及在实际硬件调试中那些手册不会告诉你的“潜规则”。无论是刚接触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的音频流,两者互不干扰。
    • 强大的格式单元 :通过 RFMT XFMT 寄存器,你可以对接收和发送的数据流进行极其精细的位级操作,包括位序调整(MSB/LSB first)、位扩展、符号扩展、数据延迟等。这对于对接各种非标准或自定义音频格式的编解码器至关重要。
    • 时分复用(TDM)支持 :这是McASP的看家本领。通过 RTDM XTDM 寄存器,你可以灵活地将多达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 寄存器中的 RDATDLY XDATDLY 字段,允许你设置数据相对于帧同步信号的延迟(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:如何选择?

特性维度 McASP McBSP 选型建议
主要应用 专业/消费级音频,多通道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. GBLCTL XRST = 0, RRST = 0 来复位收发器。
    2. GBLCTL FRST = 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 采样率发生器寄存器( SRGR McBSP时钟的心脏。

  • 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 :接收器和发送器使用各自独���的时钟。此时必须分别满足 ACLKX ACLKR 相关的时序要求。 在异步模式下,需要特别注意两个时钟域之间的数据缓冲(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 引脚作为音频数据线, ACLKX0 AFSX0 作为主时钟和帧同步输出。系统高频参考时钟 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 的顺序使能。
  • 检查时钟分频计算 :确认 AHCLKXDIV ACLKXDIV 的计算值是否正确。一个快速验证方法是:将 ACLKXCTL 中的 CLKXM 设为1, ACLKXDIV 设为一个较小的值(如1),用示波器看 ACLKX 引脚是否有方波输出。如果没有,说明前级配置或引脚复用有问题。

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

  • 检查串行器配置 :确认 SRCTLn 寄存器中的 SRMOD 已正确设置为发送(1)或接收(2)模式,并且没有设置为禁用(0)。
  • 检查TDM时隙映射 :确认 XTDM/RTDM 寄存器中,对应你使用的串行器编号(n)的位,在你期望数据出现的时隙上被置1。 这是最容易被忽略的一点 。一个时隙可以映射多个串行器,但一个串行器在某一时刻只能在一个时隙有效。
  • 检查数据缓冲区访问
    • CPU轮询 :检查 XSTAT 寄存器的 XRDY 位或 RSTAT RRDY 位。只有为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 , AFSX AXR0 ,对照手册图6-31/6-32,检查数据边沿是否出现在正确的时钟沿和帧同步相位内。
  • 检查数据延迟 :对于McBSP,检查 XDATDLY/RDATDLY 。对于McASP,检查 XFMT/RFMT 中的 XDLY/RDLY 。不正确的延迟会导致数据错位一个字。
  • 检查字长和时隙宽度 :在TDM模式下,确保每个时隙的宽度(由 AFSXCTL 中的 AFSXWID AFSXPER 间接定义)能够容纳你设置的字长( 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项目中游刃有余。记住,没有一次成功的配置是偶然的,每一个不起眼的寄存器位背后,都可能藏着让系统稳定工作的关键。

更多推荐