3. I2S与PCM总线协议:物理层时序与数据格式
在嵌入式音频系统中,I2S(Inter-IC Sound)与PCM(Pulse Code Modulation)总线是连接SoC的I2S控制器与外部音频编解码器(Codec)最常用的数字音频接口。理解其时序、格式差异以及TDM(时分复用)模式,是正确配置设备树与驱动ALSA声卡的基础。
3.1 I2S物理层时序与信号线
I2S总线由三条主要信号线组成,用于在数字音频设备之间传输立体声PCM音频数据。其物理层时序严格定义了位时钟、帧时钟与数据线之间的同步关系。
核心信号线定义:
- SCK (Serial Clock / BCLK / Bit Clock):位时钟,对应数字音频的每一位数据。频率 = 采样率 × 位宽 × 通道数。
- WS (Word Select / LRCLK / Frame Sync):帧时钟(字选择),用于区分左/右声道。频率等于采样率。高电平通常表示左声道,低电平表示右声道(或反之,取决于具体实现)。
- SD (Serial Data / DATA):串行数据线,用于传输音频采样数据。数据以二进制补码形式表示。
下图展示了标准I2S模式下,一个立体声帧(左声道+右声道)的物理时序关系。注意数据在SCK的下降沿变化,在上升沿被接收端采样。
时序要点:标准I2S协议要求WS(LRCLK)在数据发送前的一个位时钟周期切换,确保接收端能提前识别声道。数据从MSB(最高有效位)开始传输,到LSB(最低有效位)结束。
3.2 标准I2S与左对齐(Left-Justified)格式对比
虽然I2S是事实标准,但许多Codec也支持左对齐(Left-Justified)格式。两者的核心区别在于数据与帧时钟(WS)的对齐位置。
| 特性 | 标准I2S (Philips I2S) | 左对齐 (Left-Justified) |
|---|---|---|
| 数据对齐 | 数据MSB在WS切换后的第2个SCK上升沿有效(延迟1位) | 数据MSB在WS切换后的第1个SCK上升沿立即有效 |
| WS与数据关系 | WS在数据MSB之前一个SCK周期变化 | WS与数据MSB同时变化 |
| 兼容性 | 最广泛,几乎所有I2S控制器都支持 | 部分老式或专用Codec使用,需确认控制器支持 |
| 设备树配置 | dai-format = "i2s"; |
dai-format = "left-j"; |
下图直观展示了两种格式在单个声道数据起始处的时序差异:
驱动开发注意:在设备树中错误配置
dai-format 会导致音频数据错位,表现为声音严重失真或无声。务必查阅Codec数据手册确认其支持的格式。
3.3 PCM接口与TDM(时分复用)模式
PCM接口在物理层与I2S高度相似,同样使用BCLK、FS(帧同步,相当于WS)和DATA三线。但PCM协议更灵活,主要用于多通道(>2)或非立体声应用,如数字麦克风阵列、多通道音频总线。
PCM与I2S的关键区别:
- 帧同步信号(FS):PCM的FS通常是短脉冲(一个位时钟宽度),而非I2S的50%占空比方波。FS脉冲标识一个帧的开始。
- 时隙(Slot):一个PCM帧被划分为多个时隙,每个时隙承载一个通道的数据。
- TDM模式:TDM是PCM的一种扩展,允许在一个数据线上时分复用多个音频通道。例如,一个TDM8接口可以同时传输8个通道的数据。
| 特性 | 标准I2S | PCM / TDM |
|---|---|---|
| 帧同步信号 | 50%占空比的方波(LRCLK) | 短脉冲(通常1个BCLK宽度) |
| 通道数 | 固定2通道(立体声) | 灵活,1~N通道(TDM模式可达16通道) |
| 数据对齐 | MSB对齐(有/无延迟) | MSB对齐,时隙边界严格对齐 |
| 典型应用 | 立体声Codec、耳机输出 | 多通道ADC/DAC、数字麦克风、蓝牙音频 |
| 设备树配置 | dai-format = "i2s"; |
dai-format = "dsp_a"; 或 "dsp_b" |
下图展示了一个TDM8帧的结构,其中包含8个时隙,每个时隙传输一个通道的数据:
3.4 设备树中的格式与TDM配置
在设备树中,通过 dai-format 属性指定音频总线协议。对于TDM模式,还需要配置时隙数量、时隙宽度和帧同步类型。
常见dai-format值:
i2s:标准I2S格式(MSB延迟1位)。left-j:左对齐格式(MSB无延迟)。dsp_a:PCM模式A(FS脉冲与数据MSB对齐,类似左对齐)。dsp_b:PCM模式B(FS脉冲在数据MSB之前一个BCLK,类似I2S)。
TDM配置示例(设备树片段):
cpu_dai: &i2s0 {
#sound-dai-cells = <0>;
pinctrl-names = "default";
pinctrl-0 = <&i2s0_pins>;
status = "okay";
};
codec_dai: &audio_codec {
#sound-dai-cells = <0>;
};
sound_card: sound {
compatible = "simple-audio-card";
simple-audio-card,format = "dsp_a"; /* PCM模式A */
simple-audio-card,bitclock-master = <&cpu_dai>;
simple-audio-card,frame-master = <&cpu_dai>;
/* TDM配置:8通道,每通道32位 */
simple-audio-card,tdm-slot-num = <8>;
simple-audio-card,tdm-slot-width = <32>;
simple-audio-card,cpu {
sound-dai = <&cpu_dai>;
};
simple-audio-card,codec {
sound-dai = <&codec_dai>;
};
};
配置建议:对于多通道应用(如8通道麦克风阵列),使用
dsp_a 或 dsp_b 格式并配合 tdm-slot-num 和 tdm-slot-width 属性。确保Codec和CPU端的时隙配置完全一致,否则会导致通道错位。
3.5 格式与时钟的匹配检查清单
在调试I2S/PCM音频总线时,建议按以下清单逐项核对:
- 物理连接:SCK、WS/FS、DATA三线是否正确连接,无虚焊或短路。
- 时钟极性:确认BCLK和FS的极性(上升沿/下降沿采样)是否与Codec要求一致。
- 数据格式:设备树中的
dai-format是否与Codec数据手册匹配。 - TDM时隙:时隙数量、时隙宽度、通道映射是否正确。
- 主从模式:确认哪一端提供BCLK和FS(通常SoC做主,Codec做从)。
常见错误:将I2S格式配置为PCM格式(或反之)通常不会损坏硬件,但会导致音频数据无法正确解析。使用逻辑分析仪抓取BCLK和DATA波形,对比数据手册时序图,是定位此类问题的最有效手段。