1. Codec 基础概念
各位好,我是老周。做音频硬件调试这些年,我经手过不下几十种 Codec 芯片。每次带新人,第一个问题总是:「Codec 到底是什么?」
其实答案很简单。Codec 是 Coder 和 Decoder 的合成词。说白了,它就是个「翻译官」——把麦克风采集的模拟声音转成数字信号给处理器,再把处理器要播放的数字信号转回模拟电压驱动喇叭。
你想想看,没有 Codec,你的手机怎么录音?怎么放歌?它就是个音频世界的桥梁。
1.1 Codec 在音频链路中的位置
音频链路看起来复杂,拆开看就几个环节。我习惯把它画成一条流水线:
核心链路: 模拟输入 → Codec ADC → 数字总线(I2S) → SoC/CPU → 数字总线(I2S) → Codec DAC → 模拟输出
下面这张图是我自己整理的,你一看就明白:
看到没?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 是模拟和数字的桥梁,杂音排查的起点就是分清杂音来自桥的哪一边。