1. 课程导学与硬件准备
各位同学好,欢迎来到这门实战课。我是你们的讲师,一个在嵌入式音频领域摸爬滚打了十几年的老工程师。
这门课我们要做什么?说白了,就是让 STM32 和 WM8960 这颗音频芯片配合起来,实现语音的采集和实时播放。听起来挺专业,其实拆开来看,核心就两件事:一是把麦克风的声音变成数字信号存下来,二是把数字信号还原成声音从喇叭放出去。嗯,中间再加点实时处理的玩法。
我个人习惯,开篇先不急着写代码。咱们先把硬件底子打扎实。你想想看,硬件连接错了,后面软件调得再好也是白搭。所以这一章,我们先认识 WM8960,搞清楚它和 STM32 怎么连,再把开发板和调试器准备好。
本章核心目标: 搞懂 WM8960 是什么、能干什么,以及它和 STM32 之间的物理连接关系。这是后续所有实验的基础。
1.1 WM8960 芯片简介
WM8960 是 Wolfson(现在叫 Cirrus Logic)推出的一颗低功耗立体声音频编解码器。我在项目中用过不少音频芯片,WM8960 是我个人比较偏爱的一颗。为什么?因为它集成度高,外围电路简单,而且性能足够应付大多数消费级音频产品。
咱们来看看它的关键特性:
| 特性 | 参数 | 说明 |
|---|---|---|
| 音频分辨率 | 16/20/24/32 bit | 支持主流音频位深 |
| 采样率 | 8 kHz ~ 96 kHz | 语音用 8/16 kHz,音乐用 44.1/48 kHz |
| ADC/DAC SNR | 97 dB / 98 dB | 信噪比不错,底噪控制得好 |
| 音频接口 | I2S / PCM | 与 MCU 传输数字音频 |
| 控制接口 | I2C / SPI | 配置寄存器用 |
| 内置功能 | MIC偏置、耳机驱动、D类功放 | 外围器件少,省成本 |
这颗芯片内部集成了两路 ADC 和两路 DAC,支持立体声。但咱们这门课主要做单声道语音采集和播放,所以只用其中一路就够了。
我记得有一次做对讲机项目,选型时对比了好几颗芯片。WM8960 的功耗表现让我印象很深——在 1.8V 核心电压下,工作电流才几个毫安。对于电池供电的设备来说,这个优势很明显。
小提示: WM8960 的数据手册有 100 多页,别被吓到。咱们课程里只会用到其中 20% 的寄存器。我会在后续章节中带着大家逐个配置,不用提前啃手册。
1.2 STM32 与 WM8960 硬件连接
WM8960 和 STM32 之间需要两条通信链路:
- I2S 总线: 传输音频数据(PCM 码流)
- I2C 总线: 配置 WM8960 的内部寄存器
你想想看,这两条总线分工很明确。I2S 负责搬砖(传数据),I2C 负责指挥(写配置)。缺一不可。
I2S 连接
I2S 是数字音频的标配接口。STM32 的 I2S 外设可以直接挂在 WM8960 的对应引脚上。标准 I2S 需要 3 根信号线:
- BCLK(位时钟): 每个 bit 一个脉冲,频率 = 采样率 × 位深 × 通道数
- LRCK(帧时钟/左右声道选择): 频率等于采样率,高电平左声道,低电平右声道
- SD(串行数据): 音频数据线,分 SDI(输入)和 SDO(输出)
WM8960 还额外引出了 MCLK(主时钟),这是芯片内部 Σ-Δ 调制器需要的时钟。通常由 STM32 的 MCO 引脚输出,或者用外部晶振提供。
我在项目中遇到过一个问题:MCLK 频率不对,导致 WM8960 不出声。后来查手册才发现,MCLK 必须是采样率的整数倍(通常是 256 倍或 384 倍)。比如采样率 48 kHz,MCLK 就用 12.288 MHz。这个坑大家要注意。
I2C 连接
WM8960 的 I2C 地址是 0x1A(7 位地址)。STM32 作为主机,通过 I2C 总线向 WM8960 写入寄存器值。只需要两根线:
- SCL: 时钟线
- SDA: 数据线
上拉电阻别忘了加。我习惯用 4.7 kΩ,如果总线长度短,10 kΩ 也行。
典型连接图
下面这张图展示了 STM32 和 WM8960 之间的核心信号连接关系:
注意: 上图中的 MCLK 连接线我用虚线表示,是因为有些开发板会单独用一颗晶振给 WM8960 提供 MCLK,而不是从 STM32 引出。两种方式都可以,但要注意时钟频率必须匹配。
1.3 开发板选型与调试器准备
选开发板这件事,我建议你遵循一个原则:I2S 外设必须支持主模式。STM32 的 I2S 外设不是所有系列都有,也不是所有封装都引出了 I2S 引脚。
推荐开发板
| 型号 | I2S 支持 | 主频 | 适合场景 |
|---|---|---|---|
| STM32F407VGT6 | 2 路 I2S | 168 MHz | 入门首选,资料多 |
| STM32F746NGH6 | 2 路 I2S + SAI | 216 MHz | 需要更多处理能力时 |
| STM32H743ZIT6 | 3 路 I2S + SAI | 480 MHz | 高性能音频处理 |
我个人建议,如果你刚接触音频开发,先用 STM32F407 系列。为什么?因为它的 I2S 外设比较经典,网上能找到大量参考代码。我当年就是从 F407 入的门,踩过的坑都有现成的解决方案。
调试器选择
调试器这块,我推荐用 J-Link 或者 ST-Link/V2。ST-Link 是 ST 官方的,兼容性好,价格也便宜。J-Link 功能更强,调试速度更快,但价格贵一些。
有一点要提醒你:调试音频程序时,不要用低速调试器。我曾经用某款山寨调试器调试 I2S 中断,结果单步执行时音频数据流断了,芯片直接不出声。后来换成 J-Link,问题就解决了。调试器速度跟不上,会影响实时性判断。
经验之谈: 如果你用的是 STM32F4 系列,建议把调试器 SWD 时钟频率设为 4 MHz 以上。太低的话,下载程序慢,调试时也容易超时。
1.4 硬件连接检查清单
在动手焊接或接线之前,我建议你对照这个清单检查一遍:
- 电源: WM8960 需要 3.3V 模拟电源和 1.8V 数字核心电源。确认你的开发板能提供这两个电压。
- I2S 引脚: 确认 STM32 的 I2S 引脚与 WM8960 的对应引脚一一连接,没有交叉错位。
- I2C 上拉: SCL 和 SDA 线上必须有上拉电阻,否则通信不稳定。
- MCLK 频率: 用示波器或者逻辑分析仪确认 MCLK 波形正常,频率正确。
- 地线: 模拟地和数字地要共地,但布局上尽量分开,避免数字噪声串入音频信号。