1. 音频系统概述:嵌入式音频系统组成、Codec芯片作用、I2S/PCM/DMIC总线介绍

1.1 嵌入式音频系统的整体组成

嵌入式音频系统是一个典型的数字-模拟混合信号处理系统,其核心任务是将数字音频数据(如MP3、AAC、PCM流)转换为模拟声音信号驱动扬声器/耳机,或者将麦克风采集的模拟信号转换为数字数据供SoC处理。一个完整的嵌入式音频硬件链路通常包含以下四个层次:

层次 典型器件 功能说明
音频源/宿 麦克风、扬声器、耳机、LINE IN/OUT 声电/电声换能器,完成声音与电信号之间的转换
Codec芯片 WM8960、ES8316、TLV320AIC3x ADC/DAC、混音、增益控制、滤波、功率放大
数字音频总线 I2S、PCM、TDM、DMIC 在SoC与Codec之间传输数字音频数据流
SoC音频控制器 I2S控制器、SAI、McASP 生成位时钟/帧时钟,收发PCM数据,DMA搬运
课程提示: 在ALSA驱动开发中,驱动工程师主要关注Codec芯片和数字音频总线两层。SoC端的I2S控制器通常由BSP厂商提供,驱动开发者需要做的是将Codec通过总线挂接到ALSA框架中。
嵌入式音频系统硬件架构 SoC I2S控制器 / DMA 数字音频总线 I2S / PCM / TDM Codec芯片 ADC / DAC / 混音 模拟外设 扬声器 / 麦克风 控制总线:I2C / SPI SoC通过I2C/SPI 配置Codec寄存器

1.2 Codec芯片的核心作用

Codec(Coder-Decoder)是音频系统的中枢器件,它承担着数字域与模拟域之间的双向转换任务。在嵌入式Linux系统中,Codec芯片通常通过I2C或SPI总线接收SoC的控制命令,通过I2S/PCM总线传输音频数据。其核心功能模块包括:

  • ADC(模数转换器):将麦克风或LINE IN输入的模拟信号转换为数字PCM数据。
  • DAC(数模转换器):将SoC送来的数字PCM数据转换为模拟信号驱动耳机或扬声器。
  • 混音器(Mixer):支持多路输入信号的混合、切换与衰减。
  • 增益控制(Volume/Gain):可编程的模拟/数字音量调节,通常以dB步进。
  • 滤波器(Filter):数字滤波、去加重、噪声门等信号处理功能。
  • 功率放大器(PA):部分Codec内置D类或AB类功放,可直接驱动扬声器。
驱动开发视角: ALSA框架中的snd_soc_component_driver结构体正是用来描述Codec芯片的这些能力。驱动开发者需要实现probe、set_bias_level、hw_params、digital_mute等回调函数,将Codec的硬件特性注册到ALSA核心。

1.3 数字音频总线:I2S、PCM、DMIC

数字音频总线是SoC与Codec之间传输音频数据的物理通道。不同的总线协议在引脚数量、时钟方案、数据格式上有所差异。下表对比了三种最常见的嵌入式音频总线:

特性 I2S(Inter-IC Sound) PCM(Pulse Code Modulation) DMIC(Digital Microphone)
引脚数 3(BCLK、LRCLK、DIN/DOUT) 3(BCLK、SYNC、DATA) 2(CLK、DATA)
帧同步方式 左右声道独立帧,LRCLK高/低电平指示 SYNC脉冲指示帧起始,支持多时隙TDM 由CLK上升沿触发数据输出
数据格式 MSB对齐,左对齐或右对齐 时隙固定,支持8/16/20/24/32位 1位PDM流,需SoC端抽取滤波
典型应用 立体声Codec、Hi-Fi音频 多通道音频、语音编解码器 数字硅麦阵列、降噪麦克风
ALSA驱动接口 SND_SOC_DAIFMT_I2S SND_SOC_DAIFMT_DSP_A/B 通常通过I2S控制器PDM模式

1.3.1 I2S总线详解

I2S是嵌入式音频领域最主流的数字音频总线,由Philips公司(现NXP)制定。其三条信号线定义如下:

  • BCLK(位时钟):每个脉冲对应一个数据位,频率 = 采样率 × 位宽 × 通道数。
  • LRCLK(帧时钟/字选择):频率等于采样率,高电平表示左声道,低电平表示右声道(或相反,可配置)。
  • SD(串行数据):通常为I2S_DIN(Codec输出给SoC)和I2S_DOUT(SoC输出给Codec)。

I2S标准数据格式要求:数据在BCLK下降沿变化,在上升沿被采样;数据从MSB开始传输,且MSB在LRCLK切换后的第二个BCLK周期开始发送(比LRCLK延迟一个BCLK)。

I2S总线时序图(标准模式,16位数据) BCLK LRCLK 左声道 (L) 右声道 (R) SD MSB bit14 bit13 ... bit1 LSB MSB bit14 bit13 ... bit1 LSB 注意:I2S标准中,MSB在LRCLK切换后的第2个BCLK周期开始传输(比LRCLK延迟1个BCLK) 数据在BCLK下降沿变化,上升沿被接收端采样

1.3.2 PCM(DSP)总线

PCM总线(在ALSA中常称为DSP模式)与I2S类似,但帧同步方式不同:PCM使用短脉冲或长脉冲作为帧起始标志,而非电平持续。PCM总线支持TDM(时分复用)模式,可以在一条数据线上传输多达16个通道的音频数据,非常适合多麦克风阵列或多通道音频系统。

ALSA中通过SND_SOC_DAIFMT_DSP_A和SND_SOC_DAIFMT_DSP_B两种模式来配置PCM总线,区别在于数据相对于帧同步脉冲的起始位置偏移一个BCLK。

1.3.3 DMIC(数字麦克风)接口

数字麦克风(DMIC)内部集成了MEMS传感器和Σ-Δ调制器,直接输出1位PDM(脉冲密度调制)数据流。DMIC接口只有两条线:

  • CLK:由SoC提供的时钟信号,频率通常为1~4 MHz。
  • DATA:PDM数据输出,在CLK的上升沿或下降沿更新。

SoC端需要内置PDM抽取滤波器(Decimation Filter),将1位PDM流转换为标准的16/24位PCM数据。在ALSA驱动中,DMIC通常被抽象为一个独立的Codec组件,或者通过I2S控制器的PDM模式接入。

常见陷阱: 初学者容易混淆I2S和PCM总线的帧同步方式。I2S的LRCLK是电平指示(高=左,低=右),而PCM的SYNC是脉冲指示(一个BCLK宽度的脉冲表示帧起始)。在配置ALSA的dai_fmt时,务必确认Codec数据手册中要求的格式,否则会导致左右声道反相或数据错位。

1.4 本章小结

嵌入式音频系统的硬件链路可以概括为:模拟信号 ↔ Codec(ADC/DAC) ↔ 数字总线(I2S/PCM) ↔ SoC(I2S控制器+DMA)。Codec芯片承担了模拟与数字域之间的桥梁作用,而数字音频总线则决定了音频数据的传输格式与时序。理解这三者的关系,是后续学习ALSA驱动框架的基础。在下一章中,我们将深入ALSA的软件架构,了解用户空间、内核空间与硬件之间的数据流。