2. I2S音频数据格式
I2S总线在传输音频数据时,并没有强制规定数据字与帧时钟(LRCLK/WS)之间的绝对对齐方式。不同的音频编解码器、DSP或SoC外设可能采用三种主流数据格式之一:标准I2S(Philips格式)、左对齐(Left-Justified)和右对齐(Right-Justified)。这三种格式的核心差异在于最高有效位(MSB)相对于帧同步信号(LRCLK)边沿的起始位置,以及数据位与时钟周期的对齐关系。配置错误将导致音频数据出现“移码”、噪声或完全无声。
2.1 三种数据格式的核心差异对比
下表从MSB起始位置、数据延迟、位时钟关系和典型应用四个维度,对三种格式进行对比:
| 对比维度 | 标准I2S (Philips) | 左对齐 (Left-Justified) | 右对齐 (Right-Justified) |
|---|---|---|---|
| MSB起始位置 | LRCLK切换后的第2个BCLK上升沿 | LRCLK切换后的第1个BCLK上升沿 | LRCLK切换后的最后1个BCLK上升沿(数据右对齐到帧边界) |
| 数据延迟 | 1 BCLK周期延迟 | 0 BCLK周期延迟 | 取决于数据字长与帧长之差 |
| 位时钟关系 | MSB在LRCLK边沿后一个BCLK有效 | MSB与LRCLK边沿对齐 | LSB对齐到LRCLK边沿,MSB在帧末尾 |
| 典型应用 | 最广泛,几乎所有I2S CODEC都支持 | 部分DSP、ADC/DAC(如TI系列) | 部分低成本CODEC或特定DSP模式 |
2.2 标准I2S(Philips格式)详解
标准I2S格式由Philips(现NXP)定义,是业界最通用的音频数据传输协议。其核心特征是:数据字的MSB在LRCLK切换后的第二个BCLK上升沿开始传输。这意味着数据相对于帧同步信号有1个BCLK周期的延迟。
下图展示了标准I2S格式下,一个16位立体声数据帧的时序结构:
在标准I2S格式中,发送端在LRCLK切换后,先保持数据线为高阻或无效状态1个BCLK周期,然后在第2个BCLK上升沿开始输出MSB。接收端在BCLK的下降沿采样数据,这保证了数据在BCLK上升沿变化后,有半个周期的稳定时间供接收端读取。
2.3 左对齐(Left-Justified)格式详解
左对齐格式的特点是:数据字的MSB与LRCLK的切换边沿对齐,没有额外的延迟周期。数据从帧同步信号有效后的第一个BCLK上升沿立即开始传输。这种格式在部分DSP和音频ADC/DAC中较为常见,因为它减少了数据延迟,适合对实时性要求更高的应用。
2.4 右对齐(Right-Justified)格式详解
右对齐格式(也称日本格式或Sony格式)的特点是:数据字的LSB对齐到LRCLK的切换边沿,而MSB则位于帧的末尾。这种格式要求帧长度(LRCLK周期内的BCLK数)必须大于或等于数据字长,多余的高位通常填充0。右对齐格式在部分低成本CODEC和特定DSP模式中仍有使用。
2.5 驱动配置示例与代码实现
在嵌入式驱动中,配置I2S数据格式通常通过设置外设的控制寄存器中的格式位来实现。以下以STM32的I2S外设为例,展示三种格式的配置代码:
/* STM32 I2S 数据格式配置示例 */
/* 假设 hspi 为 I2S 句柄,I2S 外设已使能 */
/* 1. 配置为标准I2S格式 (Philips) */
hspi.Instance->I2SCFGR |= (0x0 << I2SCFGR_CKPOL_Pos); /* 时钟极性 */
hspi.Instance->I2SCFGR |= (0x0 << I2SCFGR_DATLEN_Pos); /* 数据长度 */
hspi.Instance->I2SCFGR |= (0x0 << I2SCFGR_CHLEN_Pos); /* 通道长度 */
/* 标准I2S格式:CKPOL=0, DATLEN=00, CHLEN=0 */
/* 实际配置需根据具体MCU手册调整 */
/* 2. 配置为左对齐格式 */
/* 假设左对齐格式对应 CKPOL=0, DATLEN=01, CHLEN=0 */
hspi.Instance->I2SCFGR |= (0x0 << I2SCFGR_CKPOL_Pos);
hspi.Instance->I2SCFGR |= (0x1 << I2SCFGR_DATLEN_Pos);
hspi.Instance->I2SCFGR |= (0x0 << I2SCFGR_CHLEN_Pos);
/* 3. 配置为右对齐格式 */
/* 假设右对齐格式对应 CKPOL=0, DATLEN=10, CHLEN=0 */
hspi.Instance->I2SCFGR |= (0x0 << I2SCFGR_CKPOL_Pos);
hspi.Instance->I2SCFGR |= (0x2 << I2SCFGR_DATLEN_Pos);
hspi.Instance->I2SCFGR |= (0x0 << I2SCFGR_CHLEN_Pos);
/* 注意:以上寄存器位定义仅为示例,实际开发请参考具体MCU参考手册 */
2.6 数据格式选择与兼容性矩阵
在实际项目中,数据格式的选择取决于主控端I2S外设的能力和音频CODEC的支持范围。以下矩阵总结了常见CODEC与主控的兼容性:
| CODEC型号 | 标准I2S | 左对齐 | 右对齐 | 推荐格式 |
|---|---|---|---|---|
| CS43L22 | ✓ | ✓ | ✗ | 标准I2S |
| WM8731 | ✓ | ✓ | ✓ | 标准I2S |
| TLV320AIC23 | ✓ | ✓ | ✗ | 左对齐 |
| AK4556 | ✓ | ✗ | ✓ | 标准I2S |
2.7 数据格式配置检查清单
在驱动调试过程中,当遇到音频数据异常时,可以按照以下清单逐一排查数据格式相关配置:
- 确认CODEC数据手册要求:查阅CODEC的“Audio Interface”章节,明确其支持的数据格式。
- 检查主控I2S外设的格式寄存器:确保CKPOL、DATLEN、CHLEN等位配置正确。
- 验证帧长度配置:右对齐格式尤其需要确认帧长度是否大于数据字长。
- 使用示波器抓取波形:对比MSB位置与LRCLK边沿的关系,确认格式是否匹配。
- 测试标准I2S格式:如果CODEC支持,先使用标准I2S格式验证基本通路,再尝试其他格式。
- 检查DMA缓冲区数据排列:某些DMA控制器在传输数据时可能自动调整字节序,需确认与I2S格式的配合。