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 主机→从机 串行数据输出(播放方向)
工程师笔记: 多数SoC的I2S控制器支持主机模式(Master),即由CPU产生BCLK和LRCK。若Codec做主时钟源,则需配置为从机模式(Slave)。驱动中通过设置时钟极性(POL)和相位(PHASE)来匹配Codec的时序要求。

2.1.2 I2S 时序标准

I2S标准要求数据在BCLK的下降沿变化,在上升沿被采样。LRCK在数据发送前一个BCLK周期切换,保证左右声道数据对齐。下图展示了标准的I2S时序关系:

I2S 标准时序图(Philips 格式) BCLK LRCK 左声道 (L) 右声道 (R) SD MSB bit LSB MSB bit LSB 关键时序约束: ① 数据在BCLK下降沿变化,在上升沿被接收端采样 ② LRCK在MSB传输前一个BCLK周期切换,保证声道对齐

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位。

PCM 接口时序图(短帧同步模式) BCLK FSYNC 帧起始脉冲 SD Slot0 Slot1 Slot2 Slot3 Slot4 Slot5 Slot6 Slot7 PCM 短帧同步:FSYNC 脉冲宽度 = 1 BCLK,数据在脉冲后第一个BCLK上升沿开始传输 每个时隙(Slot)可独立配置位宽,支持非连续时隙分配

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时隙宽度
驱动适配要点: TDM接口在ALSA驱动中通过设置 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声道输入)
淘汰警告: AC97接口在2010年后逐渐被HDA(High Definition Audio)和I2S取代。嵌入式领域仅在少数老旧SoC(如PXA系列、部分早期i.MX)中保留。新项目不建议采用AC97,驱动移植时若遇到AC97 Codec,建议评估替换为I2S接口的现代Codec。

2.5 Codec 与 CPU 的连接方式

音频Codec与CPU之间的连接不仅包括数字音频接口(DAI),还涉及控制总线、时钟源和电源管理。下图展示了典型的嵌入式音频硬件连接拓扑:

CPU 与 Codec 典型连接拓扑 CPU / SoC I2S 控制器 I2C 控制器 DMA 引擎 Audio Codec I2S 接口 I2C 从设备 ADC / DAC I2S (BCLK/LRCK/SD) I2C (SCL/SDA) MCLK (主时钟) 晶振 / PLL 提供 MCLK 扬声器 / 麦克风 模拟音频 I/O MCLK 可由 CPU 提供或独立晶振产生 I2C 用于 Codec 寄存器配置(音量、路由、采样率)

2.5.1 三种典型连接模式

  1. CPU 主时钟模式: CPU 通过内部PLL产生MCLK,同时作为I2S主机提供BCLK和LRCK。Codec配置为从机。适用于SoC集成度高、时钟资源丰富的场景。
  2. Codec 主时钟模式: Codec 使用外部晶振或自身PLL产生MCLK,并作为I2S主机驱动BCLK和LRCK。CPU配置为从机。适用于Codec需要独立时钟域的场景(如USB音频)。
  3. 独立时钟源模式: 外部晶振直接提供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
实战建议: 在移植驱动时,首先确认Codec的数据手册中DAI接口类型(I2S/PCM/TDM)和控制总线类型(I2C/SPI)。然后在设备树中正确配置 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主板、遗留项目维护