1. 项目概述:深入理解TMS320DM35x的音频串行端口

在嵌入式音频系统开发中,如何高效、可靠地在处理器与外部音频编解码器之间传输PCM数据流,是一个既基础又关键的问题。如果你正在基于TI的TMS320DM35x系列芯片设计语音对讲设备、便携式播放器或是带音频功能的工业控制器,那么你一定会和它的Audio Serial Port打交道。这个外设,我们通常简称为ASP,它远不止是一个简单的串口,而是一个高度可配置的同步串行引擎,专门为连接AC97、IIS这类行业标准音频器件而生。

我最初接触ASP时,也被它数据手册里密密麻麻的寄存器位和时序图搞得有点头大。但实际用下来发现,一旦理清了它的时钟树、帧同步机制和数据流路径,配置起来其实非常直观。它的核心价值在于,用一套硬件接口,通过软件配置就能适配多种音频协议,省去了外部逻辑芯片,既节约了成本又提高了系统的可靠性。本文将结合手册内容和实际调试经验,为你拆解TMS320DM35x ASP的架构精髓与配置要点,特别是那些手册里一笔带过、但实践中极易踩坑的细节。

2. ASP核心架构与工作模式解析

2.1 功能框图与信号定义

ASP本质上是一个全双工、双缓冲的同步串行通信控制器。它的结构可以清晰地分为数据路径和控制路径。数据路径负责数据的搬移、格式转换和压缩扩展,而控制路径则管理着时钟、帧同步以及各种状态和中断。

先来看看它对外连接的几个关键引脚,这是硬件设计的基础:

  • CLKR/CLKX (接收/发送时钟) : 这两个引脚可以是输入也可以是输出,决定了时钟由谁主导。连接外部编解码器时,通常由编解码器提供主时钟(Master Clock),此时ASP配置为从模式(Slave),CLKR和CLKX作为输入。若ASP提供时钟,则配置为主模式,这两个引脚为输出。
  • FSR/FSX (接收/发送帧同步) : 帧同步信号,标志着一个数据帧(Frame)的开始。和时钟引脚一样,可输入可输出。在IIS协议下,它对应着LRCLK(左右声道时钟);在AC97协议下,它则是SYNC信号。
  • DR/DX (接收/发送数据) : 就是实际的音频数据线了。
  • CLKS (外部主时钟输入,仅ASP1) : 这是一个可选的、专用的外部时钟输入引脚,可以直接作为采样率生成器的时钟源,为系统提供更高的时钟配置灵活性。

注意 : 在原理图设计阶段,务必根据你选用的音频编解码器的工作模式(主或从),正确规划这些引脚的方向(上拉/下拉、驱动能力),并在PCB布局时考虑时钟信号的完整性,避免因信号质量问题导致数据错位。

2.2 核心工作流程:时钟、帧与数据的三重奏

ASP的工作围绕着三个核心概念展开:时钟(Clock)、帧同步(Frame Sync)和数据(Data)。理解它们之间的关系是正确配置的前提。

时钟是节拍器 。它决定了每一位数据(Bit)在数据线上移入或移出的速度。ASP的时钟极其灵活,既可以来自外部引脚,也可以由内部的采样率生成器(Sample Rate Generator)产生。采样率生成器本身又是一个可编程的分频器,可以将输入的时钟源(内部PLL输出或外部CLKS)分频后产生所需的位时钟(Bit Clock)。

帧同步是指挥棒 。它告诉接收方:“一个新的数据帧开始了!”一个帧通常包含多个数据元素(Element),例如在立体声音频中,一个帧包含左声道和右声道两个元素。帧同步信号的极性(高有效或低有效)、宽度和周期都是可编程的。

数据是乐谱 。在帧同步的指挥下,数据按照时钟节拍,以元素为单位进行传输。每个元素的长度可以是8、12、16、20、24或32位,并且可以配置为先传输最高有效位(MSB)还是最低有效位(LSB)。

配置ASP时,你的思维流程应该是:首先确定音频协议要求的时钟和帧同步特性(如IIS要求帧同步在时钟下降沿变化,数据在时钟下降沿后延迟一位输出),然后据此设置ASP的时钟源、极性、帧周期,最后配置数据格式。这个过程常常需要反复查阅编解码器的手册和ASP的时序图。

3. 时钟系统的深度配置与实战要点

时钟是ASP的“心脏”,配置不当会导致无声、杂音或数据完全错误。TMS320DM35x的ASP提供了多层级的时钟控制选项。

3.1 采样率生成器:你的内部时钟工厂

采样率生成器是ASP内部最强大的时钟管理单元。如图5所示,它是一个三级分频器,可以产生精确的位时钟(CLKG)和帧同步信号(FSG)。

第一级:位时钟生成(CLKGDV) 这是最常用的分频器。通过配置SRGR寄存器的CLKGDV字段(8位),你可以将输入时钟分频。计算公式为: f(CLKG) = f(输入时钟) / (CLKGDV + 1) 。CLKGDV的取值范围是0-255,因此分频比范围为1到256。

这里有一个极易忽略的细节: CLKGDV的值会影响CLKG的占空比

  • 当CLKGDV为奇数或0时,CLKG是完美的50%占空比方波。
  • 当CLKGDV为偶数(设为2p)时,高电平持续时间为 (p+1) 个输入时钟周期,低电平持续时间为 p 个周期。

例如,输入时钟频率为12.288MHz,我们需要生成一个2.048MHz的位时钟(常用于48kHz采样率,32位帧的IIS)。计算CLKGDV: 2.048 = 12.288 / (CLKGDV + 1) ,解得CLKGDV = 5。因为5是奇数,所以生成的2.048MHz时钟占空比为50%。如果你的编解码器对时钟占空比敏感(有些器件要求接近50%),这个细节就必须考虑。

第二级与第三级:帧同步生成(FPER与FWID) 这两个寄存器共同定义了帧同步信号的波形。 帧周期 = (FPER + 1) * CLKG周期 帧同步脉冲宽度 = (FWID + 1) * CLKG周期 。FPER是12位寄存器(最大值4095),FWID是8位寄存器(最大值255)。

一个关键建议是: FWID的设定值应小于单个数据元素的位长度的一半 。例如,你配置为16位数据元素(RWDLEN1=010b),那么FWID最好设置为小于8。这是因为帧同步脉冲通常只需要一个很窄的脉冲来指示帧开始,过宽的脉冲可能会干扰数据线的稳定,尤其是在高速传输时。

3.2 时钟与帧同步的路径选择:MUX的控制逻辑

如图2所示,ASP内部有一系列多路选择器(MUX),决定了CLKR/X和FSR/X的信号来源。这是通过PCR(引脚控制寄存器)中的CLKRM、CLKXM、FSRM、FSXM位控制的。

时钟路径选择

  • CLKRM/CLKXM = 0 : 接收/发送时钟来自对应的外部引脚(CLKR/CLKX)。ASP作为从设备。
  • CLKRM/CLKXM = 1 : 接收/发送时钟来自内部采样率生成器输出的CLKG。ASP作为主设备,并在对应引脚上输出这个时钟。

帧同步路径选择

  • FSRM/FSXM = 0 : 接收/发送帧同步来自对应的外部引脚(FSR/FSX)。
  • FSRM/FSXM = 1 : 接收/发送帧同步来自内部采样率生成器输出的FSG。
  • 一个特殊模式(FSXM=1且FSGM=0) : 发送帧同步由DXR到XSR的数据拷贝事件内部触发。这个模式适用于需要非周期性或由数据驱动产生帧同步的特殊应用,但注意,在数据延迟(XDATDLY)为1或2时,无法达到最大帧频率。

极性控制 : CLKRP, CLKXP, FSRP, FSXP这些位用于控制信号的极性。内部逻辑始终使用高电平有效的帧同步和特定的时钟边沿(发送用CLKX_int上升沿,接收用CLKR_int下降沿采样)。极性位的作用就是在信号进入或离开ASP时进行翻转,以匹配外部器件的电气要求。

例如,IIS协议要求位时钟在下降沿变化,数据在下降沿后延迟一位输出。那么,如果ASP作为主设备(提供BCLK和LRCLK):

  1. 设置CLKXM=1,CLKG从CLKX引脚输出。
  2. 由于ASP内部在CLKX_int的上升沿发送数据,为了满足IIS在下降沿后输出数据的要求,我们需要设置CLKXP=1。这样,内部的CLKX_int(上升沿有效)经过反相后,在CLKX引脚上就变成了下降沿有效的时钟,正好符合IIS的时序。

3.3 数字回环模式:不可或缺的调试利器

SPCR寄存器中的DLB(Digital Loopback)位是我在驱动调试初期最常用的功能。设置DLB=1后,发送端(DX, FSX, CLKX)会在芯片内部直接连接到接收端(DR, FSR, CLKR)。

这有什么用?

  1. 硬件隔离验证 : 在不连接外部编解码器的情况下,验证ASP内核的配置、数据流和中断/DMA是否工作正常。你可以配置ASP为主模式,然后让发送的数据“绕一圈”直接被接收回来,在内存中对比发送和接收的数据缓冲区是否一致。
  2. 降低调试复杂度 : 在系统集成初期,音频问题可能来自ASP配置、编解码器配置或PCB设计。通过开启回环模式,可以立刻排除ASP软件配置和处理器侧硬件的问题,将焦点快速锁定在编解码器或外部电路上。

配置回环模式的关键点

  • 必须将CLKXM和FSXM设置为1(输出模式),因为此时需要内部产生时钟和帧同步来驱动整个回环通路。
  • CLKRM和FSRM的配置不影响内部回环连接,但它们决定了CLKR和FSR引脚的状态(高阻或输出)。

4. 数据流、帧结构与高级操作模式

4.1 数据缓冲与传输机制

ASP采用双缓冲结构来确保数据流的连续性,这是实现高吞吐、低延迟音频传输的基础。

  • 发送路径 : CPU或EDMA先将数据写入 数据发送寄存器 。当上一个数据元素从 发送移位寄存器 移出完成后,DXR中的内容会自动拷贝到XSR中,然后由移位时钟逐位推到DX引脚上。这个“DXR -> XSR”的拷贝事件,会触发 发送就绪中断 EDMA事件 ,通知你该准备下一个数据了。
  • 接收路径 : 数据从DR引脚逐位移入 接收移位寄存器 。当一个完整的数据元素收满后,RSR中的内容会自动拷贝到 接收缓冲寄存器 ,然后再被CPU或EDMA读取。这个“RSR -> RBR”的拷贝事件,会触发 接收就绪中断 EDMA事件

这种双缓冲机制意味着,只要你能及时响应中断或配置好EDMA连续传输,理论上就可以实现无间隙的音频流。手册中提到的“连续数据流”能力正是基于此。

4.2 帧与元素的灵活配置

ASP的帧结构非常灵活,由RCR和XCR寄存器控制。

  • 每帧元素数 : 通过(R/X)FRLEN1/2位段配置。ASP支持单相位和双相位帧。单相位帧就是简单的一串元素。双相位帧则将一个帧分为两个相位(Phase),每个相位可以包含不同数量的元素。这对于AC97协议非常有用,因为AC97帧包含多个时隙(Slot),每个时隙长度不同。
  • 每个元素的位数 : 通过(R/X)WDLEN1/2位段配置。支持8, 12, 16, 20, 24, 32位。当元素位数不是8的倍数时(如12、20位),ASP还提供了数据对齐(Justification)功能,通过SPCR中的RJUST位控制,可以将数据在32位的DRR中左对齐或右对齐,并选择填充0或符号扩展。

数据延迟 : 这是一个关键且容易出错的配置。 (R/X)DATDLY 位定义了从帧同步有效到第一个数据位开始传输之间的时钟延迟周期数(0, 1, 2位)。0延迟是标准模式。1位延迟是IIS协议和大多数编解码器的 默认要求 ,它允许数据线在帧同步变化后有一个时钟周期的稳定时间。2位延迟较少使用。配置错误会导致数据整体错位一个或多个时钟周期,听到的音频将是完全错误的。

4.3 压缩扩展硬件与SPI模式

µ律/A律压缩扩展 : ASP内置了硬件压缩扩展单元,用于在传输前对线性PCM数据进行压缩(Companding),在接收后进行扩展。这能有效提高小信号的信噪比,常用于语音通信(如G.711标准)。通过SPCR中的 (R/X)COMPAND 位使能,并选择µ律或A律。启用后,硬件会自动处理16位线性数据与8位压缩数据之间的转换,大大减轻CPU负担。

SPI时钟停止模式 : ASP除了标准的连续时钟模式,还支持SPI协议。SPI模式通过SPCR中的CLKSTP位使能。在此模式下,时钟(CLKX)只在数据传输期间有效,在两个数据元素之间会停止,变为高电平或低电平(由CLKXP极性决定)。这对于连接SPI接口的ADC、DAC或存储器非常有用。需要注意的是,ASP在SPI模式下 仅支持主模式 (即由ASP提供时钟)。

5. 初始化流程、中断与EDMA事件实战

5.1 标准的ASP初始化步骤

配置ASP不能胡乱写寄存器,需要遵循一个明确的顺序,尤其是在操作复位和使能位时。下面是一个稳健的初始化流程:

  1. 全局与接收/发送禁用 : 首先,向SPCR寄存器写入 0x0000 ,确保 RRST = XRST = GRST = 0 ,将整个ASP、接收器、发送器和采样率生成器置于复位/禁用状态。
  2. 配置采样率生成器(如需要) : 如果使用内部时钟和帧同步,在此阶段配置SRGR寄存器。设置CLKGDV、FPER、FWID等参数。 但先不要置位GRST
  3. 配置引脚控制寄存器 : 配置PCR寄存器,确定每个引脚是输入还是输出(CLKRM, CLKXM, FSRM, FSXM),以及信号的极性(CLKRP, CLKXP, FSRP, FSXP)。
  4. 配置接收/发送控制寄存器 : 配置RCR和XCR寄存器,设定数据延迟、每帧元素数、每个元素的位数等关键参数。
  5. 配置串口控制寄存器(部分) : 配置SPCR中与数据格式相关的位,如压缩扩展模式(R/X)COMPAND、数据对齐方式RJUST、数字回环DLB、时钟停止模式CLKSTP等。 此时RRST和XRST仍为0
  6. 使能采样率生成器 : 如果需要内部生成时钟/帧,现在将SPCR中的GRST位设为1,释放采样率生成器的复位。等待至少两个CLKG周期(可通过短暂延时实现),让采样率生成器稳定输出。
  7. 使能接收器和发送器 : 将SPCR中的RRST和XRST位设为1。此时,接收器和发送器开始工作,等待帧同步信号。
  8. 启动帧同步(如使用内部生成) : 如果FSGM=1(使用采样率生成器产生帧同步),此时将SPCR中的FRST位设为1,FSG开始产生脉冲。 至此,ASP已准备好传输数据。

实操心得 : 步骤6和步骤8之间的顺序很重要。一定要先让采样率生成器跑起来(GRST=1),稳定后再启动帧同步(FRST=1)。如果反过来,可能会导致第一个帧同步脉冲宽度或周期异常。另外,在修改任何关键运行时参数(如数据格式)前,最安全的做法是先将对应的RRST或XRST位清零,修改配置后再重新置位。

5.2 中断与EDMA事件配置

ASP提供了丰富的事件来通知CPU或EDMA控制器进行数据搬运。

中断

  • RINT : 接收中断。触发条件包括:接收数据就绪(RSR->RBR拷贝完成)、接收过载错误、接收帧同步错误等。
  • XINT : 发送中断。触发条件包括:发送数据就绪(DXR已空,可写入新数据)、发送下溢错误等。

通过SPCR中的 (R/X)INTM 位可以配置中断模式,例如选择仅在数据就绪时触发,或在任何事件(包括错误)时都触发。

EDMA事件 : 对于高带宽、低CPU占用的音频流传输,强烈推荐使用EDMA。ASP可以产生以下同步事件:

  • REVT : 接收事件。与RINT的数据就绪条件对应,用于触发EDMA将RBR中的数据搬运到内存。
  • XEVT : 发送事件。与XINT的数据就绪条件对应,用于触发EDMA将内存中的数据搬运到DXR。

配置EDMA时,需要将ASP的REVT/XEVT映射到EDMA控制器的特定同步事件号上,并设置好源地址、目的地址、传输数量等参数。利用EDMA的Ping-Pong缓冲或链表传输,可以实现无缝的音频流循环播放或录制。

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

即使按照手册配置,在实际调试中仍会遇到各种问题。下面是我总结的一些典型问题及其排查思路。

6.1 问题排查速查表

现象 可能原因 排查步骤与解决方法
完全无声 1. 时钟或帧同步未产生。
2. ASP或编解码器未退出复位。
3. 数据格式(字长、对齐、延迟)严重不匹配。
1. 用示波器测量CLKX/R和FSX/R引脚,确认有时钟和帧同步信号,且频率、极性正确。
2. 检查ASP的RRST/XRST/GRST位和编解码器的复位/使能引脚。
3. 核对ASP与编解码器的数据位宽、对齐方式、数据延迟设置是否一致。从最简单的8位、0延迟、MSB优先开始测试。
音频失真、有杂音 1. 时钟抖动或占空比不佳。
2. 数据缓冲区处理不当,导致数据错位或覆盖。
3. 压缩扩展模式配置错误。
4. EDMA传输配置错误,导致数据丢失或重复。
1. 测量时钟信号质量,检查PCB布局,确保时钟线远离噪声源。调整CLKGDV为奇数值以获得50%占空比。
2. 检查中断服务程序或EDMA回调函数,确保在正确的时间点切换缓冲区。使用内存比对工具验证发送和接收的数据是否一致。
3. 确认编解码器是否工作在压缩扩展模式,ASP的(R/X)COMPAND位是否与之匹配。
4. 检查EDMA的传输计数、地址递增模式,确保其与ASP的帧/元素配置匹配。
只有单声道有声音 1. 帧同步相位错误(左右声道颠倒)。
2. 双相位帧配置错误,导致只传输了一个相位的数据。
1. 检查FSX/R的极性。尝试反转FSXP/FSRP位。
2. 如果使用双相位帧,检查(R/X)FRLEN1和(R/X)FRLEN2是否都正确配置,且EDMA传输的数据量能覆盖两个相位。
SPI模式下通信失败 1. CLKSTP模式配置错误。
2. 时钟极性(CLKXP)和相位(CLKSP)与从设备不匹配。
3. 数据在时钟之间未保持稳定。
1. 确认CLKSTP位已正确使能(非0值)。
2. SPI有4种模式(CPOL, CPHA)。根据从设备手册,组合配置CLKXP和CLKSP。例如,CPOL=0, CPHA=0通常对应CLKXP=0, CLKSTP=10b。
3. 确保在时钟停止期间,数据线DX保持稳定值。

6.2 调试技巧与心得

  1. 示波器是你的第一朋友 : 音频问题,七成以上靠示波器解决。首先抓取CLKX, FSX, DX三根线的时序。对照ASP和编解码器手册的时序图,检查帧同步有效边沿、数据延迟、数据建立/保持时间是否满足要求。一个常见的错误是忽略了数据延迟(DATDLY),导致数据整体偏移一位。

  2. 从简到繁,逐步验证

    • 第一步,验证时钟 : 先不接编解码器,将ASP配置为主模式,输出时钟和帧同步。用示波器看频率、占空比、极性是否正确。
    • 第二步,数字回环 : 开启DLB模式,编写一个简单的测试程序,发送一个已知的数据模式(如0xAA55AA55),然后接收回来比对。这能完美验证ASP内核配置、中断/DMA以及软件数据流处理是否正确。
    • 第三步,连接编解码器 : 在回环测试通过后,再连接外部编解码器。先配置编解码器为最简模式(如默认从模式、线性PCM),再与ASP对接。
  3. 善用数据对齐功能 : 当你使用12位或20位等非标准位宽时,从DRR读取的32位数据可能不是你期望的格式。仔细理解RJUST位的含义:左对齐还是右对齐?高位补0还是符号扩展?在调试时,可以发送一个已知的、易于辨认的模式(如0x0FFF),然后读取DRR的原始值,反推对齐方式是否正确。

  4. EDMA配置的坑 : 配置EDMA传输ASP数据时,元素大小(Element Size)应设置为32位(即使音频数据是16位),因为ASP的数据寄存器(DRR/DXR)是32位的。帧大小(Frame Size)应设置为ASP每帧传输的 元素个数 。数组大小(Array Size)通常为1。传输总数(Transfer Count)则是“帧大小 x 帧数”。如果配置不当,EDMA可能会漏搬或错搬数据,导致音频卡顿或杂音。

更多推荐