2. I2S总线协议详解:I2S物理层、数据格式与飞利浦协议时序

I2S(Inter-IC Sound)总线是嵌入式音频系统中应用最广泛的数字音频接口标准,由飞利浦(现恩智浦)于1986年制定。本章从物理层信号定义、数据格式(左对齐、右对齐、标准I2S)以及飞利浦协议时序三个维度,系统讲解I2S总线的工作原理与配置要点。

2.1 I2S物理层信号定义

I2S总线由三条主要信号线组成,所有信号均与位时钟同步,采用主从架构进行数据传输。

信号名称 缩写 方向(主设备视角) 功能描述
位时钟 BCLK / SCK 输出(主)→ 输入(从) 每个脉冲对应一个数据位的传输,频率 = 采样率 × 位宽 × 通道数
帧时钟 LRCK / WS 输出(主)→ 输入(从) 指示当前传输的是左声道还是右声道,频率等于采样率
串行数据 SD / DATA 双向(取决于收发角色) 承载音频采样数据的串行位流,MSB优先传输
关键参数关系: BCLK频率 = 采样率 × 数据位宽 × 通道数。例如:44.1kHz采样、16位立体声 → BCLK = 44.1k × 16 × 2 = 1.4112 MHz。

除上述三线外,部分I2S设备还包含可选的MCLK(主时钟)信号线,用于提供更高精度的时钟源,MCLK频率通常为BCLK的整数倍(如256×fs、512×fs)。

2.2 I2S数据格式详解

I2S协议定义了三种主流数据格式,区别在于数据相对于帧时钟(LRCK)边沿的对齐方式以及数据有效位的起始位置。

2.2.1 标准I2S格式(飞利浦格式)

标准I2S格式是飞利浦协议的原生格式,其核心特征为:数据在LRCK翻转后的第二个BCLK上升沿开始传输,且MSB优先。LRCK高电平表示左声道,低电平表示右声道(或相反,取决于具体实现)。

标准I2S时序要点:
  • 数据位在BCLK的上升沿被采样,在下降沿更新。
  • MSB在LRCK翻转后延迟一个BCLK周期开始传输。
  • 数据位宽可配置为16/24/32位,不足部分填充0。
标准I2S格式时序图(飞利浦协议) BCLK LRCK 左声道(高电平) 右声道(低电平) DATA MSB Bit14 Bit13 … Bit1 LSB 填充位(0) LRCK翻转 延迟1BCLK MSB开始 标准I2S格式:数据在LRCK翻转后延迟一个BCLK周期开始传输,MSB优先 左声道数据在LRCK高电平期间传输,右声道数据在LRCK低电平期间传输

2.2.2 左对齐格式(Left-Justified)

左对齐格式与标准I2S格式的主要区别在于:数据在LRCK翻转后的第一个BCLK上升沿立即开始传输,无延迟周期。MSB与LRCK边沿对齐,因此称为“左对齐”。

2.2.3 右对齐格式(Right-Justified)

右对齐格式中,数据的LSB与LRCK的翻转边沿对齐,即数据在帧时钟周期的末尾对齐。这种格式常用于与某些DAC/ADC的兼容性需求。

格式类型 MSB起始位置 LSB对齐方式 典型应用场景
标准I2S(飞利浦) LRCK翻转后延迟1个BCLK 自然对齐 飞利浦/恩智浦编解码器、主流SoC
左对齐(Left-J) LRCK翻转后立即开始 自然对齐 部分ADI/TI音频ADC
右对齐(Right-J) 根据位宽计算偏移 LSB与LRCK边沿对齐 部分DAC、旧式音频设备

2.3 飞利浦协议时序详解

飞利浦I2S协议规范(I2S-bus specification)定义了完整的时序要求,包括时钟极性、数据建立/保持时间以及主从设备角色。

2.3.1 时钟极性配置

I2S协议支持两种时钟极性模式,通过配置BCLK和LRCK的极性寄存器位实现:

  • 标准模式(Normal Polarity): BCLK空闲时为低电平,数据在BCLK上升沿采样;LRCK高电平=左声道,低电平=右声道。
  • 反转模式(Inverted Polarity): BCLK空闲时为高电平,数据在BCLK下降沿采样;LRCK极性可独立反转。
常见配置陷阱: 许多嵌入式SoC的I2S控制器支持独立的时钟极性配置位(如BCLK_INV、LRCK_INV)。如果编解码器数据手册要求“数据在BCLK下降沿采样”,而SoC默认配置为上升沿采样,则必须设置BCLK_INV=1,否则会导致数据错位或噪声。

2.3.2 数据建立与保持时间

飞利浦协议对数据相对于BCLK边沿的时序有明确要求:

时序参数 符号 最小值 说明
数据建立时间 tsu 10 ns 数据在BCLK采样边沿前必须保持稳定的最短时间
数据保持时间 th 5 ns 数据在BCLK采样边沿后必须保持稳定的最长时间
BCLK周期 tcy 取决于采样率 BCLK频率的倒数,决定了数据传输速率

2.3.3 主从设备角色

I2S总线中的主设备负责产生BCLK和LRCK时钟信号,从设备则接收时钟并同步数据传输。在嵌入式Linux系统中,SoC的I2S控制器通常配置为主设备,外部编解码器配置为从设备。

I2S主从设备连接架构 SoC I2S控制器 主设备(Master) 产生BCLK + LRCK 音频编解码器 从设备(Slave) 接收时钟 + 收发数据 BCLK + LRCK SD(双向数据) 主设备产生BCLK和LRCK时钟,从设备根据时钟同步采样/发送数据 嵌入式Linux中通常配置SoC为主设备,编解码器为从设备

2.4 数据格式配置实战要点

在嵌入式Linux中配置I2S数据格式时,需要关注以下关键参数:

  • 数据位宽(Data Width): 16位、24位或32位,必须与编解码器支持的位宽一致。
  • 帧格式(Frame Format): 标准I2S、左对齐或右对齐,通过I2S控制器的FMT寄存器位选择。
  • 时钟极性(Clock Polarity): BCLK和LRCK的极性配置,需与编解码器数据手册匹配。
  • 主从模式(Master/Slave): 决定时钟由谁产生,通常SoC为主设备。
Linux DTS配置示例(标准I2S格式,16位立体声):
&i2s1 {
    status = "okay";
    #sound-dai-cells = <0>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2s1>;
    rockchip,format = "i2s";        /* 标准I2S格式 */
    rockchip,bclk-fs = <32>;       /* BCLK = 32 × fs(16位×2通道) */
    rockchip,frame-master = <1>;   /* SoC为主设备 */
    rockchip,bitclock-master = <1>;/* SoC产生BCLK */
};