深入解析i.MX21 SSI同步串行接口:从架构原理到寄存器编程实战

发布时间:2026/6/13 16:55:18

深入解析i.MX21 SSI同步串行接口:从架构原理到寄存器编程实战 1. 项目概述在嵌入式音频和高速数据流处理领域同步串行接口SSI扮演着至关重要的角色。它不像我们常见的UART那样依赖起止位而是通过一个共享的时钟信号让发送方和接收方在精确的节拍下交换数据从而实现高效、低延迟的通信。今天我们就以飞思卡尔现恩智浦的i.MX21处理器为例深入拆解其内置的SSI模块。这个模块不仅是连接音频编解码器Codec的桥梁更是理解同步串行通信原理的绝佳样板。很多工程师在初次接触SSI时往往被其众多的寄存器、复杂的时钟配置和多样的工作模式所困扰。本文将从一个实际开发者的视角带你从信号定义、架构原理一路深入到寄存器编程的每一个细节并分享我在调试过程中积累的实战经验和避坑指南。无论你是正在为i.MX21开发音频驱动还是希望深入理解同步串行通信的底层机制这篇文章都将为你提供一份详尽的路线图。2. SSI核心架构与信号解析2.1 信号定义与物理连接i.MX21的SSI模块并不直接连接到芯片的引脚上而是通过一个叫做数字音频复用器AUDMUX的模块进行路由。这带来了极大的灵活性AUDMUX可以将两个SSI模块内部互联或者将它们连接到外部不同的编解码器或其它SSI设备上。理解这个连接关系是硬件设计和软件初始化的第一步。SSI接口的核心信号线并不多但每一条都至关重要。我们可以将其分为数据线、时钟线和控制线三类数据线SSI_STXD串行发送数据线。这是SSI模块的数据输出引脚将移位寄存器中的数据一位一位地发送出去。SSI_SRXD串行接收数据线。这是SSI模块的数据输入引脚用于接收外部设备发送过来的串行数据。时钟与同步线SSI_STCK/SSI_SRCK发送/接收位时钟。这是同步通信的“心跳”。数据在时钟的每个上升沿或下降沿进行采样和移出。在同步模式下发送和接收共用STCK。SSI_STFS/SSI_SRFS发送/接收帧同步信号。这个信号标志着一个数据帧通常对应一个音频通道的采样点的开始。在I2S模式下它通常对应左右声道选择信号WS。系统信号IPG_CLK这是SSI模块内部IP总线接口的工作时钟用于寄存器访问和内部状态机的运行。这里有一个非常重要的限制无论你是使用内部生成的位时钟还是从外部引入的位时钟其频率绝对不能超过IPG_CLK频率的四分之一。违反这个规则会导致数据错乱这是很多新手容易忽略的硬件约束。注意在i.MX21中模块的时钟门控功能即动态开关模块时钟以省电是由PLL时钟控制器PCCR0寄存器统一管理的SSI控制寄存器SCR中的SSIEN位虽然能启用模块功能但不直接控制时钟的开关。这意味着即使软件禁用了SSI其时钟可能依然存在在设计低功耗方案时需要留意。2.2 内部架构框图解读参考手册中的框图是理解SSI如何工作的钥匙。整个模块可以清晰地划分为发送和接收两条独立且对称的数据通路。发送通路的数据流是这样的CPU或DMA将待发送的音频数据写入发送数据寄存器STX0或STX1。这些寄存器实际上是两个独立的8x24位FIFO先进先出缓冲区的入口。数据从FIFO被加载到发送移位寄存器TXSR中。在帧同步信号有效期间TXSR在每一位时钟的驱动下将数据从SSI_STXD引脚依次移出。发送时钟控制寄存器STCCR和发送配置寄存器STCR共同决定了时钟的来源内部生成或外部输入、极性、相位以及数据对齐方式。接收通路则是一个相反的过程从SSI_SRXD引脚输入的串行数据在接收时钟的同步下被移入接收移位寄存器RXSR。当移满一个完整的数据字长度由WL[3:0]定义后数据被传输到接收FIFO同样是8x24位进而可供CPU或DMA从接收数据寄存器SRX0或SRX1中读取。接收端的配置由SRCCR和SRCR寄存器控制。这种对称的、带有FIFO缓冲的架构使得SSI能够以全双工方式稳定工作有效缓解了由于CPU响应不及时导致的数据溢出Overrun或下溢Underrun问题。2.3 核心时钟树与生成机制SSI的时钟系统是其“同步”特性的核心理解它才能正确配置通信速率。SSI涉及几种不同的时钟位时钟Bit Clock最基础的时钟直接控制数据位上串行移位的节奏。每个位时钟周期对应一位数据的传输。字时钟Word Clock这是一个内部衍生时钟由位时钟经过一个“字长分频器”产生。字长就是一次传输的数据位数例如16位、24位。字时钟的一个周期正好对应一个完整数据字的传输完成。帧同步时钟Frame Sync通常就是我们看到的STFS或SRFS信号。它由字时钟再经过一个“帧率分频器”产生。一个帧同步周期内可以传输多个数据字在Network网络模式下对于立体声音频通常一帧包含左、右两个声道的数据字。i.MX21的SSI内置了灵活的时钟发生器。位时钟可以由外部设备提供从STCK/SRCK引脚输入也可以由内部生成。内部生成时其源时钟可以是ccm_ssi_clk来自芯片时钟管理模块CCM的专用时钟也可以是IPG_CLK。源时钟会先后经过一个可选的固定预分频器PSR位控制1分频或8分频和一个可编程预分频器PM[7:0]1-256分频最终产生所需的位时钟。计算公式可以简化为位时钟频率 源时钟频率 / [(PSR? 1:8) * (PM1)]。帧同步频率则在此基础上再除以字长和帧率分频值DC[4:0]。在配置时必须确保最终计算出的位时钟频率满足前述的“不超过IPG_CLK/4”的硬性限制。3. 寄存器编程详解与配置流程理解了架构和时钟我们就可以动手配置寄存器了。i.MX21的SSI寄存器映射到两个基地址SSI1在0x1001_0000SSI2在0x1001_1000。所有寄存器都是32位宽度但有效位可能较少。3.1 核心控制寄存器SCR配置SSI控制寄存器SCR是模块的总开关和模式选择器。上电后第一个操作通常是将其清零进行软复位SSIEN0然后按需配置其他位最后再打开总使能SSIEN1。SSIEN(Bit 0)模块总使能。务必注意在SSIEN0时虽然模块功能关闭但写入STX寄存器的数据并不会丢失它们会被保护起来直到模块使能后再参与传输。这为避免初始化过程中的数据混乱提供了保障。TE/RE(Bit 1/2)发送/接收使能。一个常见的操作顺序是先配置好所有参数并填充发送FIFO然后同时使能TE和RE如果需全双工。停止发送时清除TE后模块会完成当前TXSR中数据的发送后再真正停止。NET(Bit 3)网络模式使能。这是SSI与简单I2S模式的关键区别。I2S通常一帧只有左右两个时隙Slot而网络模式支持最多32个时隙适用于多通道音频或时分复用数据流。SYN(Bit 4)同步模式。置1后发送和接收部分将共享同一个时钟STCK和帧同步STFS此时SRCK和SRFS引脚可能被用作其它功能如输出系统时钟。I2S_MODE[1:0](Bits 6:5)I2S模式选择。00为Normal模式非I2S01为I2S Master模式SSI提供时钟和WS10为I2S Slave模式SSI接收外部时钟和WS。在I2S模式下帧同步信号的行为是固定的与Network模式不同。TCH_EN(Bit 8)双通道操作使能。此模式需与网络模式结合使用。当使能后SSI会交替使用STX0/SRX0和STX1/SRX1来处理偶数号和奇数号时隙的数据从而高效利用两个FIFO。关键点此模式仅在激活的时隙数为偶数时推荐使用。如果时隙数为奇数应禁用此模式所有数据将通过FIFO0处理。3.2 时钟控制寄存器STCCR/SRCCR配置发送和接收时钟控制寄存器结构相同分别控制各自的时钟生成。在同步模式SYN1下通常只需配置STCCR。DC[4:0]帧率分频器。决定每帧包含多少个字时钟周期即多少个时隙。范围1-32。WL[3:0]字长控制。定义每个数据字包含多少位。支持8, 10, 12, 16, 18, 20, 22, 24位。这里有个细节无论字长多少移位寄存器TXSR和RXSR以及FIFO都是24位的。对于小于24位的数据需要通过TXBIT0和RXBIT0在STCR/SRCR中来指定数据在24位寄存器中是左对齐MSB对齐还是右对齐LSB对齐。PSR预分频器范围选择。0表示后续的PM分频系数为1-2561表示PM分频系数为1-256但基础时钟先被8分频。PM[7:0]可编程预分频器模数。实际分频值为PM1。配置实战示例假设我们需要配置SSI为I2S Master模式输出44.1kHz采样率的立体声音频字长16位主时钟ccm_ssi_clk为11.2896MHz256*44.1kHz。计算位时钟BCLK立体声I2S每帧有左右2个时隙字每字16位所以BCLK 采样率 * 2 * 16 44.1kHz * 32 1.4112 MHz。计算分频系数源时钟11.2896MHz / 目标BCLK 1.4112MHz 8。因此分频系数为8。配置STCCR设置DC1I2S模式下一帧就是左右两个时隙WL4对应16位字长。为了得到8分频可以设置PSR01分频范围PM7因为分频值是PM1。3.3 数据路径与FIFO操作数据寄存器STX0/1和SRX0/1是CPU/DMA与SSI模块交互的窗口。它们是FIFO的映射入口直接写入STX0就等于向发送FIFO0压入数据。发送流程检查SISR寄存器中的TDE0或TFE0如果使能了FIFO标志位判断是否有空间写入新数据。将音频采样数据写入STX0寄存器如果使能了双通道模式则交替写入STX0和STX1。SSI硬件自动将数据从FIFO加载到TXSR。TXSR在帧同步和位时钟的控制下将数据移位输出到STXD引脚。数据移位顺序MSB先出还是LSB先出由STCR中的SHFD位控制。接收流程外部数据从SRXD引脚移入RXSR。收满一个字后数据被传输到接收FIFO。SISR寄存器中的RDR0或RFF0如果使能了FIFO标志位置起表明有新数据可读。CPU/DMA从SRX0寄存器读取数据。读取顺序需与发送端的SHFD设置匹配通过SRCR中的SHFD位配置。FIFO与水印控制 FIFO的存在大大增强了数据处理的鲁棒性。通过FIFO控制状态寄存器SFCSR可以设置发送和接收FIFO的水印Watermark。例如设置接收FIFO水印为4则当FIFO中数据量达到4个时RFF0标志会置位可以触发中断或DMA请求让CPU批量读取4个数据避免频繁中断。发送端同理当FIFO中剩余数据量低于水印时TFE0置位提示需要及时补充数据防止发送下溢。4. 典型工作模式配置与实战4.1 I2S主模式配置I2S是最常见的音频串行格式。将SSI配置为I2S主模式提供时钟和WS连接外部音频编解码器作为从设备是一个典型应用。配置步骤软复位向SCR写入0x0等待至少两个IPG_CLK周期。配置时钟根据前述计算配置STCCR寄存器。例如对于44.1kHz/16bitSTCCR 0x0004_0007假设DC1,WL4,PSR0,PM7。在同步模式下SRCCR通常配置为相同值或忽略。配置数据格式配置STCR和SRCR。设置STCRTXBIT00数据在24位寄存器中左对齐高16位有效SHFD0MSB先发送TFDIR1帧同步输出TXDIR1位时钟输出。TFEN1和TFEN0根据是否使能FIFO来设置。设置SRCRRXBIT00,SHFD0RFDIR0帧同步输入但在I2S主模式下WS由我们输出所以这里实际是输出这里需要仔细在I2S主模式且SYN0时接收帧同步也应由主设备提供所以RFDIR也应设为1输出。或者更常见的是设置SYN1让收发共用STFS。设置工作模式配置SCR。I2S_MODE01主模式SYN1收发同步共用时钟和WSNET0非网络模式TCH_EN0RE1TE1最后置SSIEN1。初始化AUDMUX别忘了配置AUDMUX模块将SSI的STXD,SRXD,STCK,STFS信号路由到正确的芯片引脚上。启动传输向STX0写入音频数据传输即开始。避坑指南在I2S模式下SISR寄存器中的TFS、RFS、TLS、RLS等与网络模式时隙相关的状态位是无效的在使能中断时务必不要使能这些位的中断源否则会导致莫名其妙的中断触发。4.2 网络模式与双通道操作网络模式用于需要传输多通道数据或非音频数据的场景例如连接多个ADC或传输打包的传感器数据。配置要点设置SCR中的NET1使能网络模式。在STCCR/SRCCR中DC[4:0]定义了每帧的总时隙数。例如DC15表示每帧有16个时隙0-15。通过发送时隙掩码寄存器STMSK和接收时隙掩码寄存器SRMSK来选择哪些时隙是有效的。每个寄存器32位对应32个可能的时隙虽然DC最大只支持32。某位为1表示忽略该时隙为0表示在该时隙进行发送/接收。例如只使用时隙0和1则设置STMSK 0xFFFF_FFFC仅最低两位为0。如果使能了双通道模式TCH_EN1则SSI会交替使用时隙偶数时隙0,2,4...的数据对应STX0/SRX0和FIFO0奇数时隙1,3,5...的数据对应STX1/SRX1和FIFO1。这要求有效时隙数为偶数并且需要同时使能两个FIFO。实战技巧在配置网络模式时务必理清“时隙”、“字”、“帧”的关系。一个时隙传输一个字。帧同步信号STFS在每个帧的开始第一个时隙产生脉冲。SISR中的TLS/RLS标志位在最后一个有效时隙期间置位这对于DMA传输例如一帧数据收满后触发DMA非常有用。4.3 中断与DMA配置高效的数据搬运离不开中断或DMA。SSI提供了丰富的中断源集中在SISR状态和SIER使能寄存器中。常用中断配置发送数据空中断使能SIER中的TDE0_EN和TDE1_EN。当发送FIFO为空或FIFO使能时数据量低于水印SISR中的TDE0置位并触发中断在中断服务程序中填充新的数据。接收数据就绪中断使能SIER中的RDR0_EN和RDR1_EN。当接收FIFO中有新数据或FIFO使能时数据量达到水印SISR中的RDR0置位并触发中断在中断服务程序中读取数据。错误中断使能ROE0_EN接收溢出和TUE0_EN发送下溢对于调试和健壮性很重要。发生错误时需要读取SISR清除错误标志并根据情况重置数据流。DMA配合对于高带宽音频流使用DMA是必须的。i.MX21的DMA控制器可以与SSI的FIFO水印标志联动。例如可以将DMA请求源设置为SSI的发送FIFO空TFE或接收FIFO满RFF。配置DMA为循环模式自动从内存缓冲区向STX0寄存器搬运数据或从SRX0寄存器向内存缓冲区搬运数据从而极大减轻CPU负担。一个关键细节SISR中的某些错误标志如ROE0,TUE0的清除方式比较特殊。需要先读取SISR寄存器此时错误位被锁存然后再进行一次对应的数据寄存器SRX0或STX0的读或写操作才能将其清除。如果只读SISR错误标志会在下次读SISR时再次出现。5. 调试常见问题与排查实录即便理解了所有寄存器实际调试中依然会遇到各种问题。下面是我在多个项目中总结的一些典型故障和排查思路。5.1 无声或数据全零这是最常见的问题。检查时钟这是首要怀疑对象。用示波器或逻辑分析仪测量STCK和STFS或SRCK/SRFS引脚。如果没有波形检查SCR寄存器的SSIEN、TE、RE位是否已置1。时钟源配置是否正确STCCR的PSR、PM。计算一下分频后的频率是否在合理范围。IPG_CLK时钟是否正常SSI模块的APB总线时钟是否使能AUDMUX配置是否正确这是最容易遗漏的一步SSI信号必须通过AUDMUX正确映射到物理引脚。确认AUDMUX对应端口的RX_SEL、TX_SEL等字段指向了正确的SSI。检查数据通路如果有时钟和帧同步但STXD没有数据输出。检查是否已向STX0寄存器写入有效数据。确认SISR中的TDE0位在写入后是否被清除表示数据已被FIFO接受。检查STCR中的TXDIR和TFDIR方向设置是否正确主设备通常设为输出。检查数据对齐方式TXBIT0和移位方向SHFD是否与接收端如Codec的期望匹配。一个MSB/LSB不匹配会导致数据完全错误。5.2 数据错位或噪声有时有声音但全是噪音或者左右声道反了。相位与极性检查时钟极性。STCR/SRCR寄存器中有控制时钟和帧同步有效极性的位。I2S标准通常要求数据在时钟的下降沿变化在上升沿被采样。确保SSI的配置与连接的Codec规格书一致。字长与帧长不匹配如果SSI配置为24位字长但发送的是16位数据且未正确对齐或者Codec期望的是不同的字长就会导致数据错位产生周期性爆音。用逻辑分析仪捕获一帧数据数一数两个帧同步脉冲之间有多少个位时钟再除以字长看是否等于配置的时隙数DC1。FIFO与中断/DMA速率不匹配如果使用中断中断服务程序处理太慢导致FIFO下溢发送或溢出接收也会引入噪声或丢失数据。尝试增大FIFO水印值或者改用DMA。如果使用DMA检查DMA缓冲区大小和周期是否与音频数据流匹配。DMA传输完成中断或半满中断的处理必须快于音频消耗/产生的速度。5.3 双通道模式工作异常当配置TCH_EN1后数据似乎只从一个通道出去。检查时隙掩码确认STMSK和SRMSK寄存器设置正确。双通道模式要求激活的时隙是偶数个并且是连续的奇偶对如0和12和3。如果只使能了时隙0那么只有STX0/SRX0会被使用。检查数据写入在双通道模式下你需要交替向STX0和STX1写入数据。如果只写STX0那么只有偶数时隙有数据奇数时隙会发送空数据或上次数据导致下溢错误TUE1。同样读取时也需要交替读取SRX0和SRX1。检查FIFO使能SFCSR寄存器中需要同时使能TFEN0和TFEN1发送FIFO以及RFEN0和RFEN1接收FIFO。5.4 系统时钟SYS_CLK输出问题在某些高精度音频方案中需要SSI提供主时钟MCLK给外部Codec这通过SCR寄存器的SYS_CLK_EN位和SRCK引脚实现。前提条件必须同时满足网络模式NET1、同步模式SYN1且发送时钟为内部生成TXDIR1。SYS_CLK是帧同步时钟STFS的过采样时钟其频率由PSR、PM、WL和DC共同决定。无输出排查首先确认上述模式位都已正确设置。然后检查AUDMUX配置确保SRCK引脚功能被正确映射为SSI的系统时钟输出而不是被配置为普通的GPIO或其它功能。最后用示波器测量引脚。5.5 低功耗下的陷阱在系统进入低功耗模式前需要妥善处理SSI。正确的关闭顺序建议先关闭音频数据流清空FIFO等待当前帧传输完成然后清除TE和RE位最后清除SSIEN位。直接清除SSIEN可能导致数据链路突然中断在Codec端产生爆音。时钟门控如前所述i.MX21中SSI的时钟门控由PCCR0寄存器控制与SSIEN位无关。在进入深度睡眠前除了软件禁用SSI还需要通过PCCR0关闭其模块时钟以达到省电效果。唤醒后需要重新初始化SSI和AUDMUX。通过系统性地理解SSI的架构、时钟、寄存器并结合实际的调试经验你就能驯服这个强大的同步串行接口使其在各种音频和数据通信应用中稳定可靠地工作。记住示波器/逻辑分析仪是你的好朋友遇到问题时从测量最基本的时钟和同步信号开始往往能最快地定位问题根源。

相关新闻