4. 音频编解码器:Codec芯片选型与接口协议
好,咱们进入第四章。这一章聊的是音频系统的核心——Codec芯片。说白了,它就是负责把模拟声音信号转成数字信号,再把数字信号转回模拟声音的那个家伙。你想想看,麦克风采集到的微弱电压,必须经过它才能变成CPU能处理的0和1;反过来,CPU算好的音频数据,也得靠它才能驱动耳机发声。
我个人习惯把Codec比作「翻译官」。它一边跟模拟世界打交道,一边跟数字世界打交道。选对了,整个系统就稳了;选错了,后面调试能让你怀疑人生。
4.1 主流Codec芯片选型
市面上Codec芯片很多,但做穿戴设备,我重点关注两款:WM8960和TLV320AIC系列。为什么?因为功耗低、封装小、文档全。
4.1.1 WM8960
WM8960是Wolfson(现在叫Cirrus Logic)的产品。这颗芯片我用了好几年,印象最深的是它的集成度。它内置了双声道DAC和ADC,还带了耳机放大器。你想想看,一颗芯片就把Codec和功放都搞定了,省了不少PCB面积。
它的关键参数:
- 信噪比(SNR):DAC 98dB,ADC 94dB。这个指标在穿戴设备里算很好了。
- 采样率:支持8kHz到96kHz。做语音采集,8kHz或16kHz就够了;做音乐播放,可以上48kHz。
- 功耗:典型工作电流约7mA,待机模式更低。
我个人的选型建议:如果你的产品需要同时做语音采集和音乐播放,WM8960是个稳妥的选择。我在一个智能眼镜项目里用过它,麦克风采集和耳机播放同时跑,底噪控制得不错。
4.1.2 TLV320AIC系列
TI的TLV320AIC系列,比如AIC3100、AIC3204,也是穿戴设备的常客。它们的特点是灵活性高。你可以通过I2C配置很多内部参数,比如增益、滤波器、采样率。
我记得有一次做助听器原型,选的就是AIC3204。它的功耗可以低到2.5mW左右,而且支持差分输入,抗干扰能力很强。
| 参数 | WM8960 | TLV320AIC3204 |
|---|---|---|
| DAC SNR | 98dB | 95dB |
| ADC SNR | 94dB | 92dB |
| 功耗(典型) | 7mA | 2.5mW |
| 封装 | QFN-32 | BGA-49 |
| 接口 | I2S + I2C | I2S + I2C |
避坑指南:我曾经在一个项目里选了TLV320AIC,结果发现它的BGA封装手工焊接难度大。如果你是小批量生产,建议优先选QFN封装的WM8960。
4.2 I2S/PCM接口协议
Codec和主控芯片之间怎么传数据?靠I2S或PCM接口。这两个协议本质上是串行总线,专门用来传音频数据。
4.2.1 I2S协议
I2S(Inter-IC Sound)是飞利浦定义的。它有三条线:
- BCLK:位时钟,每个脉冲传一个bit。
- LRCK:左右声道选择,高电平左声道,低电平右声道。
- DIN/DOUT:数据线,分别用于输入和输出。
举个例子,采样率48kHz、16bit、双声道。BCLK的频率怎么算?
BCLK = 采样率 × 位深 × 声道数
= 48000 × 16 × 2
= 1.536 MHz
嗯,这里要注意:有些Codec支持不同的数据格式,比如左对齐、右对齐。我建议你默认用I2S标准格式,兼容性最好。
4.2.2 PCM协议
PCM(Pulse Code Modulation)接口跟I2S很像,但它通常用于单声道或时分复用。比如做语音采集,只用一条数据线就够了。
我在一个蓝牙耳机项目里用过PCM接口。主控和Codec之间只用了一条数据线,BCLK和LRCK共用。这样省了一根线,但时序要求更严格。
注意:I2S和PCM的电气电平要匹配。主控是3.3V,Codec是1.8V,中间必须加电平转换。我曾经因为没加转换,烧了一颗Codec,教训深刻。
4.3 采样率与时钟配置
采样率决定了音频的质量。穿戴设备里,常见的采样率有:
- 8kHz:电话语音质量,够用但有点糊。
- 16kHz:宽带语音,清晰度好很多。我一般推荐这个。
- 44.1kHz/48kHz:音乐级,适合播放。
时钟配置是容易出问题的地方。Codec需要两个时钟:
- MCLK:主时钟,通常由主控提供。频率一般是采样率的256倍或512倍。
- BCLK:位时钟,前面算过了。
举个例子,采样率16kHz,MCLK用256倍:
MCLK = 16000 × 256 = 4.096 MHz
这个频率,主控的PLL要能生成。我遇到过一个问题:主控的PLL分频精度不够,导致MCLK偏差超过1%,Codec直接不工作。后来换了晶振才解决。
我的经验:时钟配置时,先看Codec的数据手册,找到它支持的MCLK频率范围。然后根据采样率,算出BCLK和LRCK。最后用示波器量一下波形,确认时序没问题。
4.4 实际配置示例
以WM8960为例,配置一个16kHz语音采集系统:
// I2C配置WM8960
// 设置采样率16kHz,MCLK=4.096MHz
// 寄存器地址 0x00: 复位
i2c_write(0x1A, 0x00, 0x00);
// 寄存器 0x04: 时钟配置
// 设置MCLK分频,使ADC采样率为16kHz
i2c_write(0x1A, 0x04, 0x03);
// 寄存器 0x05: 采样率控制
i2c_write(0x1A, 0x05, 0x00);
// 寄存器 0x19: ADC增益
i2c_write(0x1A, 0x19, 0x1F);
这段代码只是示意。实际项目中,你需要根据WM8960的数据手册,仔细配置每个寄存器。我建议你先把Codec的初始化流程画成流程图,再写代码,这样不容易漏。
小技巧:调试时,先让Codec输出一个1kHz的正弦波。用示波器看波形,如果频率不对,就是时钟配置错了。如果波形失真,可能是增益或电源问题。
好了,这一章就到这里。Codec选型、I2S协议、时钟配置,这三块是音频系统的基石。下一章我们聊聊麦克风阵列的布局和波束成形,那才是真正考验硬件功底的地方。