3、I2S协议详解:I2S、左对齐、右对齐、TDM模式时序分析

音频数据传输,说白了就是数字麦克风或者编解码芯片跟处理器之间怎么“对话”。这个对话的规矩,就是I2S协议。很多人觉得I2S就是三条线:位时钟、帧时钟、数据线。嗯,这话没错,但只对了一半。

我刚开始做音频驱动时,也以为只要把这三根线连上就能出声。结果呢?声音是有了,但要么左右声道反了,要么数据对不上,要么噪声大得吓人。后来我才明白,I2S协议远不止“三根线”这么简单。它有好几种模式,每种模式的时序、数据对齐方式都不一样。

今天我们就来把这几种模式彻底讲清楚。我会结合我在WM8960调试中遇到的实际问题,帮你避开那些坑。

3.1 I2S标准模式(飞利浦协议)

先讲最常见的。I2S标准模式,也叫飞利浦模式。这是最通用的音频数据传输协议。

它的核心规则是:数据在位时钟的上升沿采样,帧时钟(LRCLK)高电平表示左声道,低电平表示右声道。但有个关键点——数据比帧时钟延迟一个位时钟周期。

关键特征:

  • 数据在BCLK上升沿变化,接收端在下降沿采样
  • LRCLK高电平=左声道,低电平=右声道
  • 数据从LRCLK跳变后的第二个BCLK上升沿开始传输
  • MSB(最高有效位)先传输

为什么会延迟一个周期?我个人的理解是:这样可以让接收端有足够的时间去识别帧时钟的边沿,避免数据跟帧时钟同时变化导致的采样错误。说白了,就是给硬件留点缓冲时间。

来看一个典型的时序图:

I2S标准模式时序图(16位数据) BCLK LRCLK 左声道(高) 右声道(低) SD MSB bit14 ... bit1 LSB 延迟1个BCLK 注意:数据从LRCLK跳变后的第2个BCLK上升沿开始传输,MSB在前

我的经验:在调试WM8960时,我遇到过左右声道数据错位的问题。后来发现是I2S的帧时钟极性配置反了。WM8960的寄存器里有个位叫“LRP”,用来控制LRCLK的极性。如果你发现左声道的声音跑到右边去了,先检查这个位。

3.2 左对齐模式

左对齐模式,也叫MSB对齐模式。它跟标准I2S最大的区别是:数据在LRCLK跳变的同时就开始传输,没有那个1个BCLK的延迟。

你想想看,少了这个延迟,时序就更紧凑了。但这也意味着接收端必须在LRCLK跳变的瞬间就准备好采样数据。对硬件的要求更高一些。

特性 I2S标准模式 左对齐模式
数据起始点 LRCLK跳变后第2个BCLK LRCLK跳变同时
MSB位置 延迟1个BCLK 立即开始
兼容性 最广泛 部分DSP/CODEC支持
典型应用 通用音频设备 某些DSP处理器

左对齐模式在WM8960里也是支持的。我记得有一次客户要求用左对齐模式,我一开始没注意,直接用标准I2S的配置,结果出来的声音全是噪声。后来查了WM8960的数据手册,发现有个叫“FORMAT”的寄存器位,改成左对齐就好了。

注意:左对齐模式下,如果数据位宽小于帧长度(比如16位数据放在32位帧里),多余的位置会填充0。接收端需要自己处理这些填充位。我曾经见过有人没处理这个,结果音量只有一半。

3.3 右对齐模式

右对齐模式,也叫LSB对齐模式。这个名字已经说明了一切——数据的LSB(最低有效位)对齐到帧时钟的边沿。

说白了,就是数据从右边开始对齐。如果数据位宽小于帧长度,左边会多出一些填充位。

举个例子:16位数据放在32位帧里,右对齐模式下,数据会放在低16位,高16位填充0。而左对齐模式正好相反,数据放在高16位,低16位填充0。

三种模式对比(16位数据,32位帧):

  • I2S标准:延迟1BCLK后,MSB开始,数据占高16位
  • 左对齐:立即开始,MSB在前,数据占高16位
  • 右对齐:立即开始,LSB对齐帧末尾,数据占低16位

右对齐模式在WM8960里也有对应的配置。我个人不太常用这个模式,因为大多数音频数据都是MSB优先的,右对齐用起来总觉得别扭。但有些老式的音频设备或者特定的DSP确实会用这个模式,遇到了也别慌,改一下FORMAT寄存器就行。

3.4 TDM模式

TDM,全称是Time Division Multiplexing,时分复用。这个模式厉害了,它可以在一条数据线上传输多个声道的数据。

你想想看,普通的I2S只能传两个声道(左+右)。但如果你要做多声道音频,比如5.1环绕声,那就需要多个I2S接口。而TDM模式,一条数据线就够了。

TDM的核心思想是:把帧时钟周期分成多个时隙,每个时隙对应一个声道。帧时钟的频率不变,但位时钟的频率要相应提高。

声道数 帧时钟频率 位时钟频率(16位数据) 位时钟频率(24位数据)
2(标准I2S) Fs 32 × Fs 48 × Fs
4 Fs 64 × Fs 96 × Fs
8 Fs 128 × Fs 192 × Fs
16 Fs 256 × Fs 384 × Fs

WM8960支持TDM模式,但要注意,它最多支持4个时隙(也就是4个声道)。我做过一个项目,需要同时采集4个麦克风的数据,就是用WM8960的TDM模式搞定的。

避坑指南:配置TDM模式时,一定要确认每个时隙的起始位置和长度。WM8960的寄存器里有个“TDM”相关的配置位,可以设置时隙的起始偏移和时隙长度。我曾经因为时隙偏移没配对,导致4个声道的数据全部错位,排查了好久才发现是偏移量少算了1个BCLK。

3.5 四种模式对比总结

好了,四种模式都讲完了。我们来个总结对比,方便你以后查阅。

模式 数据起始 MSB位置 声道数 典型应用
I2S标准 延迟1BCLK 第2个BCLK 2 通用音频
左对齐 立即开始 第1个BCLK 2 DSP处理器
右对齐 立即开始 帧末尾对齐 2 老式设备
TDM 按时隙分配 每个时隙的MSB 2~16 多声道音频

最后提醒一句:不管用哪种模式,一定要确认发送端和接收端的配置完全一致。我见过太多人因为发送端用I2S标准模式,接收端配成了左对齐,结果折腾了一整天。嗯,我自己也犯过这种低级错误。