IIC,IIS,SAI深度对比
选型黄金法则场景推荐接口理由配置音频芯片寄存器I²C节省引脚,标准控制协议双声道播放/录音I²S简单稳定,广泛兼容多声道专业音频SAI(TDM)单线支持8声道,时钟独立混合协议系统SAI同时兼容I²S/TDM/AC97I²C:设备控制的“神经”,不可传输音频流I²S:立体声传输的“骨干”,简洁可靠SAI:专业音频的“瑞士军刀”,多声道/多协议通吃经验之谈:在智能音箱设计中,我们曾尝试用I²S传输4
从协议本质、实战案例和应用经验三个维度,详细解析I²C、I²S和SAI的区别与联系。本文的目录如下:
- 接口基础对比:用表格和Mermaid时序图对比三种接口的核心特性
- 协议深度解析:详细分析帧结构、时序特性和应用场景差异
- 实战案例详解:通过三个典型场景(多通道录音、音频播放、设备配置)展示具体实现
- 应用经验总结:从选型指南、常见踩坑到性能优化技巧的完整经验分享
🔌 一、接口基础对比:本质与应用场景
1. 协议定位与核心差异

-
I²C(Inter-Integrated Circuit)
-
本质:低速控制总线(通常<1Mbps),用于芯片配置(如WM8974音频芯片寄存器设置)
-
信号线:SCL(时钟)、SDA(双向数据线)
-
典型场景:传感器配置、EEPROM读写、音频编解码器初始化
-
I²S(Inter-IC Sound)
-
本质:基础音频流传输协议,专为双声道设计
-
信号线:
-
BCK(位时钟,如1.536MHz@48kHz)
-
LRCK(声道选择,48kHz)
-
SD(音频数据)
-
局限:仅支持左右双声道,无法扩展
-
SAI(Serial Audio Interface)
-
本质:I²S的超集,支持多声道/多协议
-
增强特性:
-
独立TX/RX时钟(可同时收发不同采样率音频)
-
支持TDM(8声道@32位)、AC97、PCM等协议
-
帧长度、时隙数可编程(如256位帧+8×32位时隙)
2. 硬件连接对比
⚙️ 二、协议深度解析:帧结构与时序
1. I²S帧结构(固定双声道)
| L通道16位 | R通道16位 | L通道16位 | R通道16位 |...
- 问题:扩展多声道需多组I²S接口,布线复杂
2. SAI的TDM模式(8声道示例)
hsai.FrameInit.FrameLength = 256;// 总帧长256位
hsai.SlotInit.SlotSize = SAI_SLOTSIZE_32B; // 每声道32位
hsai.SlotInit.SlotNumber = 8;// 8个声道
hsai.SlotInit.SlotActive = 0x00FF; // 激活全部时隙
- 帧时序:
| 时隙0(声道1) | 时隙1(声道2) | ... | 时隙7(声道8) |
3. I²C vs I²S/SAI时序对比
- I²C:
SCL _|‾|_|‾|_|‾|_
SDA XX|0xADDR|ACK|REG|ACK|DATA|ACK...
- I²S:
LRCK _|‾‾‾‾‾|____|...(左=高,右=低)
BCK _‾|_‾|_‾|...(每个脉冲传输1位)
SDD0 D1 D2...(音频数据)
🛠️ 三、实战案例详解
案例1:SAI实现8通道工业录音系统(STM32H743 + AD7768)
需求:同步采集8路传感器音频
硬件连接:
AD7768 ---SAI1--- STM32H743
├─ DOUT → SAI_SD_A
├─ DRDY → SAI_FS_A(帧同步)
├─ SCLK → SAI_SCK_A
└─ SYNC → PA0(TIM5同步触发)
关键代码:
// SAI配置为TDM接收模式
hsai.Init.AudioMode = SAI_MODESLAVE_RX;
HAL_SAI_Init(&hsai);
// DMA双缓冲接收(CCM RAM加速)
HAL_SAI_Receive_DMA(&hsai, (uint8_t*)adc_buffer, 2048);
经验:
- 抗干扰:SAI的FS信号与传感器DRDY直连,避免时钟偏移
- 降功耗:128kSPS采样时启用AD7768低噪声模式(比高速模式省电10mA)
案例2:I²S双声道播放(STM32F4 + WM8974)
硬件连接痛点:
WM8974有VIN(输入)和VOUT(输出),而I²S只有单数据线(SD)→ 需二选一
解决方案:
// 初始化I²S后,通过I²C配置WM8974路由
uint8_t data[2] = {0x01, 0x7F}; // R0: 使能DAC->输出
HAL_I2C_Master_Transmit(&hi2c1, 0x1A, data, 2, 100);
结果:
- 播放音频时:
I²S_SD → WM8974_VIN - 录音时:
WM8974_VOUT → I²S_SD(需I²C切换寄存器)
案例3:I²C配置音频编解码器
典型场景:设置采样率、增益、EQ
// 设置WM8974采样率48kHz(I²C地址0x1A)
uint8_t cfg[] = {
0x0C, 0x00, // R12: 关闭软复位
0x04, 0x10, // R4: 使能主时钟
0x06, 0x00, // R6: 48kHz采样率
};
HAL_I2C_Master_Transmit(&hi2c1, 0x1A, cfg, sizeof(cfg), 100);
💎 四、应用经验总结
1. 选型黄金法则
| 场景 | 推荐接口 | 理由 |
|---|---|---|
| 配置音频芯片寄存器 | I²C | 节省引脚,标准控制协议 |
| 双声道播放/录音 | I²S | 简单稳定,广泛兼容 |
| 多声道专业音频 | SAI(TDM) | 单线支持8声道,时钟独立 |
| 混合协议系统 | SAI | 同时兼容I²S/TDM/AC97 |
2. 避坑指南
-
I²C干扰问题:
现象:音频配置后出现噪声
解决:I²C总线上拉电阻从10kΩ改为4.7kΩ,缩短走线长度 -
SAI时钟抖动:
现象:高采样率(192kHz)时音频失真
解决:使用专用PLLI2S时钟源(非系统PLL分频) -
I²S声道错位:
现象:左右声道反转
解决:检查LRCK极性,修改hsai.FrameInit.FSPolarity = SAI_FS_ACTIVE_HIGH
3. 性能优化技巧
- SAI+DMA双缓冲:
HAL_SAI_Receive_DMA(&hsai, buf1, size);
HAL_SAI_Receive_DMA(&hsai, buf2, size); // 交替无延迟
- I²C加速:启用STM32的Fast Mode+(1Mbps)
- 功耗控制:SAI的TDM模式下,关闭未使用声道(
SlotActive = 0x0F)节省ADC功耗
💎 总结:协议本质决定应用场景
- I²C:设备控制的“神经”,不可传输音频流
- I²S:立体声传输的“骨干”,简洁可靠
- SAI:专业音频的“瑞士军刀”,多声道/多协议通吃
经验之谈:在智能音箱设计中,我们曾尝试用I²S传输4声道(两组I²S),结果PCB走线混乱且同步困难。改用SAI的TDM模式后,布线减少60%,声道同步精度提升至±10ns。
源码与设计参考:
更多推荐



所有评论(0)