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 总线必须承载的原始数据速率。
实战要点:在配置 ALSA 驱动时,这三个参数必须与硬件 Codec 和 CPU DAI 的能力严格匹配。例如,如果 Codec 只支持 48kHz 采样率,驱动中就不能设置 44.1kHz,否则会导致时钟失锁或数据错位。

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 优先。

I2S 标准时序图 (Philips 模式) LRCK 左声道 (Left) 右声道 (Right) BCLK SD MSB Bit ... LSB MSB Bit ... LSB 关键时序约束:数据在 BCLK 下降沿变化,在上升沿采样。LRCK 在数据发送前一个 BCLK 周期切换。 MSB 总是紧跟在 LRCK 切换后的第二个 BCLK 周期开始传输。

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% 占空比
TDM 多声道时隙分配示意图 (8声道示例) FS SD Slot 0 Slot 1 Slot 2 Slot 3 Slot 4 Slot 5 Slot 6 Slot 7 L R C LFE LS RS Lb Rb TDM 关键配置参数: 1. Slot 宽度 (Slot Width):每个时隙占用的 BCLK 数,通常等于位深 (如 16/24/32 bits)。 2. Slot 数量 (Slot Number):一个帧周期内的总时隙数,必须 ≥ 声道数。 3. 帧同步信号类型:短脉冲 (DSP 模式) 或 50% 占空比 (I2S 模式)。

2.4 Codec 与 CPU DAI 的连接方式

在嵌入式 Linux 音频系统中,CPU DAI (Digital Audio Interface) 是 SoC 内部集成的 I2S/PCM/TDM 控制器,负责将系统内存中的音频数据通过总线发送给外部 Codec(编解码器),或从 Codec 接收数据。Codec 负责数模/模数转换、音量控制、混音等功能。

2.4.1 典型连接拓扑

CPU DAI 与 Codec 连接拓扑 CPU DAI I2S/PCM/TDM 控制器 (如: Samsung I2S, DesignWare I2S, MCASP, SAI) Codec 音频编解码器 (如: WM8960, TLV320AIC3x, NAU8822) BCLK LRCK / FS SD (TX/RX) 连接方式:CPU DAI 作为时钟主机 (Master) 提供 BCLK 和 LRCK,Codec 作为时钟从机 (Slave) 接收时钟。 也可以配置为 Codec 提供时钟 (Codec Master),此时 CPU DAI 作为从机。

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 同步、高精度时钟需求
时钟配置陷阱:在 CPU Master 模式下,必须确保 SoC 的 PLL 输出频率能够精确分频出所需的 BCLK 频率。例如,对于 48kHz × 16-bit × 2ch = 1.536MHz BCLK,如果 SoC 的 PLL 无法整除得到该频率,就会产生时钟抖动 (Jitter),导致音频失真。此时应考虑使用 Codec Master 模式或外部时钟源。

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>;