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需要两个时钟:

  1. MCLK:主时钟,通常由主控提供。频率一般是采样率的256倍或512倍。
  2. 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协议、时钟配置,这三块是音频系统的基石。下一章我们聊聊麦克风阵列的布局和波束成形,那才是真正考验硬件功底的地方。