TMS320C6746 McASP与McBSP串行接口配置详解与实战指南
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开销的连续数据块传输,特别适合作为数据采集或通信系统的前端。
-
高度可编程的采样率发生器(SRGR)
:这是McBSP的灵魂。通过配置
配置要点 :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: 全局控制核。最重要的操作是 “复位” 序列:-
写
GBLCTL的XRST= 0,RRST= 0 来复位收发器。 -
写
GBLCTL的FRST= 0 来复位帧同步发生器。 - 配置所有其他寄存器(时钟、格式、TDM等)。
-
然后按顺序使能:先置位
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)为例,我们看几个最重要的参数:
-
tc(ACLKRX)(Cycle time) :ACLKX/R时钟的最小周期。例如在1.3V下,内部时钟模式最小值是25ns(对应最大频率40MHz)。 这意味着你通过分频计算出的位时钟周期必须大于等于此值 。如果你需要12.288MHz(约81.4ns周期),远大于25ns,满足要求。 -
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,确保数据窗口满足建立保持时间。
-
-
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。
-
配置EDMA通道
:将EDMA通道的源地址指向你的音频数据缓冲区(例如Ping-Pong Buffer),目的地址固定为
MCASP0_XBUF0的地址。 -
配置同步事件
:将EDMA的同步事件设置为
MCASP0_TX_EVT。这样,每当McASP发送器准备好新数据(即XRDY标志置位,实际上由XEVTCTL寄存器控制产生DMA事件),EDMA就会自动搬运一个数据单元(16位或32位,取决于XBUSEL和字长)。 -
配置传输参数
:根据音频是立体声还是多通道,设置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问题。
-
CPU轮询
:检查
-
检查数据格式
:确认
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
三个信号。
-
看框架
:首先确认
AFSX(即LRCLK)的频率是否为预期的采样率(如48kHz),ACLKX(即BCLK)的频率是否为AFSX频率的64倍或512倍等。 -
看对齐
:放大看一个帧周期内,
AFSX边沿与AXR0数据起始位之间的关系,是否符合配置的延迟。 -
看数据
:将
AXR0信号设置为总线显示,解码为I2S或TDM格式,直接查看发送的数据值是否与你写入XBUF的值一致。如果不一致,检查位序(MSB/LSB)和字长设置。
配置McASP和McBSP是一个需要耐心和细致的过程,它融合了对硬件时序的理解、对寄存器功能的掌握以及实际的调试技巧。希望这篇结合了原理、配置和实战经验的详解,能帮你把这部分知识真正消化,在下一个DSP项目中游刃有余。记住,没有一次成功的配置是偶然的,每一个不起眼的寄存器位背后,都可能藏着让系统稳定工作的关键。
更多推荐
所有评论(0)