3、I2S协议详解:I2S、左对齐、右对齐、TDM模式时序分析
音频数据传输,说白了就是数字麦克风或者编解码芯片跟处理器之间怎么“对话”。这个对话的规矩,就是I2S协议。很多人觉得I2S就是三条线:位时钟、帧时钟、数据线。嗯,这话没错,但只对了一半。
我刚开始做音频驱动时,也以为只要把这三根线连上就能出声。结果呢?声音是有了,但要么左右声道反了,要么数据对不上,要么噪声大得吓人。后来我才明白,I2S协议远不止“三根线”这么简单。它有好几种模式,每种模式的时序、数据对齐方式都不一样。
今天我们就来把这几种模式彻底讲清楚。我会结合我在WM8960调试中遇到的实际问题,帮你避开那些坑。
3.1 I2S标准模式(飞利浦协议)
先讲最常见的。I2S标准模式,也叫飞利浦模式。这是最通用的音频数据传输协议。
它的核心规则是:数据在位时钟的上升沿采样,帧时钟(LRCLK)高电平表示左声道,低电平表示右声道。但有个关键点——数据比帧时钟延迟一个位时钟周期。
关键特征:
- 数据在BCLK上升沿变化,接收端在下降沿采样
- LRCLK高电平=左声道,低电平=右声道
- 数据从LRCLK跳变后的第二个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标准模式,接收端配成了左对齐,结果折腾了一整天。嗯,我自己也犯过这种低级错误。