2. 音频硬件接口基础:I2S、PCM、TDM、AC97接口时序与信号线定义,Codec与CPU的连接方式
在嵌入式Linux音频驱动开发中,理解音频硬件接口是移植与适配的第一步。CPU(主控端)与Codec(音频编解码芯片)之间的数字音频接口决定了数据传输的格式、速率和通道数。本章将深入剖析四种主流接口:I2S、PCM、TDM 和 AC97,并讲解它们与Codec的典型连接拓扑。
2.1 I2S 接口:立体声数字音频的基石
I2S(Inter-IC Sound)由飞利浦公司制定,是嵌入式领域最普及的音频总线。它专为立体声PCM音频数据设计,采用三线制或四线制同步串行传输。
2.1.1 信号线定义
| 信号线 | 全称 | 方向 | 功能描述 |
|---|---|---|---|
| BCLK | Bit Clock | 主机→从机 | 位时钟,每个脉冲对应一个数据位,频率 = 采样率 × 位宽 × 通道数 |
| LRCK | Left/Right Clock | 主机→从机 | 帧时钟(也称WS),高电平左声道,低电平右声道,频率 = 采样率 |
| SDI | Serial Data In | 从机→主机 | 串行数据输入(录音方向) |
| SDO | Serial Data Out | 主机→从机 | 串行数据输出(播放方向) |
2.1.2 I2S 时序标准
I2S标准要求数据在BCLK的下降沿变化,在上升沿被采样。LRCK在数据发送前一个BCLK周期切换,保证左右声道数据对齐。下图展示了标准的I2S时序关系:
2.2 PCM 接口:多通道与时分复用
PCM(Pulse Code Modulation)接口在嵌入式领域常指一种与I2S类似的同步串行接口,但支持更灵活的时隙配置。它通常用于多通道或长帧长的场景,如蓝牙音频、数字无线麦克风等。
2.2.1 与I2S的核心差异
| 对比项 | I2S | PCM(标准模式) |
|---|---|---|
| 帧同步信号 | LRCK(50%占空比) | FSYNC(短脉冲或长脉冲) |
| 声道映射 | 固定左/右声道 | 时隙0/时隙1…时隙N |
| 数据对齐 | MSB在LRCK切换后立即开始 | MSB在FSYNC有效后延迟1个BCLK |
| 典型应用 | 立体声音频播放/录音 | 多通道音频、语音编解码 |
2.2.2 PCM 时序特点
PCM接口的帧同步信号FSYNC通常为短脉冲(1个BCLK宽度),用于标识每个帧的起始位置。数据在FSYNC脉冲后的第一个BCLK上升沿开始传输,支持最多32个时隙(Slot),每个时隙可配置为8/16/20/24/32位。
2.3 TDM 接口:高密度多通道音频总线
TDM(Time Division Multiplexing)是PCM接口的扩展,专为高通道数场景设计,常见于专业音频设备、车载音响系统(如A2B总线)和数字麦克风阵列。TDM将多个声道的数据按时间片交错排列在同一数据线上传输。
2.3.1 TDM 帧结构
TDM的一帧包含N个时隙(Slot),每个时隙对应一个声道。帧同步信号(FSYNC)标识帧起始,BCLK连续运行。典型的TDM帧结构如下:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 帧长 | 32/64/128/256 BCLK | 由时隙数 × 时隙位宽决定 |
| 时隙数 | 2/4/8/16/32 | 每个时隙对应一个声道 |
| 时隙位宽 | 16/20/24/32 bit | 每个声道的采样精度 |
| FSYNC 模式 | 短脉冲 / 长脉冲 | 短脉冲=1BCLK,长脉冲=1时隙宽度 |
snd_dai_link 的 dai_fmt 和 slot_width 来配置。内核中 struct snd_dmaengine_dai_dma_data 的 maxburst 参数需与TDM帧长对齐,否则DMA传输会错位。
2.4 AC97 接口:早期PC音频标准
AC97(Audio Codec '97)由Intel提出,曾是PC主板集成音频的事实标准。它采用5线制同步串行接口,将音频数据、控制命令和状态信息分时复用在同一总线上。
2.4.1 信号线定义
| 信号线 | 方向 | 功能 |
|---|---|---|
| BIT_CLK | Codec→控制器 | 12.288 MHz 固定位时钟 |
| SYNC | 控制器→Codec | 48 kHz 帧同步信号(12.288 MHz / 256) |
| SDATA_OUT | 控制器→Codec | 播放数据与命令写入 |
| SDATA_IN | Codec→控制器 | 录音数据与状态读取 |
| RESET# | 控制器→Codec | 硬件复位,低电平有效 |
2.4.2 AC97 帧格式
AC97每帧包含256个BIT_CLK周期,分为13个时隙:
- 时隙0(Tag Slot): 标识后续12个时隙的有效性
- 时隙1-2: 命令/状态地址与数据
- 时隙3-12: 音频数据通道(最多6声道输出、2声道输入)
2.5 Codec 与 CPU 的连接方式
音频Codec与CPU之间的连接不仅包括数字音频接口(DAI),还涉及控制总线、时钟源和电源管理。下图展示了典型的嵌入式音频硬件连接拓扑:
2.5.1 三种典型连接模式
- CPU 主时钟模式: CPU 通过内部PLL产生MCLK,同时作为I2S主机提供BCLK和LRCK。Codec配置为从机。适用于SoC集成度高、时钟资源丰富的场景。
- Codec 主时钟模式: Codec 使用外部晶振或自身PLL产生MCLK,并作为I2S主机驱动BCLK和LRCK。CPU配置为从机。适用于Codec需要独立时钟域的场景(如USB音频)。
- 独立时钟源模式: 外部晶振直接提供MCLK给CPU和Codec,两者均配置为从机模式,由外部时钟同步。适用于对时钟抖动要求高的Hi-Fi音频系统。
2.5.2 控制总线选择
| 控制总线 | 速率 | 典型应用 | 驱动接口 |
|---|---|---|---|
| I2C | 100/400 kHz | 绝大多数嵌入式Codec | struct i2c_driver |
| SPI | 1-10 MHz | 高性能Codec、多寄存器配置 | struct spi_driver |
| SLIMbus | 动态 | 移动设备、多Codec互联 | struct slim_device |
sound-dai 和 #sound-dai-cells 属性,确保CPU侧DAI与Codec侧DAI的格式、时钟极性和时隙配置完全匹配。
2.6 接口选择决策指南
在实际项目中,选择合适的音频接口需要综合考虑通道数、采样率、布线复杂度和Codec成本。下表总结了四种接口的适用场景:
| 接口 | 最大通道数 | 典型采样率 | 布线复杂度 | 推荐场景 |
|---|---|---|---|---|
| I2S | 2(立体声) | 8k - 192k Hz | 低(3-4线) | 消费电子、语音助手、便携设备 |
| PCM | 2-8 | 8k - 48k Hz | 低(3-4线) | 蓝牙音频、VoIP、数字麦克风 |
| TDM | 4-32 | 48k - 192k Hz | 中(3-4线) | 车载音响、多声道功放、阵列麦克风 |
| AC97 | 6出2入 | 48 kHz 固定 | 中(5线) | 老旧PC主板、遗留项目维护 |