第2章 I2S/PCM总线协议:I2S总线标准、PCM接口模式、TDM模式、时钟与帧同步信号详解
好,咱们直接进入正题。
音频Codec驱动开发,绕不开的就是I2S和PCM总线。说白了,这是数字音频数据在SoC和Codec之间传输的“高速公路”。你写的驱动好不好,一半看寄存器配得对不对,另一半就看这条总线上的时序有没有搞对。
我个人习惯,拿到一块新的Codec芯片,第一件事不是看它的内部音频处理路径,而是先搞清楚它支持哪几种数字音频接口模式。因为一旦这个搞错了,后面全是白搭。
2.1 I2S总线标准
I2S,全称是Inter-IC Sound,由飞利浦公司制定。它专门用来在芯片之间传音频数据。你想想看,音频数据是连续的流,不像I2C那样有地址和应答,所以它的协议非常简单。
标准的I2S总线有三根核心信号线:
- SCK (Bit Clock):位时钟,也叫BCLK。每一个脉冲对应一个数据位。频率 = 采样率 × 声道数 × 位深。比如44.1kHz采样、双声道、16位数据,SCK就是44.1k × 2 × 16 = 1.4112 MHz。
- WS (Word Select):字选择,也叫LRCLK或帧同步。它用来区分左右声道。高电平通常代表左声道,低电平代表右声道(也有反的,看具体芯片)。频率等于采样率。
- SD (Serial Data):串行数据线,用来传输音频采样值。
关键点:I2S标准规定,数据在WS信号切换后的第二个SCK上升沿开始传输,并且数据是MSB(最高有效位)对齐的。这意味着WS变化时,当前声道的数据并不是立即开始,而是延迟了一个BCLK周期。
我在项目中遇到过一个问题:驱动写好了,播放音乐全是噪声。查了半天,发现是Codec配置成了左对齐模式,而SoC默认输出的是标准I2S模式。就差了这一个BCLK的延迟,数据全对不上了。嗯,这里要注意,对齐方式一定要匹配。
2.2 PCM接口模式
PCM接口,很多人一听就觉得是脉冲编码调制,其实在总线协议里,它特指一种和I2S非常相似但又有区别的同步串行接口。
PCM模式和I2S最大的区别在于帧同步信号的位置。
- I2S:WS在数据开始前一个BCLK变化。
- PCM (短帧同步):帧同步信号(FSYNC)只持续一个BCLK周期,并且和数据的第一位同时开始。
- PCM (长帧同步):帧同步信号持续多个BCLK周期,通常持续到数据传完。
说白了,I2S是PCM的一种特殊变体。很多SoC的I2S控制器其实都支持配置成PCM模式。我建议你在看Codec数据手册时,如果它写支持“PCM接口”,一定要仔细看时序图,确认它是短帧还是长帧,以及帧同步是上升沿有效还是下降沿有效。
避坑指南:我曾经在调试一个蓝牙音频模块时,它只支持PCM短帧同步,而主控默认配成了I2S。结果就是声音断断续续,像卡带一样。后来我把帧同步的极性反转了一下,问题就解决了。所以,极性配置也是个大坑。
2.3 TDM模式
TDM,时分复用模式。当你的系统里不止一个Codec,或者一个Codec有多个通道(比如8通道麦克风阵列)时,I2S的两声道就不够用了。
TDM的原理很简单:在一个帧同步周期内,把时间片分成多个slot(时隙),每个slot传输一个声道的数据。比如一个帧周期内传8个16位数据,那就是8通道TDM。
配置TDM时,你需要关注几个参数:
| 参数 | 说明 | 我踩过的坑 |
|---|---|---|
| Slot数量 | 一个帧周期内有多少个时隙 | 配少了,后面的通道数据丢了 |
| Slot宽度 | 每个时隙占多少个BCLK | 配宽了,总线空闲时间变长 |
| 数据对齐 | 数据在slot内是左对齐还是右对齐 | 这个错了,数据全串位 |
举个例子,一个8通道、24位数据的TDM流,如果每个slot宽度设为32BCLK,那么总的BCLK频率就是 采样率 × 8 × 32。算下来,48kHz采样时,BCLK高达12.288 MHz。这个频率对PCB走线就有要求了,不能随便拉根飞线。
注意:有些Codec的TDM模式支持“菊花链”,也就是多个Codec共用数据线,靠不同的slot地址来区分。这种模式下,如果某个Codec的slot配置冲突,整个总线都会乱掉。我建议你在初始化时,逐个使能Codec,用示波器确认每个slot的数据是否正确。
2.4 时钟与帧同步信号详解
时钟是音频总线的命脉。没有稳定的时钟,一切都是空谈。
在I2S/PCM系统中,时钟分为主时钟(MCLK)和位时钟(BCLK)。
- MCLK:主时钟,通常是采样率的整数倍,比如256fs、384fs、512fs。它用来驱动Codec内部的Σ-Δ调制器和数字滤波器。没有MCLK,Codec内部的数字核心无法工作。
- BCLK:位时钟,前面说过,用来移位数据。
- LRCLK/FSYNC:帧同步,用来标识一个帧的开始。
这里有个常见的误区:很多人以为只要BCLK和LRCLK对了,音频就能正常工作。其实不然。很多Codec要求MCLK必须和BCLK保持整数倍关系,否则内部PLL无法锁定,会产生时钟抖动,导致音质劣化。
我记得有一次调试一个车载音频项目,播放音乐时偶尔出现“噗噗”的爆音。用示波器看BCLK和LRCLK都很干净,但MCLK的波形上有毛刺。后来发现是MCLK的走线太长,受到了电源噪声的干扰。加了一个22pF的滤波电容到地,问题就解决了。
核心总结:时钟的相位关系比频率更重要。I2S标准要求数据在BCLK的上升沿采样,但有些Codec要求下降沿采样。帧同步信号也有上升沿有效和下降沿有效之分。这些细节,数据手册上通常会用时序图标注得很清楚。我建议你拿到芯片后,第一件事就是把时序图打印出来,用荧光笔标出关键的建立时间(Setup Time)和保持时间(Hold Time)。
好了,关于I2S/PCM总线协议,核心就是这些。下一章我们会深入Codec的硬件架构,看看数据进了Codec之后,到底经历了什么处理流程。