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在嵌入式系统里到底扮演什么角色?我总结了三句话:
- 信号转换:把CPU的数字音频变成人能听到的声音,或者把麦克风的模拟信号变成CPU能处理的数字信号
- 信号调理:增益控制、滤波、混音、音量调节
- 系统隔离:数字地和模拟地通过Codec隔离,减少噪声耦合
你想想看,如果没有Codec,CPU直接驱动喇叭?那声音比蚊子还小。直接采集麦克风?ADC精度不够,噪声大得没法听。Codec就是那个专业干这活的。
实际案例:我之前做一款智能门锁,用了ESP32+WM8960。ESP32的I2S接口直接连Codec,Codec输出接喇叭和麦克风。整个音频链路:麦克风→Codec ADC→I2S→ESP32→云端语音识别→I2S→Codec DAC→喇叭。Codec在这里就是音频的咽喉要道。
下面这张图,是我画的嵌入式音频系统典型架构,你看一眼就明白了:
从这张图你能看到,Codec处于数字域和模拟域的交界处。左边是CPU的数字世界,右边是人的模拟世界。Codec的好坏,直接决定了整个系统的音质。