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:
控制寄存器A(CRA, 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=不分频,1=8分频),PM是8位分频系数(1-256)。例如,在40MHz系统时钟下,要得到2.048MHz的位时钟(许多音频Codec的标准主时钟),可以设置PSR=0,PM=4(因为 40MHz / (415) = 2.0MHz,接近目标值)。 - WL[1:0] (Bits 14-13): 字长选择。
00=8位,01=12位,10=16位,11=24位。这决定了每个时间槽移入/移出多少位数据。 - DC[4:0] (Bits 12-8): 帧率分频控制,在网络模式下,它直接决定了每帧包含的时间槽数,数值为
DC+1。例如,DC=00001表示每帧2个时间槽,DC=11111表示每帧32个时间槽。在普通模式下,它决定了帧同步信号的周期(字传输速率)。
控制寄存器B(CRB, X:$FFED): 这是SSI的“模式与引脚功能调度员”。
- MOD (Bit 11):模式选择核心。
0为普通模式(每帧只有一个有效时间槽),1为网络模式(每帧有多个时间槽,由DC值定义)。 - GCK (Bit 10): 时钟门控选择。
0为连续时钟(时钟始终运行),1为门控时钟(仅在传输数据时产生时钟脉冲)。门控时钟节省功耗,且帧同步信息隐含在时钟的启停中,常用于SPI类设备。 - SYN (Bit 9): 同步/异步选择。
0表示发送器和接收器使用独立的时钟和帧同步信号(异步),1表示共享同一套时钟和帧同步(同步)。在构建多设备网络时,通常设为同步(SYN=1)。 - 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, MOD=1)是SSI的“团队协作”模式。它建立了一个基于时间槽的通信框架。一帧开始于一个帧同步脉冲(FS),随后是连续的DC+1个时间槽,每个时间槽传输一个字。每个设备被分配一个或多个固定的时间槽进行通信。其核心特点是周期性和确定性。
- 典型应用: 多路复用音频流(如电话交换机PCM总线)、传感器阵列数据采集、多DSP并行处理系统中的数据分发与收集。
- 配置要点:
- 设置
MOD=1。 - 根据网络中的设备数量或通道数,设置
DC值(例如,4个设备各占1槽,则DC=00011,表示4槽/帧)。 - 通常设置
SYN=1(同步),所有设备共享主设备产生的SCK和FS。 - 主设备设置
SCKD=1,SCD2=1(输出时钟和帧同步),从设备相应引脚设为输入。
- 设置
按需模式(On-Demand Mode)是网络模式的一个特例,通过设置MOD=1且DC=00000来激活。这是SSI的“即时通话”模式。它没有固定的时间槽概念,数据传输由事件(即向TX寄存器写入数据)驱动。一旦写入数据,SSI立即(或在下一个可用时钟边沿)启动一次数据传输。传输完成后,自动插入至少两个位时钟的空闲间隔,以分隔数据字。
- 典型应用: 与SPI从设备通信、非周期性的命令/数据发送、作为通用高速移位寄存器接口。
- 配置要点:
- 设置
MOD=1,DC=00000。 - 通常使用门控时钟(
GCK=1),因为时钟随数据产生和停止,本身就是同步信号。 - 在异步配置(
SYN=0)下,可实现全双工通信,发送和接收时钟独立。
- 设置
实操心得:模式选择的陷阱新手常犯的错误是混淆模式。如果你需要与一个标准的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配置: WL=16位(10), DC=1 (2个时间槽/帧), 时钟预分频 ; 假设系统时钟40MHz,目标位时钟2.5MHz: PM = (40e6/(4*1*2.5e6))-1 = 3 MOVEP #$4213, X:CRA ; PSR=0, WL=10(16位), DC=00001(2槽), PM=3 ; CRB配置: 使能发送中断和发送器,网络模式,同步,连续时钟,帧同步和时钟输出 MOVEP #$5B34, X:CRB ; RIE=0, TIE=1, RE=0, TE=1, MOD=1, GCK=0, SYN=1, ; FSL=00(字长帧同步), SHFD=0(MSB先), SCKD=1, SCD2=1 ; 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 ; 设置OF0=0,指示右声道 MOVEP X:(R1)+, X:TX ; 发送右声道数据 MOVE #1, X0 MOVE X0, X:FLG ; 更新标志为左声道 RTI SEND_LEFT BSET #0, X:CRB ; 设置OF0=1,指示左声道 MOVEP X0, X:TSR ; 禁用发送(左声道槽由其他设备占用) MOVE #0, X0 MOVE X0, X:FLG ; 更新标志为右声道 RTICRB中的OF0位会立即更新SC0引脚输出吗?不会。根据手册图6-87,输出标志是双缓冲的,其更新发生在数据从TX寄存器转移到发送移位寄存器的时刻,即下一个帧同步边沿。这保证了标志与数据的严格同步。
3.2 从设备(接收端)配置解析
接收端(图6-79)的配置与发送端镜像,但关键区别在于:
- 时钟和帧同步方向:
SCKD=0,SCD2=0,表示SCK和SC2(帧同步)配置为输入,从主设备接收。 - 启用接收:
RE=1,RIE=1,使能接收器和接收中断。 - 数据路由:在中断服务程序中,通过判断
SSISR的IF0位(对应SC0输入标志),将数据存入左或右缓冲区。
一个常见的调试问题:如果接收端收不到数据,或者数据错位,请按以下顺序检查:
- 物理连接:用示波器确认SCK、FS、STD、SRD线路连接正确,信号质量良好,无过冲或振铃。
- 主从时钟同步:确认主设备
SCKD=1(输出),从设备SCKD=0(输入)。一个常见的错误是两端都配置为输出,导致总线冲突。 - 帧同步极性/宽度:确认主从设备的
FSL1、FSL0设置一致。如果主设备发送比特宽帧同步(FSL1=1),而从设备期望字宽(FSL1=0),接收将完全无法同步。 - 字长匹配:确认两端的
WL1、WL0设置相同。16位发送配24位接收会导致数据错位和持续的超限错误。
4. 按需模式实战:模拟SPI主设备通信
按需模式(MOD=1,DC=00000)是连接标准SPI从设备(如Flash、ADC、DAC)的利器。手册图6-85和图6-86展示了两个DSP之间使用按需模式进行点对点全双工通信。我们将其适配为DSP作为SPI主设备与外部ADC通信的场景。
4.1 配置SPI主设备(发送端)
假设我们需要以SPI模式0(CPOL=0, CPHA=0)与一个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位字长,DC=0(按需模式),设置时钟分频 MOVEP #$401F, X:CRA ; WL=10(16位), DC=00000, PM=31 (低速示例) ; CRB: 使能收发,网络模式,门控时钟,同步,内部时钟输出 ; SHFD=0 (MSB先,符合多数SPI设备),帧同步长度无关(门控时钟下) MOVEP #$1E30, X:CRB ; RIE=0, TIE=0(轮询), RE=1, TE=1, MOD=1, ; GCK=1, SYN=1, FSL=00, SHFD=0, SCKD=1, SCD2=1 ; 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 ; 等待TDE=1 ; 此时,16个时钟脉冲已发出,ADC的转换结果也应通过MISO移入 ; 轮询等待接收完成 RDF_WAIT JCLR #7, X:SSISR, RDF_WAIT ; 等待RDF=1 MOVEP X:RX, X:(R0)+ ; 读取ADC转换结果 BCLR #3, X:PCD ; 拉高PC3 (ADC片选无效) REP #100 ; 延时,准备下一次转换 NOP JMP LOOP按需模式关键特性与调试技巧:
- 自动插入空闲位:在按需模式下,SSI在每次传输结束后,自动插入至少两个位时钟周期的空闲时间(见图6-81注释)。这完美模拟了SPI传输中两次操作之间的片选保持时间或空闲时间,无需软件延时。
- 门控时钟即帧同步:在
GCK=1时,时钟线本身在无数据传输时为静态低电平(CPOL=0)。开始传输时,时钟才开始跳动。这意味着不需要独立的帧同步信号,时钟的启停本身就定义了数据帧的边界。SC2引脚在此模式下可复用为GPIO(如用作另一个片选)。 - 全双工通信:尽管是“发送”启动传输,但由于
SYN=1且RE=1,接收移位寄存器也在同步工作。在发送控制字的同时,ADC的数据也通过MISO线被移入接收寄存器。一次MOVEP X0, X:TX操作,同时完成了写和读。 - 时序匹配:确保SSI的时钟极性、相位与SPI从设备匹配。
SHFD控制位序,SCK的空闲状态由硬件决定(通常为低)。如果设备要求在时钟上升沿采样(CPHA=0),则SSI的配置(数据在时钟下降沿变化)是符合的。如果设备要求其他模式,可能需要调整SHFD或结合外部逻辑。
深度避坑:按需模式下的“虚假”帧同步在按需模式且使用内部帧同步输出(
SCD2=1)时,即使GCK=1,SC2引脚仍会在每次传输开始时产生一个短暂的帧同步脉冲。如果你将此引脚连接到对帧同步敏感的器件(如某些Codec),可能会引发意外行为。解决方案:如果不需帧同步,可将SC2引脚配置为GPIO(CC5=0),或者确保从设备忽略此信号。
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 ; SYN=1, SCD1=1, SCD0=1, OF1/OF0根据需要设置在发送中断服务程序中,在写入TX之前,先更新CRB中的OF1和OF0位,以选择目标Codec。标志位的更新与数据发送严格同步,避免了Codec选通信号与数据流不同步导致的毛刺或数据错位。
5.2 常见问题排查速查表
以下是我在多年项目中总结的SSI问题排查清单:
| 现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 完全无数据收发 | 1. SSI模块未激活 2. 时钟或帧同步无信号 3. 引脚功能未配置 | 1. 检查PCC寄存器,对应引脚位必须设为1(SSI功能)。2. 用示波器测量SCK、FS引脚。确认主设备 SCKD=1/SCD2=1,从设备SCKD=0/SCD2=0。3. 确认 TE和/或RE已置1。 |
| 数据错位(位偏移) | 1. 字长(WL)不匹配 2. 移位方向(SHFD)不匹配 3. 帧同步脉冲宽度不匹配 | 1. 核对主从设备CRA中WL1、WL0设置。2. 核对 SHFD位。通常MSB先出(SHFD=0)。3. 用示波器观察FS脉冲宽度,核对 FSL1、FSL0设置。 |
| 只能收到第一个字,后续丢失 | 1. 接收超限(Overrun) 2. 中断服务程序未及时读取 RX | 1. 检查SSISR的ROE位。如果置1,表示RX未及时读取,新数据被丢弃。2.确保在下一个数据字完全移入前(即下一个RDF置位前),读取当前 RX。在网络模式中,时间窗口很紧。 |
| 发送数据重复 | 1. 发送欠载(Underrun) 2. 未及时写入新数据到 TX | 1. 检查SSISR的TUE位。如果置1,表示TX为空时新时间槽开始,导致旧数据重发。2. 在发送中断(TDE)中,必须为下一个时间槽准备好数据(写入 TX或TSR)。 |
| 按需模式时钟持续运行 | DC寄存器未设置为0 | 按需模式必须满足MOD=1且DC=00000。任何非零值都会使其进入多时间槽网络模式,时钟会周期性运行。 |
| 标志位(SC0/SC1)输出不正常 | 1. 未配置为输出 2. 未在同步模式 3. 更新时机错误 | 1. 确认SCD1/SCD0=1。2. 确认 SYN=1。标志功能仅在同步模式下有效。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以及标志位上的信号,将寄存器配置与实际的波形一一对应起来。从最简单的按需模式点对点通信开始,逐步过渡到复杂的多设备网络模式,你会逐渐体会到这种同步串行接口在构建高效、可靠嵌入式系统时的巨大优势。
