1. Codec音频接口概述

各位好,我是老周。做音频硬件这行十几年了,今天咱们聊聊Codec音频接口那些事儿。说实话,很多刚入行的工程师一听到I2S、PCM、TDM这些缩写就头大,其实没那么玄乎。

音频Codec,说白了就是一颗能把数字音频信号转成模拟信号(DAC),或者把模拟信号转成数字信号(ADC)的芯片。嗯,这里要注意,它跟视频Codec不是一回事,别搞混了。

核心理解:Codec = Coder + Decoder。在音频领域,它负责数字域和模拟域之间的桥梁工作。我见过不少项目,CPU选得挺好,结果Codec没选对,整个音频链路就废了。

1.1 音频Codec的基本概念

Codec芯片内部通常包含这些模块:ADC、DAC、混音器、增益控制、滤波器,有的还带DSP。我个人习惯把Codec分成三类:

  • 纯音频Codec:只做AD/DA转换,比如WM8960、TLV320AIC系列
  • 带DSP的Codec:内部有可编程数字信号处理器,可以做EQ、降噪,比如ADAU系列
  • 智能Codec:集成了语音唤醒、关键词检测,常用于智能音箱

我在项目中遇到过最坑的一次,就是选了一颗带DSP的Codec,结果DSP固件死活调不通。后来才发现,厂商的参考驱动有bug。所以啊,选Codec不光看datasheet,还得看社区活跃度和厂商支持力度。

1.2 常见音频接口标准

数字音频接口,说白了就是Codec跟主控(CPU/MCU/FPGA)之间怎么传数据。目前主流的有四种:I2S、PCM、TDM、PDM。咱们一个一个说。

1.2.1 I2S(Inter-IC Sound)

I2S是飞利浦在80年代搞出来的标准,现在几乎成了音频接口的默认选项。它用三根线:

  • BCLK(位时钟):每个bit一个脉冲
  • LRCK(左右声道时钟):高电平左声道,低电平右声道
  • SDATA(数据线):串行传输音频数据

你想想看,I2S为什么能活这么久?因为它简单。三根线就能传双声道音频,而且时序非常清晰。我刚开始做音频驱动时,最喜欢用逻辑分析仪抓I2S波形,一眼就能看出问题。

避坑指南:我曾经被I2S的相位问题坑过。有些Codec要求数据在BCLK上升沿采样,有些要求下降沿。如果主从模式没配好,出来的声音全是噪声。记住:主设备提供BCLK和LRCK,从设备只发数据。

1.2.2 PCM(Pulse Code Modulation)

PCM接口跟I2S很像,但有个关键区别:PCM用帧同步信号(FSYNC)代替了LRCK。而且PCM可以支持单声道、双声道,甚至多声道。

说白了,I2S是PCM的一种特殊形式。I2S的LRCK在数据之前变化,而PCM的FSYNC通常和数据对齐。这个细节在调试时特别重要。

特性 I2S PCM
声道指示 LRCK电平 FSYNC脉冲
声道数 固定2声道 可配置1~N声道
数据对齐 左对齐/右对齐 通常左对齐
典型应用 消费音频 通信、专业音频

1.2.3 TDM(Time Division Multiplexing)

TDM,时分复用。你可以把它理解成I2S的升级版。一根数据线上,通过时分的方式传输多个声道。比如8声道TDM,一个帧周期内传8个声道的采样数据。

为什么会需要TDM?你想想看,如果做一套多声道音响系统,每个Codec都用独立的I2S,那主控得有多少引脚?TDM一根数据线搞定所有声道,省引脚、省走线。

我记得有个项目,客户要求做7.1声道环绕声。如果用I2S,需要4组接口(每组2声道)。换成TDM,一组接口就够了。不过TDM的时序要求更严格,slot对齐必须精确到bit级别。

警告:TDM的slot宽度必须一致。我曾经遇到一个bug,左声道用16bit,右声道用24bit,结果数据全错位了。TDM模式下,所有声道必须用相同的位宽。

1.2.4 PDM(Pulse Density Modulation)

PDM跟上面三种完全不同。它不是传PCM数据,而是传1bit的密度调制信号。常见于MEMS麦克风,比如手机里的硅麦。

PDM只有两根线:

  • CLK:时钟,由主控提供
  • DATA:1bit数据流

PDM的采样率极高,通常是1MHz~4MHz。主控收到PDM数据后,需要经过抽取滤波器(decimation filter)转成PCM数据。这个滤波器如果设计不好,声音会有明显的高频噪声。

我做过一个项目,用PDM麦克风做语音采集。刚开始直接拿原始PDM数据播放,全是嘶嘶声。后来加了CIC滤波器,效果才正常。嗯,这里要注意,PDM对时钟抖动非常敏感,PCB走线要尽量短。

1.3 Codec在嵌入式系统中的作用

Codec在嵌入式系统里到底扮演什么角色?我总结了三句话:

  1. 信号转换:把CPU的数字音频变成人能听到的声音,或者把麦克风的模拟信号变成CPU能处理的数字信号
  2. 信号调理:增益控制、滤波、混音、音量调节
  3. 系统隔离:数字地和模拟地通过Codec隔离,减少噪声耦合

你想想看,如果没有Codec,CPU直接驱动喇叭?那声音比蚊子还小。直接采集麦克风?ADC精度不够,噪声大得没法听。Codec就是那个专业干这活的。

实际案例:我之前做一款智能门锁,用了ESP32+WM8960。ESP32的I2S接口直接连Codec,Codec输出接喇叭和麦克风。整个音频链路:麦克风→Codec ADC→I2S→ESP32→云端语音识别→I2S→Codec DAC→喇叭。Codec在这里就是音频的咽喉要道。

下面这张图,是我画的嵌入式音频系统典型架构,你看一眼就明白了:

嵌入式音频系统典型架构 主控 (CPU/MCU/FPGA) I2S / TDM / PDM 音频 Codec 模拟输出 (喇叭/耳机) 模拟输入 (麦克风/Line In) I²C / SPI 控制总线 说明: 主控通过I2S/TDM/PDM接口与Codec传输数字音频数据,通过I²C/SPI配置Codec寄存器。 Codec完成AD/DA转换后,模拟信号直接驱动喇叭或采集麦克风信号。

从这张图你能看到,Codec处于数字域和模拟域的交界处。左边是CPU的数字世界,右边是人的模拟世界。Codec的好坏,直接决定了整个系统的音质。