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 之间的核心信号连接关系:

STM32 与 WM8960 硬件连接框图 STM32F4/F7/H7 I2S 外设 I2C 外设 MCO 时钟输出 WM8960 音频编解码器 I2S 音频接口 I2C 控制接口 I2S: BCLK, LRCK, SD I2C: SCL, SDA MCLK (12.288 MHz) 主控 MCU 音频编解码器

注意: 上图中的 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 硬件连接检查清单

在动手焊接或接线之前,我建议你对照这个清单检查一遍:

  1. 电源: WM8960 需要 3.3V 模拟电源和 1.8V 数字核心电源。确认你的开发板能提供这两个电压。
  2. I2S 引脚: 确认 STM32 的 I2S 引脚与 WM8960 的对应引脚一一连接,没有交叉错位。
  3. I2C 上拉: SCL 和 SDA 线上必须有上拉电阻,否则通信不稳定。
  4. MCLK 频率: 用示波器或者逻辑分析仪确认 MCLK 波形正常,频率正确。
  5. 地线: 模拟地和数字地要共地,但布局上尽量分开,避免数字噪声串入音频信号。