2. 音频硬件基础:I2S/PCM/TDM 总线协议时序、采样率/位深/声道数概念、Codec 与 CPU DAI 的连接方式
2.1 数字音频基本概念:采样率、位深与声道数
在嵌入式音频系统中,模拟声音信号必须经过采样、量化和编码三个步骤才能转换为数字信号。这三个步骤对应的核心参数分别是采样率、位深和声道数,它们共同决定了数字音频的质量和数据带宽。
| 参数 | 定义 | 常见值 | 对音质/带宽的影响 |
|---|---|---|---|
| 采样率 (Sample Rate) | 每秒对模拟信号采样的次数,单位 Hz (kHz) | 8kHz (语音)、44.1kHz (CD)、48kHz (DVD/专业)、96kHz/192kHz (高解析) | 采样率越高,可还原的频率上限越高(奈奎斯特频率 = 采样率/2),数据量线性增加 |
| 位深 (Bit Depth) | 每个采样点用多少比特来表示动态范围 | 8-bit (低质量)、16-bit (CD)、24-bit (高解析)、32-bit (浮点处理) | 位深越大,信噪比越高(每增加1-bit,动态范围增加约6dB),数据量线性增加 |
| 声道数 (Channels) | 独立音频信号的数量 | 1 (Mono)、2 (Stereo)、6 (5.1环绕)、8 (7.1环绕) | 声道数越多,数据量成倍增加 |
比特率 (bps) = 采样率 (Hz) × 位深 (bits) × 声道数示例:CD 音质 (44.1kHz × 16-bit × 2) = 1,411,200 bps ≈ 1.41 Mbps。这是 I2S 总线必须承载的原始数据速率。
2.2 I2S 总线协议与时序
I2S (Inter-IC Sound) 是飞利浦公司制定的串行数字音频总线标准,是嵌入式系统中最常用的音频数据传输接口。它使用三根主要信号线:
- BCLK (Bit Clock):位时钟,每个脉冲对应一个数据位。频率 = 采样率 × 位深 × 声道数。
- LRCK (Left/Right Clock) / FS (Frame Sync):帧时钟,用于区分左右声道。频率 = 采样率。高电平通常表示左声道,低电平表示右声道(或反之,取决于配置)。
- SD (Serial Data):串行数据线,用于传输音频数据。可以是输入 (SDI) 或输出 (SDO)。
I2S 标准时序要求数据在 BCLK 的下降沿之后变化,在上升沿被接收。数据从 LRCK 切换后的第二个 BCLK 周期开始传输,MSB 优先。
2.3 PCM 与 TDM 总线协议
2.3.1 PCM (Pulse Code Modulation) 模式
PCM 模式与 I2S 非常相似,但有一个关键区别:数据在 LRCK (FS) 切换后的第一个 BCLK 周期就开始传输,而不是第二个。这使得 PCM 模式在帧同步上比 I2S 模式提前一个 BCLK 周期。许多 DSP 和 Codec 支持配置为 PCM 模式。
2.3.2 TDM (Time Division Multiplexing) 模式
TDM 是 I2S/PCM 的扩展,允许在同一根数据线上传输多个声道。它通过在一个帧周期内划分多个时隙 (Slot) 来实现。每个时隙对应一个声道的数据。TDM 广泛应用于多声道音频系统(如 5.1、7.1)和背板通信。
| 特性 | I2S (标准) | PCM (DSP 模式) | TDM |
|---|---|---|---|
| 数据起始位置 | LRCK 切换后第 2 个 BCLK | LRCK 切换后第 1 个 BCLK | 帧同步后第 1 个 BCLK |
| 声道数 | 固定 2 声道 (L/R) | 固定 2 声道 (L/R) | 可配置 (2/4/6/8/16 等) |
| 数据线数量 | 1 根 (SD) | 1 根 (SD) | 1 根或多根 (可并行) |
| 典型应用 | 立体声 Codec | DSP 链路、窄带语音 | 多声道 Codec、HDMI 音频 |
| 帧同步信号 | 50% 占空比 | 通常为短脉冲 (1 BCLK) | 短脉冲或 50% 占空比 |
2.4 Codec 与 CPU DAI 的连接方式
在嵌入式 Linux 音频系统中,CPU DAI (Digital Audio Interface) 是 SoC 内部集成的 I2S/PCM/TDM 控制器,负责将系统内存中的音频数据通过总线发送给外部 Codec(编解码器),或从 Codec 接收数据。Codec 负责数模/模数转换、音量控制、混音等功能。
2.4.1 典型连接拓扑
2.4.2 主从模式配置
在 DAI 链路中,时钟主机 (Clock Master) 负责产生 BCLK 和 LRCK 信号,时钟从机 (Clock Slave) 则接收这些时钟。主从模式的选择直接影响系统时钟树的设计。
| 配置模式 | 时钟源 | CPU DAI 角色 | Codec 角色 | 典型场景 |
|---|---|---|---|---|
| CPU Master / Codec Slave | SoC 内部 PLL 或外部晶振 | 主机 (提供 BCLK/LRCK) | 从机 (接收时钟) | 大多数嵌入式 Linux 系统,时钟管理简单 |
| Codec Master / CPU Slave | Codec 内部 PLL 或外部 MCLK | 从机 (接收时钟) | 主机 (提供 BCLK/LRCK) | Codec 需要独立时钟源,或 SoC 时钟精度不足 |
| 外部 Master | 独立时钟芯片 (如 Si5351) | 从机 | 从机 | 多 Codec 同步、高精度时钟需求 |
2.4.3 DAI 链路中的其他关键信号
- MCLK (Master Clock):Codec 的主时钟,用于内部 PLL 或 Delta-Sigma 调制器。频率通常是采样率的整数倍(如 256×, 384×, 512×)。例如,48kHz 采样率下,MCLK 可以是 12.288MHz (256×)。
- DAC_XVDD / ADC_AVDD:Codec 的模拟电源和数字电源,通常需要独立的 LDO 供电,以减少数字噪声对模拟信号的干扰。
- HP_OUT / LINE_IN:Codec 的模拟输入输出引脚,连接到耳机、麦克风、扬声器等外设。
2.5 实战:在设备树中描述 DAI 连接
在 ARM Linux 中,CPU DAI 和 Codec 的连接通过 设备树 (Device Tree) 进行描述。以下是一个典型的 I2S 连接设备树片段:
/* CPU DAI 节点 (以 Samsung Exynos I2S 为例) */
i2s0: i2s@3830000 {
compatible = "samsung,s3c6410-i2s";
reg = <0x03830000 0x100>;
clocks = <&clock_audss 0>, <&clock_audss 1>;