3、I2S协议详解:I2S总线标准、信号定义(SCK/WS/SD)、时序图、数据格式(左对齐/右对齐/I2S标准)
I2S(Inter-IC Sound)总线由Philips Semiconductor(现NXP)于1986年提出,是数字音频系统中连接控制器(如SoC、MCU、DSP)与音频编解码器(Codec)、ADC/DAC、数字音频处理器之间最主流的串行音频传输协议。与I2C、SPI等通用总线不同,I2S专为音频流设计,强调时钟同步、数据连续性和声道区分。理解I2S的物理信号、时序关系以及三种主流数据格式(I2S标准、左对齐、右对齐),是多通道音频系统设计(如TDM级联、多路麦克风阵列、智能音箱)的基础。本章将从信号定义、时序参数、数据格式对比、典型配置案例及常见设计误区五个维度展开。
3.1 I2S总线标准与信号定义
I2S总线采用三线制串行连接,分别为:SCK(串行位时钟,也称BCLK)、WS(声道选择,也称LRCLK)和SD(串行数据)。在某些多通道扩展场景下,还会增加一条MCLK(主时钟),用于为Codec内部Δ-Σ调制器提供基准时钟,但MCLK不属于I2S标准定义的必要信号。
- SCK(Bit Clock):每一位音频数据对应一个SCK脉冲。SCK频率 = 采样率 × 声道数 × 位深。例如:48kHz采样、16bit、立体声时,SCK = 48k × 2 × 16 = 1.536MHz。SCK由主设备(Master)产生,从设备(Slave)接收。
- WS(Word Select):用于区分左右声道。WS频率等于采样率(fs)。WS为低电平时传输左声道数据,高电平时传输右声道数据(Philips标准定义;部分Codec可能相反,需查阅数据手册)。WS信号在SCK的下降沿变化,数据在SCK上升沿采样。
- SD(Serial Data):串行数据线,二进制补码格式传输音频样本。数据位在SCK上升沿稳定,由发送端在SCK下降沿更新。SD可以是单向(播放或录音)或双向(通过GPIO方向控制实现半双工)。
3.2 时序图与关键参数
I2S时序的核心在于建立时间(Setup Time)和保持时间(Hold Time)。发送端在SCK下降沿更新SD数据,接收端在SCK上升沿采样。因此,数据必须在上升沿之前稳定(建立时间),并在上升沿之后保持一段时间(保持时间)。
| 参数 | 符号 | 典型值 | 说明 |
|---|---|---|---|
| SCK频率 | f_SCK | 1.024 ~ 24.576 MHz | 取决于采样率与位深 |
| SCK高电平时间 | t_H | ≥ 20 ns | 保证上升沿采样稳定 |
| SCK低电平时间 | t_L | ≥ 20 ns | 保证下降沿数据更新 |
| 数据建立时间 | t_su | ≥ 10 ns | 数据在SCK上升沿前稳定 |
| 数据保持时间 | t_h | ≥ 5 ns | 数据在SCK上升沿后保持 |
| WS建立时间 | t_ws_su | ≥ 10 ns | WS在SCK下降沿前稳定 |
实际设计中,若SCK频率超过12.288MHz(如192kHz/24bit/2ch),建议使用硬件I2S外设而非GPIO模拟,因为GPIO翻转延迟(通常>20ns)会导致建立时间不足。对于PCB布线,SCK与SD走线长度差应控制在±5mm以内,避免因传播延迟差异导致采样错误。
3.3 数据格式:左对齐、右对齐与I2S标准
三种格式的核心区别在于MSB(最高有效位)与WS边沿的对齐关系。以16bit数据、24bit帧长(即每个声道占用24个SCK周期)为例:
- I2S标准(Philips):MSB在WS变化后的第2个SCK上升沿被采样。即WS变化后延迟1个SCK周期才开始传输数据。这种设计允许从设备有更多时间检测WS边沿,兼容性最好。
- 左对齐(Left Justified):MSB与WS变化边沿同时出现在SCK上升沿。数据帧紧贴WS边沿,无延迟。这种格式常用于TI(Texas Instruments)的Codec,如TLV320AIC系列。
- 右对齐(Right Justified):数据的LSB(最低有效位)与WS结束边沿对齐。MSB位于帧的末尾,因此数据位宽必须小于或等于帧长。例如16bit数据在24bit帧中,MSB位于第9个SCK周期。这种格式在DAC中常见,如AKM的AK4458。
3.4 实战案例:基于STM32的I2S与CS42L51 Codec对接
某智能音频模块需要实现48kHz/16bit立体声播放与录音,主控为STM32F407(I2S外设支持Philips标准),Codec为Cirrus Logic CS42L51(支持左对齐/右对齐/I2S标准)。设计目标:通过I2S2接口连接,实现全双工音频传输。
关键配置参数:
- 采样率:48kHz,SCK = 48k × 2 × 16 = 1.536MHz
- MCLK:12.288MHz(由STM32的PLL输出,Codec要求MCLK = 256 × fs)
- 数据格式:I2S标准(Philips),16bit数据,帧长16bit(因为数据位宽=帧长,左/右对齐无差异)
实施步骤:
- 初始化GPIO:PB12(I2S2_WS)、PB13(I2S2_CK)、PB15(I2S2_SD),复用为AF5。
- 配置SPI/I2S外设:使用SPI2的I2S模式,设置为主机、全双工、16bit数据、I2S标准。
- 配置Codec:通过I2C接口(地址0x4E)写入寄存器0x02(控制口)设为I2S标准,寄存器0x03(接口格式)设为16bit。
- 启动DMA传输:使用DMA1 Stream4(TX)和Stream5(RX),循环模式,数据缓冲区为16bit数组。
调试过程与问题:首次上电后,录音数据出现周期性“咔哒”声。使用逻辑分析仪抓取SCK/WS/SD波形,发现WS频率为48kHz,但SCK频率为1.536MHz,符合预期。进一步检查发现,CS42L51的MCLK实际输入为12.288MHz,但STM32的PLL配置错误,实际输出为11.2896MHz(256×44.1kHz),导致Codec内部时钟失锁。修正PLL分频系数后,问题解决。
3.5 常见误区与设计总结
误区一:混淆WS极性。部分Codec(如WM8960)的WS极性可通过寄存器反转。若主控输出WS低=左声道,而Codec配置为低=右声道,则左右声道互换。解决方法是查阅Codec数据手册的“Interface Control”寄存器,并做一次左右声道测试音频验证。
误区二:忽略帧长与数据位宽的差异。当使用16bit数据但帧长配置为32bit时,I2S标准格式下,数据后16位为0(或无效),但SCK频率需加倍。若主控未正确配置帧长,会导致数据错位。例如STM32的I2S外设,通过SPI_I2SCFGR的CHLEN和DATLEN位分别设置帧长和数据位宽,两者必须匹配。
误区三:多通道TDM时未处理WS的“空位”。在TDM8模式下,WS不再是简单的左右声道切换,而是以帧同步脉冲形式出现。此时I2S标准格式不再适用,需切换为DSP格式(TDM模式)。若沿用I2S标准,从设备将无法正确解析通道槽位。
| 对比维度 | I2S标准 | 左对齐 | 右对齐 |
|---|---|---|---|
| MSB位置 | WS边沿后第2个SCK | WS边沿处 | 帧尾前(LSB对齐WS边沿) |
| 典型厂商 | NXP, Cirrus Logic | TI, Analog Devices | AKM, ESS |
| 适用场景 | 通用消费音频 | 专业音频设备 | DAC输出,低延迟需求 |
| 数据位宽限制 | ≤ 帧长 | ≤ 帧长 | 必须 ≤ 帧长,且MSB位置不固定 |
总结:I2S协议本身并不复杂,但工程实践中80%的音频链路问题源于时序细节和格式配置不匹配。设计时建议遵循以下流程:①确认Codec支持的格式与主控外设能力;②计算SCK/MCLK频率并验证PLL配置;③用逻辑分析仪抓取实际波形,对比数据手册时序图;④用1kHz正弦波测试左右声道分离度和THD+N。掌握I2S的三种格式差异,是后续理解TDM多通道扩展的基础。