1. I2S协议基础:从飞利浦标准到TDM模式
各位同学,咱们今天聊聊I2S协议。说实话,我刚开始接触音频驱动时,也被这些时序图搞得头晕。但搞懂了I2S,后面PCM、TDM这些就一通百通了。
1.1 I2S总线标准——三条线搞定音频传输
I2S全称是Inter-IC Sound,飞利浦公司在1986年推出的。说白了,它就是用来在芯片之间传数字音频的。
标准I2S总线只需要三根线:
| 信号线 | 名称 | 作用 |
|---|---|---|
| SCK | 串行时钟 | 也叫位时钟(BCLK),每个脉冲对应一个数据位 |
| WS | 字选择 | 也叫帧时钟(LRCK),区分左/右声道 |
| SD | 串行数据 | 传输PCM音频数据 |
嗯,这里要注意:WS信号高电平通常代表左声道,低电平代表右声道。但有些芯片厂商会反过来,我就在一个项目中踩过这个坑——调了半天不出声,结果发现是WS极性反了。
1.2 飞利浦I2S协议——标准时序长什么样
飞利浦I2S协议有几个关键特征:
- 数据在SCK的上升沿锁存——发送端在下降沿更新数据,接收端在上升沿采样
- WS变化发生在SCK下降沿——比数据提前一个时钟周期
- 数据从MSB开始传输——最高有效位先发
- 数据位宽可配置——16位、24位、32位都常见
核心公式:
BCLK频率 = 采样率 × 位宽 × 声道数
例如:44.1kHz × 16bit × 2ch = 1.4112 MHz
我个人习惯用这个公式快速估算时钟频率。调试时拿示波器一量BCLK,就知道配置对不对。
1.3 左对齐与右对齐格式——别搞混了
除了飞利浦标准,还有两种常见格式:
| 格式 | 数据起始位置 | 与WS的关系 |
|---|---|---|
| 飞利浦I2S | WS变化后延迟1个BCLK | 数据比WS晚一拍 |
| 左对齐 | WS变化后立即开始 | MSB与WS边沿对齐 |
| 右对齐 | 数据靠右对齐 | LSB在WS边沿前结束 |
我曾经在对接一颗DAC芯片时,数据手册写的是"Left Justified",我按飞利浦模式配的,结果出来的声音全是噪声。后来仔细看时序图才发现,左对齐模式下数据不延迟那一个BCLK周期。
避坑指南:很多CODEC芯片支持多种格式,但默认配置可能不同。上电后先读寄存器确认当前格式,别想当然。
1.4 PCM接口——不只是I2S的别名
很多人把PCM接口和I2S混为一谈。其实PCM接口更灵活:
- 帧同步信号——可以是脉冲方式,不一定是50%占空比
- 时隙可配置——每个声道占用的BCLK数量可调
- 支持多声道——通过时分复用实现
我举个例子:标准的I2S是2声道,但PCM接口可以扩展到8声道甚至更多。这在车载音频系统中很常见——一个PCM接口同时传左前、右前、左后、右后四个声道。
1.5 TDM模式——多声道音频的利器
TDM(时分复用)是PCM接口的进阶玩法。它的核心思想是:在一根数据线上,按时间片轮流传输多个声道的数据。
TDM的关键参数:
- 帧长度——一个完整帧包含多少个BCLK周期
- 时隙数——每个帧分成几个时隙
- 时隙宽度——每个时隙占几个BCLK
实战经验:调试TDM时,我习惯先配成2声道模式验证基本通路,确认没问题后再扩展到多声道。这样排查问题快很多。
下面这张图展示了I2S、左对齐、TDM三种模式的时序差异:
1.6 实际调试中的常见问题
我总结了几条实战经验,希望对你有帮助:
- 时钟极性搞反——有些芯片用BCLK上升沿锁存数据,有些用下降沿。先看数据手册的时序图
- 位宽不匹配——发送端发24位数据,接收端按16位解析,声音会变调
- 帧同步信号宽度不对——TDM模式下尤其容易出这个问题
调试小技巧:用逻辑分析仪抓取BCLK、WS和SD三根线的波形,对照数据手册的时序图逐位检查。我每次调I2S都是这么干的,基本半小时内能定位问题。
好了,I2S协议基础就讲到这里。搞懂了这些概念,后面咱们写驱动时就知道寄存器该怎么配了。