1. Codec 基础概念

各位好,我是老周。做音频硬件调试这些年,我经手过不下几十种 Codec 芯片。每次带新人,第一个问题总是:「Codec 到底是什么?」

其实答案很简单。Codec 是 Coder 和 Decoder 的合成词。说白了,它就是个「翻译官」——把麦克风采集的模拟声音转成数字信号给处理器,再把处理器要播放的数字信号转回模拟电压驱动喇叭。

你想想看,没有 Codec,你的手机怎么录音?怎么放歌?它就是个音频世界的桥梁。

1.1 Codec 在音频链路中的位置

音频链路看起来复杂,拆开看就几个环节。我习惯把它画成一条流水线:

核心链路: 模拟输入 → Codec ADC → 数字总线(I2S) → SoC/CPU → 数字总线(I2S) → Codec DAC → 模拟输出

下面这张图是我自己整理的,你一看就明白:

音频链路中 Codec 的位置 麦克风 模拟输入 Codec ADC 转换 模拟→数字 I2S 数字总线 SoC / CPU 音频处理 数字域 Codec DAC 转换 数字→模拟 喇叭 模拟输出 Codec 位于模拟与数字的交界处,是音频链路中唯一同时处理两种信号的器件

看到没?Codec 卡在中间。一边是模拟世界(麦克风、喇叭、耳机),一边是数字世界(I2S 总线、SoC)。

我记得有一次调试一个对讲机项目,声音断断续续。我查了半天,最后发现是 I2S 总线的位时钟歪了。Codec 本身没问题,但数字链路没对齐,声音就全乱了。

小提示: 排查杂音时,先确认杂音来自模拟端还是数字端。我的做法是:把 Codec 配置成回环模式(ADC 直通 DAC),如果杂音还在,问题大概率在模拟前端;如果杂音消失,那数字链路或 SoC 配置有问题。

1.2 常见 Codec 芯片介绍

市面上 Codec 芯片很多,但常用的就那么几款。我按使用场景分了三类,列个表给你看:

芯片型号 厂商 典型应用 接口 我踩过的坑
WM8960 Wolfson (Cirrus) 便携音箱、智能语音设备 I2S + I2C D类功放输出容易引入开关噪声
ES8316 Everest Semi 低功耗耳机、TWS 充电盒 I2S + I2C PLL 配置不对时会有明显底噪
ALC5640 Realtek 笔记本、平板电脑 I2S + I2C/SPI 多路混音时 EQ 参数容易冲突
NAU88C22 Nuvoton 录音笔、安防监控 I2S + I2C AGC 增益跳变导致「噗噗」声
TLV320AIC31 TI 车载、工业音频 I2S + I2C/SPI 电源纹波抑制比偏低,需额外 LDO

1.3 深入聊聊 WM8960

WM8960 是我用得最多的芯片,没有之一。它内置了 D 类功放,可以直接驱动 8Ω 喇叭,省掉外部功放 IC。但——凡事都有个「但」——它的 D 类功放开关频率在 1.2MHz 左右,如果 PCB 布局不好,这个频率会耦合到模拟输入端,产生「嘶嘶」声。

我曾经帮一个客户改板,他们做的智能音箱底噪特别大。我一看原理图,WM8960 的 D 类输出走线绕了半块板子,刚好贴着麦克风输入。我建议他们把 D 类输出走线改到板子另一侧,中间加一层 GND 隔离。改完后底噪降了 12dB。

注意: WM8960 的寄存器配置顺序有讲究。我建议先配电源管理寄存器(Reg 0x2F),再配时钟,最后配音频路径。顺序反了,芯片可能不工作,或者输出异常杂音。

1.4 ES8316 的低功耗特性

ES8316 是低功耗场景的明星。它的待机电流只有几个微安,非常适合电池供电的设备。但它的 PLL 配置比较敏感。

我记得有个 TWS 充电盒项目,播放提示音时总有「滋滋」声。查了半天,发现是 ES8316 的 PLL 分频比设错了,导致 MCLK 频率不在芯片的锁定范围内。改了一个寄存器值,问题解决。

ES8316 的典型配置代码大概是这样:

// ES8316 初始化序列(I2C 写入)
// 1. 复位芯片
i2c_write(0x00, 0x3F);  // 软件复位
mdelay(10);

// 2. 配置电源管理
i2c_write(0x01, 0x50);  // 开启 DAC 和 ADC 电源

// 3. 配置时钟
// 假设 MCLK = 12.288MHz, 采样率 = 48kHz
i2c_write(0x0C, 0x02);  // 时钟分频设置
i2c_write(0x0D, 0x00);  // PLL 配置高位
i2c_write(0x0E, 0x40);  // PLL 配置低位

// 4. 配置音频接口
i2c_write(0x08, 0x02);  // I2S, 16bit, 主模式

// 5. 设置音量
i2c_write(0x02, 0x30);  // DAC 音量 - 约 -10dB
i2c_write(0x03, 0x30);  // ADC 增益 - 约 0dB

经验之谈: 调试 ES8316 时,我习惯先读回寄存器 0x00 的值。如果读回来是 0x3F,说明 I2C 通信正常。如果读回来是 0xFF 或 0x00,先查 I2C 地址和上拉电阻。

1.5 Realtek ALC 系列

ALC 系列在 PC 领域是绝对的霸主。从 ALC888 到 ALC1220,再到现在的 ALC4080,几乎每台电脑的主板上都有它。

ALC 系列的特点是集成度高——它把耳机放大器、麦克风偏置、多路混音器全塞进一颗芯片里。但集成度高也意味着排查复杂。我遇到过一个问题:笔记本播放音乐时,左声道正常,右声道有「咔咔」声。最后发现是 ALC 芯片的某个混音器通道没 mute,串入了数字噪声。

ALC 系列的调试要点:

  • 电源去耦: ALC 对 AVDD 和 DVDD 的纹波很敏感。我建议在电源引脚附近放 10μF + 0.1μF 电容,且尽量靠近引脚。
  • I2C 时序: ALC 的 I2C 从机地址通常是 0x1A(7bit),但有些变体用 0x1C。先确认 datasheet。
  • EQ 和滤波器: ALC 内部有可编程 EQ,但寄存器是分段映射的。写错一个字节,声音可能完全变味。

一句话总结: 选 Codec 芯片,先看你的应用场景。便携音箱用 WM8960,低功耗用 ES8316,PC 音频用 ALC。没有最好的芯片,只有最合适的。

1.6 本章小结

这一章我们聊了 Codec 是什么、它在音频链路中的位置,以及三款主流芯片的特点。你记住一个核心就行:Codec 是模拟和数字的桥梁,杂音排查的起点就是分清杂音来自桥的哪一边。