瑞芯微 I2S 学习笔记:基础概念与硬件架构
1. 概述
I2S(Inter-IC Sound,集成电路间音频总线)是飞利浦于 1986 年制定的一种用于数字音频设备之间传输 PCM 数据的串行总线标准。瑞芯微(Rockchip)SoC 内部集成了多路 I2S/PCM/TDM 控制器,广泛应用于 RK3566、RK3568、RK3588、RK3399、RV1126、RK3562 等系列芯片中,承担与外部 Codec、蓝牙音频、HDMI、DP、SoC 内部音频总线(如 SPDIF、PDM)之间的数字音频传输任务。
本篇从协议层、信号定义、典型连接、瑞芯微控制器特性四个维度建立整体认知,为后续驱动和应用开发打下基础。
2. I2S 协议基础
2.1 信号线定义
经典 I2S 总线由以下几根信号组成:
| 信号 | 方向 | 说明 |
|---|---|---|
| BCLK | Controller → Peripheral | 位时钟(Bit Clock),每一位数据对应一个 BCLK 脉冲 |
| LRCLK / WS | Controller → Peripheral | 左右声道选择时钟(Word Select / Left-Right Clock),低电平表示左声道,高电平表示右声道 |
| SDOUT / SDI | Controller → Peripheral | 控制器发送数据(控制器侧的 TX) |
| SDIN / SDO | Peripheral → Controller | 控制器接收数据(控制器侧的 RX) |
| MCLK | Controller → Peripheral | 主时钟(Master Clock),可选,提供 Codec 内部 PLL 参考时钟 |
瑞芯微 I2S 控制器既可作为 Master,也可作为 Slave;通常应用为主模式,由 SoC 提供 BCLK 和 LRCLK。
2.2 时序要点
- 数据相对于 LRCLK 边沿的采样:标准 I2S 在 LRCLK 变化后的第二个 BCLK 上升沿开始传输左声道 MSB;左对齐(Left-Justified)在第一个 BCLK 上升沿开始;右对齐(Right-Justified)数据 LSB 在 LRCLK 切换前一个 BCLK 结束。
- 数据宽度:常见 16/20/24/32 bit。
- 字长度:BCLK 周期数大于数据位宽时,会自动补零或重复 MSB(取决于 Codec 配置)。
- LRCLK 频率 = 采样率(Fs),例如 48 kHz 音频的 LRCLK 即 48 kHz。
2.3 三种对齐格式
LRCLK
___ |____________________________________
| L | R |
__| |______|____________________________________
^ ^
| |
LRCLK 下降沿(标准 I2S: 数据延迟 1 BCLK;左对齐: 数据从下降沿立即有效)
- Standard / Philips I2S:LRCLK 变化后第二个 BCLK 上升沿采样 MSB。
- Left-Justified (MSB-First, LJ):LRCLK 变化后第一个 BCLK 上升沿采样 MSB。
- Right-Justified (LSB-First, RJ):数据右对齐到 LRCLK 切换沿前一位,常用于 DSP 与 Codec 直连。
2.4 TDM 与多声道扩展
当需要传输超过 2 声道(如 4/6/8 声道)时,I2S 进入 TDM(Time-Division Multiplexing)模式:
- LRCLK 不再代表左右声道,而是"帧同步"信号(FSYNC)。
- 每一帧内通过时隙(slot 0..N-1)分配多路数据。
- 瑞芯微 I2S 控制器原生支持 TDM8/TDM16,可直接对接 HDMI、DP 音频或多麦克风阵列。
3. 瑞芯微 I2S 控制器架构
3.1 在 SoC 中的位置
以 RK3588 为例,音频子系统路径如下:
┌──────────────────────────────────────┐
│ Application │
│ (ALSA / tinyalsa / pulseaudio) │
└──────────────────────────────────────┘
│ /dev/snd/...
┌─────────────▼────────────────────────┐
│ ASoC Core / DAI / PCM │
└──────────────────────────────────────┘
┌───────┬───────────────────┬──────────┐
│ │ │ │
┌───▼──┐ ┌──▼───┐ ┌─────▼────┐ ┌──▼───┐
│ I2S0 │ │ I2S1 │ ... │ SPDIF TX │ │ PDM │
│ (CPU)│ │(HDMI)│ └──────────┘ └──────┘
└──┬───┘ └──┬───┘
│ │
┌──▼───┐ ┌──▼──────────────┐
│Codec │ │HDMI PHY/eDP PHY │
└──────┘ └─────────────────┘
瑞芯微芯片内部通常包含 2~4 路 I2S 控制器,部分型号带有 HDMIAudio、SPDIF、PDM、VAD(语音活动检测)等模块。各路 I2S 互相独立,可独立工作于不同采样率与位宽。
3.2 RK3588 I2S 控制器特性
| 特性 | 说明 |
|---|---|
| 接口数 | I2S0 / I2S1 / I2S2 / I2S3 共 4 路 |
| 工作模式 | I2S 主/从,PCM 主/从,TDM 主/从 |
| 数据位宽 | 16 / 20 / 24 / 32 bit |
| 采样率 | 8 kHz ~ 192 kHz |
| 时钟源 | SoC 内部 PLL 派生,支持 fractional divider |
| 传输通道 | RX / TX 各独立 FIFO,可配置 DMA 触发水位 |
| 音频格式 | Philips I2S / Left-Justified / Right-Justified / PCM A / PCM B |
| TDM | 支持最多 16 slot,单 slot 8~32 bit |
| 数字混音 | 部分型号内置数字 mixer、I2S 间 loopback |
3.3 寄存器组成(简化)
瑞芯微 I2S 控制器的寄存器布局大致相同,常见功能组包括:
- 全局控制:
CR(控制寄存器)、IER/ISR(中断使能与状态)、RXFFR/TXFFR(FIFO 复位)、CLEAR(中断清除)。 - 时钟分频:
CLKDIV、MCLK_DIV、BCLK_DIV、LRCLK_DIV、SAMPLE_RATE派生计算器。 - 传输格式:
TXCR/RXCR(位宽、对齐方式、LR/PCM 模式)、TXSLOT/RXSLOT(TDM slot 位置)、TXCHMAP/RXCHMAP(通道映射)。 - FIFO / DMA:
TXFIFOLR/RXFIFOLR(当前水位)、DMA/DMATR(DMA 控制)、TDM_TXCR/TDM_RXCR。
不同型号寄存器细节会有差异,但编程模型一致:先配时钟,再配格式,最后配 FIFO/DMA。
4. 典型硬件连接
4.1 I2S 接外部 Codec
RK3588 ES8388 / ALC5616 / AC108 ...
┌─────┐ ┌──────────────┐
│ │---BCLK---------->│ BCLK │
I2S0 │ I2S │---LRCLK--------->│ LRCLK / WS │
│CTRL │---SDOUT--------->│ SDIN │
│ │<--SDIN-----------│ SDOUT │
│ │---MCLK---------->│ MCLK │
└─────┘ └──────────────┘
要点:
- MCLK 频率 = 采样率 × MCLKFS,通常为 256 Fs / 384 Fs / 512 Fs。
- 多个 Codec 共享 BCLK/LRCLK 时,需关注总线驱动能力(一般只允许 1 主 1 从,多从会因负载过大导致信号畸变)。
- MCLK 可由 I2S 控制器内部派生,也可由独立 GPIO + I2S 衍生的 mclk 引脚提供。
4.2 I2S 桥接 HDMI / DP 音频
HDMI/DP 的音频子包通过 I2S 总线传输给 PHY:
I2S1 (RK3588) ──► HDMI PHY ──► HDMI Tx Controller ──► HDMI Connector
HDMI 音频采用 2/4/6/8 声道,I2S 必须配置为 TDM 模式,时隙分配遵循 HDMI 规范:slot 0~3 分别对应 FL/FR/RL/RR。瑞芯微 BSP 默认提供 rk_hdmi_sound 节点做对应绑定。
4.3 PDM 数字麦克风
PDM 数字麦通过 RK 芯片内的 PDM 控制器接出,不再走 I2S;但若芯片没有 PDM(如早期 RK3328),可通过 I2S 外接 PDM-to-PCM 转换 IC 实现拾音。
4.4 多板互连
板间音频互联场景(例如 SoM + 子板):
- 主-从模式:让 SoM 输出 BCLK/LRCLK,子板 Codec 作从机,避免双方各自驱动导致频率漂移。
- 共地 + 短走线:I2S 在 MCLK=24.576 MHz 时,信号上升沿应小于 5 ns,对走线长度、阻抗匹配敏感。
5. 采样率与时钟计算
瑞芯微 I2S 的 BCLK 派生关系:
BCLK = Clock Source / (BCLK_DIV + 1) / (LRCK_DIV + 1) = Fs × BitWidth × Channels
示例:48 kHz、24 bit、2 ch:
BCLK = 48000 × 24 × 2 = 2.304 MHz
LRCLK = 48 kHz
MCLK = 48000 × 256 = 12.288 MHz(当 MCLKFS = 256)
如果采样率配置异常,常见症状是:
- Codec 静音或出现咔嗒声;
- HDMI 输出时被 HDMI 接收端判为 invalid format;
- ALSA 报错
snd_pcm_hw_params failed。
6. 时钟树与 PLL 配置
瑞芯微 I2S 的输入时钟源一般有:
clk_i2s0_frac—— 来自 CPLL/GPLL/AUDPLL;clk_i2s0_src—— 二级 mux 选择;i2s0_mclk_out—— 给 Codec 的主时钟。
在 RK3568/RK3588 上 AUDPLL 频率通常为 98.304 MHz / 90.3168 MHz,可整除 48k/96k 系列采样率,得到零分数偏差。
要避免常见坑:
- 不要使用 GPLL 作为 MCLK 源,长时间运行可能因系统负载引起抖动;
- 需要多路同步时(如 HDMI 视频与音频同步),使用同一 PLL 派生;
- 若使用 44.1 kHz 系,需要在驱动层强制使用专门的 90.3168 MHz PLL。
7. 数据通路与缓冲机制
7.1 FIFO 行为
I2S 控制器内置 TX/RX FIFO(典型深度 64×32bit)。DMA 与 CPU 均可访问。
- DMA 模式下,水位触发 DMA 请求;
- 中断模式下,FIFO 达阈值触发中断;
- FIFO 复位 (
RXFFR/TXFFR) 用于暂停后的恢复。
7.2 DMA 通道
Linux 下通过 sound/soc/rockchip/ 驱动申请 DMA 通道:
struct snd_dmaengine_dai_dma_data *dma_data;
dma_data = devm_kzalloc(dev, sizeof(*dma_data), GFP_KERNEL);
dma_data->addr = res->start + I2S_TXDR; /* TX FIFO 地址 */
dma_data->addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
dma_data->maxburst = 8;
DMA burst 设置会影响 ALSA period size 最佳值;瑞芯微 BSP 一般建议 period_size = 1024,buffer_size = 4096。
7.3 中断类型
- TXE/RXF —— FIFO 阈值中断;
- UNDR/OVR —— underrun / overrun;
- CLR —— clear for next 帧;
- 错误中断需要在 ISR 中清除并复位 FIFO。
8. 与其他音频接口的关系
| 接口 | 关系 | 说明 |
|---|---|---|
| PCM | 类似 | 通常用来接 Bluetooth/Modem,是 I2S 的子集 |
| TDM | I2S 扩展 | 多 slot,常用于 HDMI/DP/Multi-Mic |
| PDM | 独立 | 数字麦接口,与 I2S 协议不同 |
| SPDIF | 独立 | 索尼/飞利浦数字音频接口 |
| SoundWire | 独立 | MIPI SoundWire,瑞芯微部分新芯片支持 |
| HDMI/DP Audio | 走 I2S/TDM | HDMI Tx 内部包含 I2S-to-HAD 转换 |
9. 关键性能指标
设计/选型时关注:
- THD+N:Codec 决定,一般 ≤ 0.005 %;
- 底噪:与电源、PCB 布局强相关,RK 控制器本底噪声 < -90 dB;
- **抖动 (Jitter)**:MCLK 抖动 < 50 ps RMS;
- 延迟:典型 ALSA 通路 round-trip 延迟 = 2 × period_size / Fs ≈ 21 ms @ 48 kHz / 1024 sample。
更多推荐
所有评论(0)