1. WM8960芯片概述:特性、内部框图与典型应用

各位同学,咱们这门课要做的,就是把WM8960这颗音频编解码芯片,跟STM32搭在一起,实现耳机输出和麦克风输入。第一节课,我先带大家认识一下这颗芯片。

WM8960是Cirrus Logic(现在叫Cirrus Logic了)推出的一款低功耗立体声编解码器。我最早接触它是在一个便携式录音笔项目里,当时选型选了一圈,最后发现这颗芯片在功耗、音质和外围电路复杂度上平衡得最好。嗯,从那以后,它就成了我音频项目里的常客。

1.1 芯片核心特性

先列一下它的关键参数,大家有个整体印象:

特性类别 具体参数 我的备注
电源电压 模拟:2.7V ~ 3.6V
数字:1.71V ~ 3.6V
可以用单电源3.3V搞定,省事
信噪比(SNR) DAC:98dB
ADC:94dB
对于消费级产品,这个指标够用了
输出功率 耳机输出:每通道40mW @ 16Ω 推普通耳机绰绰有余
采样率 8kHz ~ 48kHz 覆盖语音和音乐场景
接口 I²S(音频数据)+ I²C(控制) STM32标配外设,直接对接
封装 QFN-32(5mm × 5mm) 手工焊接有点考验手艺

我个人最看重的三个特性:

  • 低功耗:工作模式下典型功耗仅14mW,省电模式下更低。做电池供电产品时,这个优势很明显。
  • 内置D类耳机驱动器:不需要额外功放芯片,直接驱动耳机,省成本省面积。
  • 灵活的音频路由:内部混音器可以任意组合输入输出路径,调试起来非常灵活。

1.2 内部框图解析

下面这张图是我根据官方数据手册重新绘制的内部结构框图。大家先看个全貌,我再拆开讲。

WM8960 内部结构框图 模拟输入 LINE_IN_L LINE_IN_R MIC_L / MIC_R (内置MIC偏置) 输入混音器 Input Mixer ADC 24位 Σ-Δ 数字接口 I²S 音频数据 I²C 控制寄存器 (支持多种格式) DAC 24位 Σ-Δ 输出混音器 Output Mixer 模拟输出 HP_OUT_L HP_OUT_R (D类耳机驱动) OUT3 / OUT4 模拟旁路路径 关键路径说明: 1. 录音路径:MIC → 输入混音器 → ADC → I²S → STM32 2. 播放路径:STM32 → I²S → DAC → 输出混音器 → 耳机 3. 旁路路径:LINE_IN → 输入混音器 → 输出混音器 → 耳机 控制接口: I²C 地址:0x1A (7位) / 0x34 (8位) | 寄存器数量:56个

这张图里,我标出了三条关键信号路径。大家注意看:

  • 录音路径:麦克风信号进入输入混音器,经过ADC转换成数字信号,通过I²S总线送到STM32。我在项目里调试这条路径时,踩过一个坑——麦克风偏置电压没配置对,导致录音声音特别小。后来查手册才发现,WM8960的MIC偏置需要单独使能。
  • 播放路径:STM32通过I²S发送数字音频,DAC转换成模拟信号,经过输出混音器,最后由耳机驱动器放大输出。这里有个小技巧:输出混音器可以叠加多个音源,比如同时播放音乐和提示音。
  • 模拟旁路路径:这是WM8960的一个特色功能。输入信号可以不经过ADC/DAC,直接在模拟域混音后输出。延迟极低,适合对实时性要求高的场景。我曾经用它做过一个对讲机功能,效果很不错。

1.3 典型应用场景

根据我这几年的项目经验,WM8960最常见的应用场景有这么几类:

应用场景 核心需求 WM8960的优势
便携式音频播放器 低功耗、高音质、小体积 14mW功耗 + 98dB SNR + QFN小封装
智能语音助手 麦克风阵列、语音唤醒、回声消除 双通道ADC + 灵活的混音器
对讲机/双向无线电 半双工通信、低延迟、抗干扰 模拟旁路路径 + 快速启动
IoT语音终端 网络音频流、低码率、稳定可靠 支持8kHz采样 + 稳定的I²S接口

我的选型建议:

如果你做的产品需要同时处理耳机输出和麦克风输入,而且对功耗和成本有要求,WM8960是个很稳妥的选择。它不像一些高端编解码器那样功能复杂到用不完,也不像低端芯片那样音质堪忧。说白了,它就是那种「刚刚好」的芯片。

1.4 为什么选它搭配STM32?

你可能会问:市面上音频编解码器那么多,为什么偏偏选WM8960跟STM32搭?

原因有三:

  1. 接口匹配:STM32的I²S和I²C外设可以直接对接WM8960,不需要额外的电平转换或协议适配。硬件连线就几根线,软件驱动也不复杂。
  2. 生态成熟:这颗芯片出来很多年了,网上能找到大量参考设计和代码。我当年做第一个项目时,就是靠着一块淘宝买的开发板和几篇博客文章入的门。
  3. 性价比高:在同等性能的芯片里,WM8960的价格算是比较亲民的。批量采购的话,一颗不到10块钱。对于成本敏感的产品来说,这个优势很明显。

注意:WM8960的I²C地址是7位0x1A(8位0x34)。STM32的HAL库默认使用7位地址,所以初始化时要填0x1A。我见过有同事填成0x34,结果I²C通信一直失败,查了半天才发现是地址搞错了。