1. 音频时钟基础:采样率、位时钟、帧时钟的概念与关系

在嵌入式 Linux 音频系统中,I2S 与 PCM 接口的物理层通信完全由三个时钟信号驱动:采样时钟 (LRCLK / Frame Sync)、位时钟 (BCLK / Bit Clock) 和 主时钟 (MCLK / Master Clock)。理解这三个时钟的频率关系与时序约束,是正确配置音频驱动、消除杂音与时钟漂移的前提。

1.1 核心概念定义

时钟名称 别名 频率公式 功能描述
采样时钟 LRCLK, Frame Sync, FSYNC fs (采样率) 标识一个音频帧的开始;左/右声道切换信号
位时钟 BCLK, Bit Clock, SCK fs × 声道数 × 位深 每个时钟周期传输 1 位音频数据
主时钟 MCLK, Master Clock fs × 256 / 384 / 512 CODEC 内部 Σ-Δ 调制器与数字滤波器的基准时钟
关键记忆点:采样时钟决定音频的“时间分辨率”,位时钟决定“数据吞吐率”,主时钟决定“CODEC 内部处理精度”。三者必须保持整数倍关系,否则会产生时钟失锁或数据溢出。

1.2 三时钟的频率关系

以标准 I2S 格式、双声道、16 位深、48 kHz 采样率为例:

  • 采样时钟 (LRCLK) = 48 kHz
  • 位时钟 (BCLK) = 48 kHz × 2 (声道) × 16 (位深) = 1.536 MHz
  • 主时钟 (MCLK) = 48 kHz × 256 = 12.288 MHz(常用倍率)

通用关系式:

BCLK = fs × channels × sample_width
MCLK = fs × mclk_multiplier  (mclk_multiplier 通常为 256、384、512)
常见配置陷阱:部分 CODEC 要求 MCLK 必须是 BCLK 的整数倍,且 BCLK 必须是 LRCLK 的整数倍。若驱动中设置的 mclk_multiplier 与硬件实际分频比不匹配,会导致音频数据移位或完全无声。

1.3 PCM 音频数据流时序图

下图展示标准 I2S 格式下,一个完整音频帧(左声道 + 右声道)的时钟与数据时序关系:

I2S PCM 音频数据流时序图 I2S 标准模式 — PCM 音频数据流时序图 (fs=48kHz, 16bit, 双声道) LRCLK 左声道 (L) 右声道 (R) BCLK 16 个 BCLK 周期 (左声道) → 16 个 BCLK 周期 (右声道) → SD MSB (bit 15) ... ... ... LSB (bit 0) MSB (bit 15) ... ... ... LSB (bit 0) 说明:LRCLK 高电平表示左声道数据,低电平表示右声道数据(I2S 标准格式) SD 数据在 BCLK 下降沿被发送端更新,在上升沿被接收端采样

1.4 常见采样率与时钟频率对照表

采样率 (fs) 位深 声道数 BCLK 频率 MCLK (×256) MCLK (×384)
8 kHz 16 2 256 kHz 2.048 MHz 3.072 MHz
16 kHz 16 2 512 kHz 4.096 MHz 6.144 MHz
44.1 kHz 16 2 1.4112 MHz 11.2896 MHz 16.9344 MHz
48 kHz 16 2 1.536 MHz 12.288 MHz 18.432 MHz
96 kHz 24 2 4.608 MHz 24.576 MHz 36.864 MHz
192 kHz 24 2 9.216 MHz 49.152 MHz 73.728 MHz
实战要点:在嵌入式 Linux 设备树中配置音频时钟时,通常需要同时指定 mclk-fs 属性(即 MCLK 与 fs 的倍率)。例如 mclk-fs = <256>。若 CODEC 数据手册要求 MCLK 为 12.288 MHz 而采样率为 48 kHz,则倍率必须设为 256,否则驱动会计算出错误的时钟分频值。

1.5 时钟同步的硬件架构

下图展示典型的嵌入式音频时钟树结构,说明主控 SoC 与外部 CODEC 之间的时钟供给关系:

嵌入式音频时钟树架构图 嵌入式音频时钟树 — SoC 与 CODEC 时钟供给关系 主控 SoC I2S / PCM 控制器 内部 PLL 时钟源 外部 CODEC 音频 ADC / DAC 内部 PLL / 分频器 MCLK (主时钟) BCLK (位时钟) LRCLK (帧同步) SD (串行数据) 时钟方向:SoC 作为时钟主设备 (Master) 向 CODEC 提供 MCLK、BCLK、LRCLK 若 CODEC 作为主设备,则时钟方向相反,SoC 需配置为时钟从设备 (Slave)

1.6 时钟配置的常见问题与排查思路

  • 问题 1:音频播放有“噼啪”杂音 — 通常是因为 BCLK 与 LRCLK 的相位关系不对,或 MCLK 频率偏差超过 CODEC 的 PLL 锁定范围。检查驱动中 set_sysclk 与 set_fmt 的调用顺序。
  • 问题 2:左/右声道数据颠倒 — I2S 标准格式中 LRCLK 高电平为左声道,低电平为右声道。若 CODEC 配置为“左对齐”或“右对齐”格式,需在驱动中正确设置 SND_SOC_DAIFMT_I2S 标志。
  • 问题 3:采样率不匹配导致声音变调 — 检查 snd_pcm_hw_params 中设置的 rate 是否与 CODEC 实际配置的采样率一致。使用 clk_get_rate 确认 MCLK 实际输出值。
调试命令速查:在 Linux 终端使用 cat /proc/asound/card0/pcm0p/sub0/hw_params 查看当前 PCM 设备的硬件参数,包括采样率、位深、缓冲区大小。使用 clk_summary 或 debugfs 查看时钟树实际频率。