公司动态
TMS320C20x DSP增强型同步串口(ESSP)多通道配置与实战
1. 项目概述与核心价值如果你正在用TMS320C20x这颗经典的DSP做项目尤其是涉及到音频处理、多路数据采集或者需要连接多个串行外设比如多个ADC、DAC或编解码器的场景那么你大概率绕不开它的增强型同步串口ESSP。这玩意儿远不止是一个简单的串口它更像是一个高度可配置的串行通信引擎。我当年第一次调这个模块对着几百页的数据手册和一堆寄存器位域感觉头都大了。但一旦啃下来你会发现它设计得非常精巧特别是其多通道模式能让一个串口硬件同时服务四个外设这对于节省宝贵的DSP引脚和简化PCB布线来说简直是神器。简单来说标准同步串口SSP只能一对一通信而ESSP通过巧妙的时序和引脚复用实现了一对多。其核心在于它不再只提供一个帧同步信号FSX而是可以生成多达四个相位依次延迟的帧同步信号FSX1-FSX4。所有外设共享数据线DX, DR和移位时钟CLKX但各自在属于自己的那个帧同步信号有效时才进行数据的发送或接收。这就好比一条广播总线每个设备都有一个独特的“听令”时刻井然有序。然而灵活性的背后是配置的复杂性。时钟源的选择内部还是外部、时钟频率的分频、帧同步信号的生成方式预分频还是FIFO写入触发、多通道的使能与数量选择以及至关重要的时序参数计算全都通过几个关键的寄存器SSPST, SSPMC, SSPCT来设置。配置错了轻则通信失败重则时序混乱数据错位。本文将结合手册中的关键表格和说明拆解这些寄存器的每一个关键位并通过一个典型的四通道16位音频编解码器CODEC接口实例手把手带你完成配置避开那些我当年踩过的坑。2. ESSP核心机制与寄存器深度解析要玩转ESSP不能只停留在“配置寄存器”的层面必须理解其内部的工作机制。ESSP在标准SSP的基础上主要增强了三方面能力可编程的时钟与帧同步预分频器、多通道帧同步生成逻辑以及将预分频器用作通用16位计数器的能力。这些功能全部通过新增的寄存器来控制。2.1 核心寄存器概览与访问要点ESSP的操作围绕五个I/O空间映射的寄存器展开其中三个是增强功能特有的寄存器名称I/O地址复位值核心功能描述SSPSTFFF2h0000h状态与控制寄存器。包含FIFO状态、时钟/帧同步极性控制、内部信号源选择、预分频器使能等关键控制位。这是配置的“大脑”。SSPMCFFF3h0000h多通道与计数器寄存器。用于启用多通道模式、选择通道数量、配置SPI模式以及将预分频器设置为16位通用计数器。SSPCTFFFBhxx00h计数/预分频寄存器。这是一个16位寄存器低字节CLXCT用于CLKX时钟预分频高字节FSXCT用于FSX帧同步预分频。也可合并为16位计数器。SSPCRFFF1h0000h标准SSP寄存器控制串口基本模式如连续/突发模式、时钟/帧同步源选择MCM, TXM, FSM位。ESSP配置需与之协同。SDTRFFF0hxxxxh标准SSP寄存器数据发送/接收寄存器。注意编程时必须先初始化SSPCT和SSPMC最后再配置SSPST。特别是SSPST中的预分频器使能位PRSEN位8必须在其他相关寄存器SSPCR, SSPCT, SSPMC都配置妥当后才能设置为1。过早开启时钟可能导致不可预知的时序。2.2 SSPST寄存器时钟与帧同步的指挥所SSPST寄存器地址FFF2h是控制ESSP时序行为的核心。我们逐位分析其关键作用位15 (DRP)只读位直接反映DR引脚的电平状态。用于诊断。位14 (FSN)帧同步极性控制。0FSX高电平有效一个CLKX周期数据在下降沿开始传输默认。1极性反转。关键点此位同时控制FSX和FSR的极性。若FSX和FSR引脚在外部短接则无论FSN设为何值SSP内核看到的两个信号极性总是一致的。位13 (FSXOX)内部FSX源选择。这是理解帧同步生成的关键。0内部FSX由发送FIFO的写入速率决定。每向发送FIFO写入一个数据字就产生一个FSX脉冲。适用于非周期性的或由数据驱动帧同步的场景。1内部FSX由FSXCT预分频器产生。这是最常用的模式可以产生精确、周期性的帧同步信号计算公式为FSX rate CLKX pin clock / (2*(FSXCT1))。位12 (FSXST)FSXCT预分频器状态位。当FSXCT计数器减到0时此位被置1。可读并可通过写1来清除W1C。如果SSPMC中的GPI位使能此位还能触发XINT中断。在16位计数器模式下它也作为16位计数器的零状态标志。位10 (CLN)移位时钟CLKX极性控制。0正常极性默认。1反转极性。与FSN类似此位同时控制CLKX和CLKR的极性。位9 (CLXOX)输入时钟源选择仅在16位计数器模式GPC1时有效。0输入时钟为CLKOUT1。1输入时钟为CLKX引脚时钟具体是CLKOUT1/2还是外部时钟取决于SSPCR的MCM位。位8 (PRSEN)预分频时钟使能位。这是ESSP时钟系统的总开关。必须置1CLKX和FSX的预分频器CLXCT, FSXCT才能获得输入时钟开始工作。务必在其他寄存器配置完成后最后开启此位。位1 (SGNEX)符号扩展控制当BYTE1即8位模式时有效。1将8位数据符号扩展为16位高位填充符号位。0高位填零。位0 (BYTE)数据字长选择。016位模式默认。18位模式。2.3 SSPMC寄存器多通道与计数器的开关SSPMC寄存器地址FFF3h专用于ESSP的增强功能。位15 (SSPRST)ESSP硬件复位。写1会复位发送/接收FIFO指针、移位寄存器以及除计数器逻辑外的所有ESSP逻辑。状态位会被清零但控制位如SSPCR不受影响。用于在需要彻底清空FIFO和状态时使用。位6 (SPI)SPI模式使能。置1时使能一个8/16位的伪SPI模式。此模式仅在突发模式且使用内部CLKX时可用。在该模式下CLKX仅在数据传输期间有效CLKR和FSR在内部分别连接到CLKX和FSX。位5-4 (CH1, CH0)通道数量选择。这是多通道模式的核心配置位。仅在MMODE1时有效。00单通道。仅使用FSX引脚上的FSX1。01双通道。使用FSXFSX1和CLKR引脚作为FSX2。FSX2在第一个通道数据LSB后的第二个CLKX周期产生。10三通道。使用FSXFSX1、CLKRFSX2和FSR引脚作为FSX3。FSX3在第二个通道数据LSB后的第二个CLKX周期产生。11四通道。使用全部四个帧同步引脚FSXFSX1、CLKRFSX2、FSRFSX3、IO0FSX4。FSX4在第三个通道数据LSB后的第二个CLKX周期产生。此时IO0引脚不可用作通用I/O。位3 (MMODE)多通道模式使能。0禁用多通道模式默认。1使能多通道模式。在此模式下FSX和CLKX在内部连接到FSR和CLKR引脚CLKR和FSR引脚变为输出用于产生FSX2和FSX3。位2 (GPI)通用计数器中断。置1时将SSP的XINT中断配置为16位计数器的中断当计数器减到0时触发。位1 (CHLT)16位计数器暂停位。0计数器运行默认。1计数器停止。位0 (GPC)通用计数器模式使能。0CLXCT和FSXCT作为独立的8位预分频器使用用于产生CLKX和FSX。1CLXCT和FSXCT合并为一个16位递减计数器。在此模式下预分频器不能再用于产生CLKX和FSX时钟。2.4 SSPCT寄存器与预分频计算SSPCT寄存器地址FFFBh是一个16位寄存器其低8位位7-0是CLKX预分频值CLXCT高8位位15-8是FSX预分频值FSXCT。CLKX频率计算当使用内部CLKX且使能预分频时CLKX的频率由CLKOUT1分频得到。公式为CLKX_rate CLKOUT1 / (2 * (CLXCT 1))例如CLKOUT140.96 MHzCLXCT9则CLKX_rate 40.96 MHz / (2*(91)) 2.048 MHz。这与手册表9-9中的示例一致。FSX频率计算FSX的频率由其输入时钟可以是CLKX预分频器输出也可以是外部CLKX引脚时钟和FSXCT值决定。公式为FSX_rate CLKX_pin_clock / (2 * (FSXCT 1))这里的CLKX_pin_clock需要根据你的时钟源选择来理解。如果CLKX来自内部预分频器即上述计算出的CLKX_rate那么它就是CLKX_rate。如果CLKX来自外部引脚它就是外部输入的时钟频率。多通道模式下的关键约束这是配置中最容易出错的地方在多通道模式下连续的帧同步脉冲FSX1, FSX2...之间必须间隔至少N * M个SCLK移位时钟周期其中N是通道数M是每个数据字传输所需的SCLK周期数16位模式为188位模式为10。这个间隔由FSX的频率周期来保证。对于16位数据FSX的周期必须 ≥ (18 * N) 个 SCLK 周期。对于8位数据FSX的周期必须 ≥ (10 * N) 个 SCLK 周期。 因此FSXCT的值不能随意设置。例如对于四通道16位模式FSX周期需≥72个SCLK周期。假设SCLK即CLKX为2.048 MHz则FSX最大频率为 2.048 MHz / 72 ≈ 28.44 kHz。根据FSX_rate公式反推FSXCT必须 ≥ 350x23。手册中特别用加粗文本框强调了这一点。3. 多通道模式配置实战以四通道16位CODEC为例现在我们结合一个典型应用场景TMS320C20x DSP需要连接四个相同的16位音频编解码器CODEC。所有CODEC工作于从模式Slave Mode即它们接收DSP提供的移位时钟SCLK和帧同步信号FS来同步数据传输。3.1 硬件连接与信号定义参考手册图9-14连接方式如下共享信号线DX(DSP输出) - 连接到所有CODEC的串行数据输入SDIN。DR(DSP输入) - 连接到所有CODEC的串行数据输出SDOUT。通常需要外部电阻做总线隔离。CLKX(DSP输出) - 连接到所有CODEC的移位时钟SCLK。独立的帧同步信号FSX- CODEC 1 的帧同步FS。CLKR(配置为FSX2输出) - CODEC 2 的帧同步。FSR(配置为FSX3输出) - CODEC 3 的帧同步。IO0(配置为FSX4输出) - CODEC 4 的帧同步。3.2 寄存器配置步骤与代码示例假设系统时钟CLKOUT1 40.96 MHz我们希望得到标准的音频采样率8 kHz帧同步频率和对应的移位时钟。根据手册表9-9一个常见的配置是CLKX 2.048 MHz FSX 8 kHz。步骤1计算预分频值CLXCT(用于生成CLKX):CLKX_rate CLKOUT1 / (2*(CLXCT1))2.048 MHz 40.96 MHz / (2*(CLXCT1))。解得CLXCT 9(0x09)。FSXCT(用于生成FSX):FSX_rate CLKX_pin_clock / (2*(FSXCT1))。此时CLKX_pin_clock就是我们刚生成的2.048 MHz。8 kHz 2.048 MHz / (2*(FSXCT1))。解得FSXCT 127(0x7F)。验证多通道时序对于四通道16位需要FSX周期 ≥ 72 SCLK。SCLK周期为 1/2.048 MHz ≈ 0.488 µs。FSX周期为 1/8 kHz 125 µs。125 µs / 0.488 µs ≈ 256个SCLK周期远大于72满足要求。FSXCT127也大于手册要求的最小值35。步骤2确定寄存器配置对应手册表9-11突发模式我们的目标配置是内部CLKX由预分频器产生、内部FSX由预分频器产生、四通道模式。这对应表9-11中的Option 10。SSPCR (FFF1h):FSM1 (内部FSX)MCM1 (内部CLKX)TXM1 (FSX为输出)SSPRST0 (正常操作)其他位根据需求设置如连续/突发模式此处假设为突发模式FSM1已满足SSPMC (FFF3h):CH11, CH01 (选择四通道)MMODE1 (使能多通道模式)SPI0 (禁用SPI模式)GPI0 (不使用计数器中断)GPC0 (预分频器用于时钟分频非计数器模式)SSPST (FFF2h):FSXOX1 (FSX来自FSXCT预分频器)PRSEN1 (最后使能预分频器)BYTE0 (16位模式)FSN, CLN 根据CODEC要求的帧同步和时钟极性设置通常为0下降沿有效。CLXOX在GPC0时无效。SSPCT (FFFBh):低字节 CLXCT 0x09高字节 FSXCT 0x7F步骤3编写初始化代码汇编示例; 假设寄存器地址定义 SSPCR .set 0FFF1h SSPST .set 0FFF2h SSPMC .set 0FFF3h SSPCT .set 0FFFBh ESSP_INIT: ; 1. 首先配置SSPCR选择内部时钟、帧同步FSX为输出 LDP #0h ; 设置数据页指针根据实际内存映射调整 SPLK #00001110b, SSPCR ; 假设FSM1, MCM1, TXM1 其他位为0突发模式 ; 2. 配置SSPMC使能四通道多通道模式 SPLK #00111000b, SSPMC ; CH11, CH01 (0b114), MMODE1 (13), 其他位为0 ; 位[5:4]11b, 位31 即 0011 1000b 38h ; 3. 配置SSPCT设置预分频值 SPLK #7F09h, SSPCT ; FSXCT7Fh (高字节), CLXCT09h (低字节) ; 4. 配置SSPST设置控制位但先不使能PRSEN ; 假设需要FSX高有效、CLKX下降沿采样则FSN0, CLN0 ; FSXOX1, PRSEN0 (先关闭), BYTE0 SPLK #0010000000000000b, SSPST ; 位13(FSXOX)1 即 0010 0000 0000 0000b 2000h ; 或者更清晰FSXOX1 (bit13)其他关键位为0 ; 5. 关键延迟至少一个CLKX周期确保时钟稳定 ; 由于PRSEN还未开启CLKX可能还没有。这里通常用几个NOP或软件延时循环。 NOP NOP NOP NOP ; 6. 最后使能预分频器置位PRSEN LACC SSPST OR #0000000100000000b ; 置位bit8 (PRSEN) SACL SSPST ; 写回SSPST此时PRSEN1时钟开始工作 RET实操心得在使能PRSEN前加入几个NOP或短延时是一个好习惯。虽然手册说需要“至少一个CLKX周期”但在时钟未启动时这个周期无法度量。加入延时可以确保之前对SSPST的配置如CLN, FSN在内部完全同步避免毛刺。3.3 数据收发流程与时序解读配置完成后ESSP的工作时序将如图9-16所示。我们结合该图分析FSX1 (FSX引脚)第一个脉冲到来启动通道1的数据传输。DSP从DX引脚移出通道1的16位数据给CODEC1同时从DR引脚移入来自CODEC1的16位数据。经过18个SCLK周期后FSX2 (CLKR引脚)产生脉冲启动通道2的数据传输。此时DX/DR线上的数据流是针对通道2的。再经过18个SCLKFSX3 (FSR引脚)启动通道3。再经过18个SCLKFSX4 (IO0引脚)启动通道4。完成四个通道的传输后会有一段空闲期直到下一个FSX1脉冲周期125µs到来开始新一帧的循环。数据操作在软件层面你只需要像操作单通道串口一样向SDTR寄存器连续写入四个数据字通道1到通道4的数据ESSP硬件会自动在对应的帧同步时刻将它们发送出去。接收亦然从SDTR连续读取四次得到的就是四个通道按顺序送入的数据。这种“打包”处理的方式大大简化了软件负担。4. 常见问题排查与调试技巧即便按照手册配置在实际调试中也可能遇到各种问题。以下是我总结的几个常见坑点及排查方法。4.1 问题一无数据收发或数据错位可能原因1时钟或帧同步未产生。排查用示波器测量CLKX和FSX1引脚。如果没有信号首先检查PRSEN位是否已置1。然后检查SSPCR的MCM和FSM位确保选择了内部时钟/帧同步源如果设计如此。最后确认CLXCT和FSXCT值是否过大导致频率过低或者计算错误导致频率为0例如预分频值设为0xFFFF。技巧初始化时可以先将CLXCT和FSXCT设为较小的值如0x00或0x01产生一个较高的频率便于在示波器上观察。确认功能正常后再调整为应用所需的值。可能原因2多通道时序不满足。现象只有第一个通道数据正确后续通道数据混乱或丢失。排查这是最典型的多通道配置错误。务必用公式校验FSXCT的值。计算FSX周期1/FSX_rate对应的SCLK个数是否大于18 * 通道数对于16位模式。例如四通道16位SCLK个数必须≥72。如果FSX频率太高周期太短后续通道的帧同步脉冲会落在前一个通道的数据传输期内造成冲突。解决增大FSXCT的值以降低FSX频率或者提高CLKX频率减小CLXCT但需在CODEC支持的SCLK频率范围内。可能原因3极性配置错误。排查用示波器同时观察CLKX、FSX1和DX。确认数据是在FSX有效边沿根据FSN位之后的第几个CLKX边沿根据CLN位开始移出的。与CODEC数据手册的时序图进行比对。常见的标准是FSX高电平脉冲后在CLKX的下降沿采样数据。这对应FSN0FSX高有效CLN0CLKX下降沿。4.2 问题二只能单向通信只能发或只能收可能原因在标准SSP模式下CLKR和FSR是输入引脚。但在ESSP多通道模式MMODE1下CLKR和FSR被内部连接到CLKX和FSX并作为输出引脚FSX2 FSX3。如果你仍然将这些引脚连接到从设备的时钟和帧同步输入而你的配置又使它们变成了输出就会发生冲突。解决检查硬件连接。在多通道模式下CLKR和FSR引脚应连接到从设备2和3的帧同步输入而非时钟输入。所有从设备的时钟输入都应接在DSP的CLKX引脚上。4.3 问题三使用预分频器时时钟频率不对可能原因1PRSEN使能顺序错误。手册明确强调PRSEN位应在SSPCT、SSPMC等寄存器配置完成后最后设置。如果先使能PRSEN再写预分频值计数器可能从旧值或不确定值开始计数导致初始频率错误。解决严格遵循初始化序列配置SSPCR - 配置SSPMC - 配置SSPCT - 配置SSPST但PRSEN0- 短暂延时 - 置位SSPST的PRSEN。可能原因2公式理解有误。注意CLKX_rate CLKOUT1 / (2*(CLXCT1))和FSX_rate CLKX_pin_clock / (2*(FSXCT1))中的“CLKX_pin_clock”需要明确。如果CLKX来源于内部预分频器MCM1且使用了CLXCT那么CLKX_pin_clock就等于上面公式计算出的CLKX_rate。如果CLKX来源于外部引脚MCM0那么CLKX_pin_clock就是外部输入的时钟频率此时CLXCT无效。技巧在计算时先在纸上画出时钟信号流向图明确每个分频环节的输入是什么。4.4 调试检查清单遇到ESSP问题时可以按以下清单逐步排查[ ]电源与复位DSP和所有外设供电是否正常复位信号是否稳定[ ]基本SSP配置SSPCR的FSM、MCM、TXM位是否与硬件设计内部/外部时钟、帧同步方向匹配[ ]ESSP功能使能SSPMC的MMODE位是否置1CH1/CH0通道数选择是否正确[ ]预分频器配置SSPCT的CLXCT、FSXCT值计算是否正确SSPST的FSXOX位是否设置正确预分频器产生FSXPRSEN位是否最后置1[ ]多通道时序根据当前CLKX频率和FSXCT值验证FSX周期是否满足(18*通道数)或(10*通道数)的约束。[ ]信号测量用示波器查看CLKX引脚是否有时钟频率对吗FSX1引脚是否有周期性的帧同步脉冲频率和脉宽对吗FSX2、FSX3、FSX4如果使能是否有输出相位是否依次偏移18/10个SCLKDX引脚在对应通道的FSX有效后是否有数据移出[ ]软件流程数据是否被正确地、连续地写入SDTR寄存器对于多通道需要连续写入多个字是否及时读取RDR寄存器以避免FIFO溢出最后保持耐心。串行通信调试示波器是你的最佳伙伴。通过抓取CLKX、FSX和DX的波形并与理论时序图对比大部分问题都能定位。ESSP的灵活性带来了复杂性但一旦掌握它能为你构建高效、紧凑的多外设DSP系统提供强大的支持。