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物理层时序图(立体声单帧) SCK WS 左声道 (L) 右声道 (R) SD MSB LSB MSB 关键时序:SD数据在SCK下降沿更新,接收端在SCK上升沿采样;WS在SCK下降沿切换,先于MSB数据一个时钟周期。
时序要点:标准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";

下图直观展示了两种格式在单个声道数据起始处的时序差异:

标准I2S vs 左对齐格式(MSB起始对比) 标准I2S SCK WS SD WS切换 MSB 延迟1位 左对齐 SCK WS SD WS切换 MSB 无延迟 左对齐格式中,WS切换与数据MSB出现在同一个SCK周期,没有I2S的“1位延迟”。
驱动开发注意:在设备树中错误配置 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个时隙,每个时隙传输一个通道的数据:

PCM TDM8 帧结构(8通道时分复用) BCLK FS 帧同步脉冲 DATA Slot 0 Slot 1 Slot 2 Slot 3 Slot 4 Slot 5 Slot 6 Slot 7 TDM模式:一个帧同步脉冲(FS)后,数据线按顺序传输多个时隙(Slot)。 每个时隙对应一个音频通道,时隙宽度由位宽决定(如16位或32位)。

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音频总线时,建议按以下清单逐项核对:

  1. 物理连接:SCK、WS/FS、DATA三线是否正确连接,无虚焊或短路。
  2. 时钟极性:确认BCLK和FS的极性(上升沿/下降沿采样)是否与Codec要求一致。
  3. 数据格式:设备树中的 dai-format 是否与Codec数据手册匹配。
  4. TDM时隙:时隙数量、时隙宽度、通道映射是否正确。
  5. 主从模式:确认哪一端提供BCLK和FS(通常SoC做主,Codec做从)。
常见错误:将I2S格式配置为PCM格式(或反之)通常不会损坏硬件,但会导致音频数据无法正确解析。使用逻辑分析仪抓取BCLK和DATA波形,对比数据手册时序图,是定位此类问题的最有效手段。