1. I2S协议基础
1.1 I2S总线定义
I2S(Inter-IC Sound,集成电路内置音频总线)是飞利浦公司(现恩智浦)于1986年制定的一种串行数字音频总线标准,专门用于连接数字音频设备(如编解码器、DSP、微控制器、数字功放等)之间的音频数据传输。I2S总线采用三线制同步串行接口,将时钟信号与数据信号分离,避免了时钟抖动对音频质量的影响。
I2S总线的核心设计理念是:时钟与数据分离,数据在时钟的边沿同步传输,左右声道数据在同一个数据线上分时传输,通过字选择信号区分声道。
I2S总线物理信号定义
| 信号名称 | 缩写 | 方向 | 功能描述 |
|---|---|---|---|
| 串行时钟 | SCK / BCLK | 主设备→从设备 | 位时钟,每个脉冲对应一位数据;频率 = 采样率 × 位宽 × 声道数 |
| 字选择 | WS / LRCLK | 主设备→从设备 | 帧时钟,高电平表示左声道,低电平表示右声道(或相反);频率 = 采样率 |
| 串行数据 | SD / DATA | 双向(半双工) | 音频数据线,MSB优先传输,二进制补码格式 |
关键参数关系: BCLK = 采样率 × 位宽 × 2(声道数)。例如:44.1kHz采样率、16位数据、立体声 → BCLK = 44.1k × 16 × 2 = 1.4112 MHz。
1.2 飞利浦I2S标准时序
飞利浦I2S标准时序定义了数据与时钟、字选择信号之间的精确对齐关系。理解时序是驱动开发的基础,错误的时序配置会导致数据错位、声道反转或噪声。
时序核心规则
- WS变化领先于数据MSB一个BCLK周期: WS在数据MSB传输之前的一个BCLK周期发生跳变,接收端利用此特性进行声道同步。
- 数据在SCK下降沿锁存: 发送端在SCK上升沿更新数据,接收端在SCK下降沿采样数据(标准模式)。
- MSB优先传输: 每个声道的数据从最高有效位(MSB)开始发送,LSB在最后。
- 数据位宽可小于或等于声道槽位宽: 例如16位数据可以在32位槽位中传输,低位补0。
时序对齐要点: 飞利浦标准要求WS在第一个BCLK周期(MSB传输前)就完成跳变,这与左对齐(Left-Justified)模式不同——左对齐模式中WS与MSB同时开始。驱动开发时务必确认编解码器要求的对齐模式。
1.3 数据格式:16/24/32位
I2S协议支持多种数据位宽,常见的有16位、24位和32位。数据位宽决定了每个声道样本的精度,直接影响音频动态范围。驱动开发中需要正确配置MCU的I2S外设数据格式寄存器,使其与编解码器匹配。
| 数据位宽 | 动态范围(理论) | 槽位宽(常见) | 数据存储格式 | 典型应用 |
|---|---|---|---|---|
| 16位 | 96.3 dB | 16位或32位 | 有符号16位补码,MSB对齐 | CD音质、MP3播放、语音 |
| 24位 | 144.5 dB | 32位(常用) | 有符号24位补码,存储在32位容器的高24位 | 高保真音频、录音棚设备 |
| 32位 | 192.7 dB | 32位 | 有符号32位补码,MSB对齐 | 专业音频、浮点DSP处理 |
位宽匹配陷阱: 当MCU发送16位数据而编解码器配置为24位槽位时,编解码器会读取槽位中的高24位数据。如果MCU将16位数据放在低16位,编解码器将读到全0或噪声。正确的做法是将16位数据左对齐到32位槽位的高16位,低16位补0。
数据格式存储示例(32位槽位)
// 16位数据左对齐到32位槽位(推荐)
uint32_t slot_32bit = (uint16_t)sample << 16; // 高16位为有效数据,低16位补0
// 24位数据左对齐到32位槽位
uint32_t slot_32bit = (uint32_t)sample << 8; // 高24位为有效数据,低8位补0
// 32位数据直接填充
uint32_t slot_32bit = sample; // 全32位有效
1.4 左右声道对齐方式
I2S协议中左右声道的区分由WS信号的电平决定。飞利浦标准规定:WS为高电平时传输左声道数据,WS为低电平时传输右声道数据(部分设备可能相反,需参考数据手册)。
除了飞利浦标准对齐方式,实际应用中还存在两种常见的变体:左对齐(Left-Justified)和右对齐(Right-Justified / I2S兼容)。驱动开发时必须明确编解码器使用的是哪种对齐模式。
| 对齐模式 | WS与数据关系 | 数据起始位置 | 常见应用 |
|---|---|---|---|
| 飞利浦标准 | WS在MSB前1个BCLK跳变 | WS跳变后第2个BCLK开始 | 大多数I2S编解码器默认模式 |
| 左对齐 | WS与MSB同时开始 | WS跳变后第1个BCLK开始 | 部分DAC、ADC、DSP处理器 |
| 右对齐 | 数据LSB对齐到槽位末尾 | 数据在槽位最后N位(N=位宽) | 旧式音频设备、兼容模式 |
1.5 驱动开发中的关键配置项
在XMC系列MCU的I2S外设驱动开发中,以下配置项直接决定I2S总线能否正确工作:
- 主从模式选择: MCU通常作为I2S主设备,产生SCK和WS时钟;也可配置为从设备接收外部时钟。
- 数据位宽: 配置为16位、24位或32位,需与编解码器严格一致。
- 槽位宽: 配置每个声道占用的BCLK周期数,通常为16、24或32。
- WS极性: 配置WS高电平对应左声道还是右声道。
- 数据对齐模式: 选择飞利浦标准、左对齐或右对齐。
- 时钟极性: 配置数据在SCK上升沿还是下降沿采样。
XMC系列MCU I2S配置建议: XMC4000系列(基于Cortex-M4)的I2S模块支持灵活的位宽和对齐配置。建议在初始化时先读取编解码器的数据手册,确认其对WS极性、数据对齐和位宽的要求,再配置MCU侧寄存器。常见的编解码器(如WM8731、CS43L22、TLV320AIC23)默认使用飞利浦标准、16位或24位数据、32位槽位。