DSP56002 SSI接口深度解析:网络模式与按需模式实战指南
1. 项目概述与SSI核心价值解析在嵌入式系统尤其是数字信号处理DSP领域处理器与外部世界的高速、可靠数据交换是系统成败的关键。同步串行接口Synchronous Serial Interface, SSI正是为此而生的核心技术。它不是简单的串口通信而是一种基于同步时钟的、全双工、高带宽的串行通信协议。其核心价值在于它通过共享的时钟信号SCK和帧同步信号FS确保了发送端和接收端在比特级和字级上的严格同步从而实现了高速、无差错的数据流传输。想象一下你正在构建一个多通道音频处理系统。多个音频编解码器Codec需要实时向DSP发送采集到的音频样本同时接收DSP处理后的音频数据。如果使用异步串口每个设备都需要自己的波特率发生器时钟漂移会导致数据错位。而SSI则像一个精准的指挥家用一个主时钟Master Clock和帧同步信号指挥所有设备在同一拍子上“演奏”——在特定的时间槽Time Slot内有序地发送或接收自己的数据字。这就是SSI网络模式Network Mode的典型应用场景它本质上是一个时分复用TDM总线。Motorola现NXP的DSP56002处理器集成了一个功能强大的SSI模块。它远不止是一个简单的移位寄存器接口。通过灵活配置其控制寄存器CRA, CRB你可以定义字长8/12/16/24位、帧内的字数2-32个、时钟极性、帧同步脉冲宽度字长或单比特甚至可以将某些控制引脚SC0, SC1配置为与数据同步的“标志位”Flags用于实现设备片选或传递控制信息。这种灵活性使得SSI能够无缝对接从简单的SPI设备到复杂的多设备TDM网络。本文将深入DSP56002 SSI的两种高级工作模式网络模式和按需模式。我们将不仅解读官方手册中的代码片段更会结合我十多年的嵌入式开发经验拆解其配置逻辑、时序关键点并分享在实际项目中调试此类接口时积累的“避坑指南”。无论你是正在调试一块音频板卡还是设计一个多处理器通信网络理解SSI的深层工作机制都将让你事半功倍。2. SSI工作机制深度剖析与模式选择要驾驭SSI必须首先理解其内部状态机和数据流。SSI模块可以看作是两个独立但可能同步工作的“流水线”发送流水线和接收流水线。每个流水线都包含一个数据寄存器TX/RX和一个移位寄存器。数据从TX寄存器加载到发送移位寄存器然后在SCK时钟驱动下从STD引脚逐位移出。相反数据从SRD引脚移入接收移位寄存器攒满一个字后自动转运到RX寄存器并置位“接收数据寄存器满”RDF标志。2.1 核心寄存器精解DSP56002通过两个24位内存映射寄存器控制SSI控制寄存器ACRA, X:$FFEC 这是SSI的“时钟与帧结构工程师”。PSR (Bit 15) PM[7:0] (Bits 7-0) 共同构成预分频器生成内部串行位时钟Bit Clock。计算公式为f_bit f_osc / (4 * (7*PSR 1) * (PM 1))。PSR选择是否进行8倍预分频0不分频18分频PM是8位分频系数1-256。例如在40MHz系统时钟下要得到2.048MHz的位时钟许多音频Codec的标准主时钟可以设置PSR0,PM4因为 40MHz / (415) 2.0MHz接近目标值。WL[1:0] (Bits 14-13) 字长选择。008位0112位1016位1124位。这决定了每个时间槽移入/移出多少位数据。DC[4:0] (Bits 12-8) 帧率分频控制在网络模式下它直接决定了每帧包含的时间槽数数值为DC1。例如DC00001表示每帧2个时间槽DC11111表示每帧32个时间槽。在普通模式下它决定了帧同步信号的周期字传输速率。控制寄存器BCRB, X:$FFED 这是SSI的“模式与引脚功能调度员”。MOD (Bit 11)模式选择核心。0为普通模式每帧只有一个有效时间槽1为网络模式每帧有多个时间槽由DC值定义。GCK (Bit 10) 时钟门控选择。0为连续时钟时钟始终运行1为门控时钟仅在传输数据时产生时钟脉冲。门控时钟节省功耗且帧同步信息隐含在时钟的启停中常用于SPI类设备。SYN (Bit 9) 同步/异步选择。0表示发送器和接收器使用独立的时钟和帧同步信号异步1表示共享同一套时钟和帧同步同步。在构建多设备网络时通常设为同步SYN1。FSL[1:0] (Bits 8-7) 帧同步脉冲长度。00字长帧同步脉冲持续整个字传输时间01发送帧同步为比特宽、接收为字长10均为比特宽11接收为比特宽、发送为字长。比特宽帧同步是一个短暂的脉冲出现在数据字开始之前。SCKD, SCD2, SCD1, SCD0 (Bits 5, 4, 3, 2) 分别控制SCK、SC2、SC1、SC0引脚的方向输入/输出。1输出内部生成0输入外部提供。这是配置主从设备的关键。2.2 网络模式 vs. 按需模式场景化选择网络模式Network Mode, MOD1是SSI的“团队协作”模式。它建立了一个基于时间槽的通信框架。一帧开始于一个帧同步脉冲FS随后是连续的DC1个时间槽每个时间槽传输一个字。每个设备被分配一个或多个固定的时间槽进行通信。其核心特点是周期性和确定性。典型应用 多路复用音频流如电话交换机PCM总线、传感器阵列数据采集、多DSP并行处理系统中的数据分发与收集。配置要点设置MOD1。根据网络中的设备数量或通道数设置DC值例如4个设备各占1槽则DC00011表示4槽/帧。通常设置SYN1同步所有设备共享主设备产生的SCK和FS。主设备设置SCKD1,SCD21输出时钟和帧同步从设备相应引脚设为输入。按需模式On-Demand Mode是网络模式的一个特例通过设置MOD1且DC00000来激活。这是SSI的“即时通话”模式。它没有固定的时间槽概念数据传输由事件即向TX寄存器写入数据驱动。一旦写入数据SSI立即或在下一个可用时钟边沿启动一次数据传输。传输完成后自动插入至少两个位时钟的空闲间隔以分隔数据字。典型应用 与SPI从设备通信、非周期性的命令/数据发送、作为通用高速移位寄存器接口。配置要点设置MOD1,DC00000。通常使用门控时钟GCK1因为时钟随数据产生和停止本身就是同步信号。在异步配置SYN0下可实现全双工通信发送和接收时钟独立。实操心得模式选择的陷阱新手常犯的错误是混淆模式。如果你需要与一个标准的SPI Flash或ADC通信应选择按需模式门控时钟并仔细匹配时钟极性和相位通过SHFD等位模拟SPI的CPOL和CPHA。如果你在调试一个多路音频系统却没有声音首先应检查是否错误地配置成了普通模式导致设备只在第一个时间槽工作其他槽的数据被忽略。一个快速判断的方法是用示波器观察帧同步信号。如果是周期性的固定脉冲序列是网络模式如果只在数据突发前出现是按需模式或普通模式。3. 网络模式实战构建一个TDM音频传输系统让我们以手册中的图6-78和图6-79为例构建一个简化的双通道左/右音频数据传输系统。假设DSP1是主发送器DSP2是从接收器它们共享时钟和帧同步每帧包含2个时间槽左声道和右声道。3.1 主设备发送端配置与代码逐行解析手册图6-78的代码展示了网络模式发送。我们对其进行增强和注释;************************************************* ; SSI 主设备发送端配置 (网络模式双时间槽) ; 目标每帧发送两个16位音频字左、右声道 ; 硬件连接DSP1 (Master) - DSP2 (Slave) ; SCK, FS 由 DSP1 输出 ; STD - SRD, SRD - STD (全双工) ;************************************************* ; 1. 寄存器地址定义 IPR EQU $FFFF ; 中断优先级寄存器 CRA EQU $FFEC ; SSI控制寄存器A CRB EQU $FFED ; SSI控制寄存器B PCC EQU $FFE1 ; 端口C控制寄存器 TX EQU $FFEF ; 发送数据寄存器 TSR EQU $FFEE ; 时间槽寄存器写入即禁用该槽发送 SSISR EQU $FFEE ; SSI状态寄存器读取 FLG EQU $0010 ; 自定义标志位存储地址 ; 2. 数据缓冲区初始化 ORG X:0 LeftData DC $AAAA00 ; 左声道测试数据 DC $333300 DC $CCCC00 DC $F0F000 RightData DC $555500 ; 右声道测试数据 DC $999900 DC $666600 DC $0F0F00 ; 3. 中断向量表设置 - 发送数据寄存器空中断 ORG P:$0010 ; SSI发送中断向量地址 JSR XMT_ISR ; 使用长跳转因为ISR需要多条指令 ; 4. 主程序初始化 ORG P:$40 START MOVE #LeftData, R0 ; R0指向左声道数据缓冲区 MOVE #RightData, R1 ; R1指向右声道数据缓冲区 MOVE #3, M0 ; 缓冲区大小为4模数设为3实现循环 MOVE #3, M1 MOVE #0, X0 MOVE X0, X:FLG ; 标志初始化0发送右声道1发送左声道 ; 5. 配置SSI控制寄存器 MOVEP #$3000, X:IPR ; 设置SSI中断优先级 ; CRA配置: WL16位(10), DC1 (2个时间槽/帧), 时钟预分频 ; 假设系统时钟40MHz目标位时钟2.5MHz: PM (40e6/(4*1*2.5e6))-1 3 MOVEP #$4213, X:CRA ; PSR0, WL10(16位), DC00001(2槽), PM3 ; CRB配置: 使能发送中断和发送器网络模式同步连续时钟帧同步和时钟输出 MOVEP #$5B34, X:CRB ; RIE0, TIE1, RE0, TE1, MOD1, GCK0, SYN1, ; FSL00(字长帧同步), SHFD0(MSB先), SCKD1, SCD21 ; 6. 启用SSI端口并开启中断 ANDI #$FC, MR ; 清除中断屏蔽位(I1,I0)允许中断 MOVEP #$01F8, X:PCC ; 使能PC8(STD), PC7(SRD), PC6(SCK), PC5(SC2)为SSI功能 ; PC3(SC0)仍为GPIO用作通道标志输出 ; 7. 写入第一个数据并等待中断循环 MOVE X:(R1), X0 ; 预先加载右声道第一个数据 MOVEP X0, X:TX ; 写入TX启动传输第一个时间槽 WAIT_LOOP JMP WAIT_LOOP ; 主循环实际应用中此处可进行其他处理关键点解析与避坑指南时间槽对齐在网络模式中写入TX寄存器的数据将在下一个帧同步脉冲后的对应时间槽被发送出去。中断服务程序ISR必须在当前字发送完成、下一个时间槽开始前为下一个时间槽准备好数据。手册流程图图6-76中的“SLOTCT1”软件计数器必须与硬件状态严格同步。标志位Flag的使用代码利用SC0引脚作为输出标志通过OF0控制在发送左声道数据时拉高右声道时拉低。接收端图6-79通过读取SSISR中的IF0位来判断当前时间槽的数据属于哪个声道。这是一种非常高效的硬件辅助数据路由方法避免了在数据包中添加软件包头。TSR寄存器的妙用TSR时间槽寄存器是一个“哑”寄存器。向TSR写入任何值都会使SSI在下一个时间槽将STD引脚置为高阻态。这在多主设备共享总线的TDM网络中至关重要用于“让出”不属于自己的时间槽防止总线冲突。图6-78中左声道时间槽就是通过写入TSR来禁用的。中断服务程序ISR细节XMT_ISR JSET #0, X:FLG, SEND_LEFT ; 检查标志决定发送哪个声道 SEND_RIGHT BCLR #0, X:CRB ; 设置OF00指示右声道 MOVEP X:(R1), X:TX ; 发送右声道数据 MOVE #1, X0 MOVE X0, X:FLG ; 更新标志为左声道 RTI SEND_LEFT BSET #0, X:CRB ; 设置OF01指示左声道 MOVEP X0, X:TSR ; 禁用发送左声道槽由其他设备占用 MOVE #0, X0 MOVE X0, X:FLG ; 更新标志为右声道 RTI注意修改CRB中的OF0位会立即更新SC0引脚输出吗不会。根据手册图6-87输出标志是双缓冲的其更新发生在数据从TX寄存器转移到发送移位寄存器的时刻即下一个帧同步边沿。这保证了标志与数据的严格同步。3.2 从设备接收端配置解析接收端图6-79的配置与发送端镜像但关键区别在于时钟和帧同步方向SCKD0,SCD20表示SCK和SC2帧同步配置为输入从主设备接收。启用接收RE1,RIE1使能接收器和接收中断。数据路由在中断服务程序中通过判断SSISR的IF0位对应SC0输入标志将数据存入左或右缓冲区。一个常见的调试问题如果接收端收不到数据或者数据错位请按以下顺序检查物理连接用示波器确认SCK、FS、STD、SRD线路连接正确信号质量良好无过冲或振铃。主从时钟同步确认主设备SCKD1输出从设备SCKD0输入。一个常见的错误是两端都配置为输出导致总线冲突。帧同步极性/宽度确认主从设备的FSL1、FSL0设置一致。如果主设备发送比特宽帧同步FSL11而从设备期望字宽FSL10接收将完全无法同步。字长匹配确认两端的WL1、WL0设置相同。16位发送配24位接收会导致数据错位和持续的超限错误。4. 按需模式实战模拟SPI主设备通信按需模式MOD1,DC00000是连接标准SPI从设备如Flash、ADC、DAC的利器。手册图6-85和图6-86展示了两个DSP之间使用按需模式进行点对点全双工通信。我们将其适配为DSP作为SPI主设备与外部ADC通信的场景。4.1 配置SPI主设备发送端假设我们需要以SPI模式0CPOL0, CPHA0与一个16位ADC通信。这意味着时钟空闲时为低电平数据在时钟上升沿采样下降沿变化。;************************************************* ; SSI 按需模式配置 (作为SPI主设备) ; 目标向ADC发送控制字并读取转结果 ; 硬件连接DSP (Master) - ADC (Slave) ; SCK - SCK, STD - MOSI, SRD - MISO ; PC3 (GPIO) - ADC /CS ;************************************************* CRA EQU $FFEC CRB EQU $FFED PCC EQU $FFE1 PCDDR EQU $FFE3 ; 端口C数据方向寄存器 PCD EQU $FFE5 ; 端口C数据寄存器 SSISR EQU $FFEE TX EQU $FFEF RX EQU $FFEF ORG P:$40 MOVE #0, R0 ; 数据缓冲区指针 MOVE #2, M0 ; 模3循环缓冲区 ; 1. 配置GPIO (PC3作为片选输出) MOVEP #$08, X:PCDDR ; 设置PC3为输出(0000 1000) ; 2. 配置SSI为按需模式、门控时钟、同步全双工 ; CRA: 16位字长DC0按需模式设置时钟分频 MOVEP #$401F, X:CRA ; WL10(16位), DC00000, PM31 (低速示例) ; CRB: 使能收发网络模式门控时钟同步内部时钟输出 ; SHFD0 (MSB先符合多数SPI设备)帧同步长度无关门控时钟下 MOVEP #$1E30, X:CRB ; RIE0, TIE0(轮询), RE1, TE1, MOD1, ; GCK1, SYN1, FSL00, SHFD0, SCKD1, SCD21 ; 3. 启用SSI端口引脚 MOVEP #$01F8, X:PCC ; 使能SCK, SC2, STD, SRD ; 4. 主程序循环拉低片选发送控制字等待接收拉高片选 LOOP BSET #3, X:PCD ; 拉低PC3 (ADC片选有效) MOVE #$8000, X0 ; ADC控制字启动转换通道0 MOVEP X0, X:TX ; 写入TX启动SPI传输时钟开始输出 ; 轮询等待发送完成也可用中断 TDE_WAIT JCLR #6, X:SSISR, TDE_WAIT ; 等待TDE1 ; 此时16个时钟脉冲已发出ADC的转换结果也应通过MISO移入 ; 轮询等待接收完成 RDF_WAIT JCLR #7, X:SSISR, RDF_WAIT ; 等待RDF1 MOVEP X:RX, X:(R0) ; 读取ADC转换结果 BCLR #3, X:PCD ; 拉高PC3 (ADC片选无效) REP #100 ; 延时准备下一次转换 NOP JMP LOOP按需模式关键特性与调试技巧自动插入空闲位在按需模式下SSI在每次传输结束后自动插入至少两个位时钟周期的空闲时间见图6-81注释。这完美模拟了SPI传输中两次操作之间的片选保持时间或空闲时间无需软件延时。门控时钟即帧同步在GCK1时时钟线本身在无数据传输时为静态低电平CPOL0。开始传输时时钟才开始跳动。这意味着不需要独立的帧同步信号时钟的启停本身就定义了数据帧的边界。SC2引脚在此模式下可复用为GPIO如用作另一个片选。全双工通信尽管是“发送”启动传输但由于SYN1且RE1接收移位寄存器也在同步工作。在发送控制字的同时ADC的数据也通过MISO线被移入接收寄存器。一次MOVEP X0, X:TX操作同时完成了写和读。时序匹配确保SSI的时钟极性、相位与SPI从设备匹配。SHFD控制位序SCK的空闲状态由硬件决定通常为低。如果设备要求在时钟上升沿采样CPHA0则SSI的配置数据在时钟下降沿变化是符合的。如果设备要求其他模式可能需要调整SHFD或结合外部逻辑。深度避坑按需模式下的“虚假”帧同步在按需模式且使用内部帧同步输出SCD21时即使GCK1SC2引脚仍会在每次传输开始时产生一个短暂的帧同步脉冲。如果你将此引脚连接到对帧同步敏感的器件如某些Codec可能会引发意外行为。解决方案如果不需帧同步可将SC2引脚配置为GPIOCC50或者确保从设备忽略此信号。5. 高级应用与故障排查实录5.1 使用标志位Flags构建智能外设网络手册图6-88展示了一个经典应用利用SC0和SC1作为输出标志实现一个免逻辑芯片的双Codec扬声器电话系统。两个Codec的发送线TXI被“线与”在一起连接到DSP的SRD。DSP通过OF0和OF1在发送数据字开始时同时输出两个标志位来选通其中一个Codec的接收使能端RCE。这样DSP可以分时与两个Codec通信。配置核心; 设置CRB启用标志输出功能 MOVEP #$533C, X:CRB ; SYN1, SCD11, SCD01, OF1/OF0根据需要设置在发送中断服务程序中在写入TX之前先更新CRB中的OF1和OF0位以选择目标Codec。标志位的更新与数据发送严格同步避免了Codec选通信号与数据流不同步导致的毛刺或数据错位。5.2 常见问题排查速查表以下是我在多年项目中总结的SSI问题排查清单现象可能原因排查步骤与解决方案完全无数据收发1. SSI模块未激活2. 时钟或帧同步无信号3. 引脚功能未配置1. 检查PCC寄存器对应引脚位必须设为1SSI功能。2. 用示波器测量SCK、FS引脚。确认主设备SCKD1/SCD21从设备SCKD0/SCD20。3. 确认TE和/或RE已置1。数据错位位偏移1. 字长WL不匹配2. 移位方向SHFD不匹配3. 帧同步脉冲宽度不匹配1. 核对主从设备CRA中WL1、WL0设置。2. 核对SHFD位。通常MSB先出SHFD0。3. 用示波器观察FS脉冲宽度核对FSL1、FSL0设置。只能收到第一个字后续丢失1. 接收超限Overrun2. 中断服务程序未及时读取RX1. 检查SSISR的ROE位。如果置1表示RX未及时读取新数据被丢弃。2.确保在下一个数据字完全移入前即下一个RDF置位前读取当前RX。在网络模式中时间窗口很紧。发送数据重复1. 发送欠载Underrun2. 未及时写入新数据到TX1. 检查SSISR的TUE位。如果置1表示TX为空时新时间槽开始导致旧数据重发。2. 在发送中断TDE中必须为下一个时间槽准备好数据写入TX或TSR。按需模式时钟持续运行DC寄存器未设置为0按需模式必须满足MOD1且DC00000。任何非零值都会使其进入多时间槽网络模式时钟会周期性运行。标志位SC0/SC1输出不正常1. 未配置为输出2. 未在同步模式3. 更新时机错误1. 确认SCD1/SCD01。2. 确认SYN1。标志功能仅在同步模式下有效。3. 标志在数据从TX加载到移位寄存器时更新。应在写入TX之前更新OFx位。5.3 性能优化与资源管理中断 vs. 轮询对于高数据率或低延迟应用必须使用中断。但中断响应时间必须小于一个时间槽的持续时间。例如16位数据位时钟2MHz则一个时间槽为8µs。你需要确保最坏情况下的中断延迟小于8µs。否则应采用DMA如果支持或更高效的中断服务程序使用快速中断模式仅用2条指令。缓冲区管理在网络模式中使用循环缓冲区通过M寄存器设置模寻址是管理多时间槽数据流的有效方法。确保缓冲区大小是时间槽数的整数倍并注意指针的回绕。时钟精度SSI的内部时钟由系统时钟分频而来。如果需要非常精确的串行时钟如用于音频的44.1kHz或48kHz系列需要仔细计算分频系数或使用外部高精度时钟源。公式f_bit f_osc / (4 * (7*PSR 1) * (PM 1))是计算的基础。SSI接口的灵活性是其强大之处但也带来了配置的复杂性。最好的学习方式是在真实的硬件上结合示波器或逻辑分析仪观察SCK、FS、STD、SRD以及标志位上的信号将寄存器配置与实际的波形一一对应起来。从最简单的按需模式点对点通信开始逐步过渡到复杂的多设备网络模式你会逐渐体会到这种同步串行接口在构建高效、可靠嵌入式系统时的巨大优势。