1. 课程导学与硬件准备:STM32与WM8960硬件连接、I2S协议基础、开发板选型建议

各位同学好,我是你们的嵌入式音频讲师。做嵌入式音频开发这些年,从最早的8位单片机裸奔播放蜂鸣器,到后来用STM32做MP3解码,再到如今用WM8960做高保真录音采集,这条路我走了不少弯路。今天这第一节课,咱们先把地基打牢——搞清楚STM32和WM8960怎么连、I2S总线到底在传什么、以及开发板该怎么选。

本章核心目标: 学完这节课,你能自己画出STM32与WM8960的硬件连接图,理解I2S的帧结构,并且能根据项目需求选对开发板。

1.1 为什么是WM8960?

WM8960这颗Codec芯片,在嵌入式音频圈子里口碑不错。它集成了立体声ADC和DAC,信噪比能做到98dB以上。我最早接触它是在一个智能语音助手项目里,当时需要同时采集双麦克风信号并播放提示音,WM8960的2路差分输入和内置扬声器驱动刚好满足需求。

说白了,选它有三个理由:

  • 集成度高:单芯片搞定录音+播放,省掉外围运放和功放
  • 接口标准:I2S数字音频接口,和STM32的SAI或SPI外设无缝对接
  • 功耗低:录音模式下典型功耗不到10mW,适合电池供电设备

1.2 STM32与WM8960硬件连接

先看一张我手绘的硬件连接框图,这是整个课程的基础。

STM32 + WM8960 硬件连接框架 STM32F4/F7/H7 I2S 外设 (SPI/SAI) I2C 控制接口 DMA 数据传输 中断/NVIC WM8960 Codec ADC (录音) DAC (播放) 麦克风输入 扬声器输出 I2S (数据/时钟) I2C (配置寄存器) DMA 请求 麦克风 (MIC) 差分/单端输入 扬声器 (SPK) 8Ω / 1W 输出 ⚠ 注意:I2S 时钟线 MCLK 必须由 STM32 提供,WM8960 不产生时钟

这张图里,我特意把I2S和I2C两条总线分开画了。很多新手容易搞混——I2C是用来配置WM8960内部寄存器的,I2S才是真正传音频数据的。我在项目里见过有人把I2S的SCK和I2C的SCL接到一起,结果两个外设都罢工了。

关键引脚对照表

STM32 引脚 WM8960 引脚 功能说明 注意事项
PA5 (SPI1_SCK) BCLK I2S 位时钟 频率 = 采样率 × 位宽 × 通道数
PA7 (SPI1_MOSI) DIN I2S 数据输入 (播放) STM32 发送,WM8960 接收
PA6 (SPI1_MISO) DOUT I2S 数据输出 (录音) WM8960 发送,STM32 接收
PB10 (I2C2_SCL) SCLK I2C 时钟 通常 100kHz 或 400kHz
PB11 (I2C2_SDA) SDIN I2C 数据 需要上拉电阻 4.7kΩ
PC6 (TIM3_CH1) MCLK 主时钟 (12.288MHz) 必须精确,否则音频变调

我的经验: MCLK 这个引脚最容易出问题。WM8960 内部 PLL 虽然可以倍频,但最好直接用 STM32 的定时器输出精确的 12.288MHz。我试过用内部 RC 振荡器,结果录音回放时声音像开了慢速播放——嗯,那感觉挺崩溃的。

1.3 I2S协议基础——你只需要记住这三件事

I2S(Inter-IC Sound)是飞利浦在80年代制定的音频总线标准。说实话,协议本身不复杂,但初学者容易被各种模式搞晕。我把它拆成三个核心点:

  1. 数据线只有一根:半双工,要么发要么收。所以WM8960用了DIN和DOUT两根线来实现全双工。
  2. 帧同步信号WS:左右声道切换。WS=0时传左声道,WS=1时传右声道。频率等于采样率。
  3. 位时钟BCLK:每个数据位一个脉冲。比如48kHz采样率、16位数据、双声道,BCLK = 48k × 16 × 2 = 1.536MHz。

你想想看,如果BCLK算错了会怎样?我遇到过一位同事,他把BCLK设成了采样率的整数倍,但忘了乘以声道数,结果右声道的数据全被当成左声道处理了——录音里人声变成了左右飘忽的鬼畜效果。

I2S标准时序(飞利浦模式)

BCLK:  ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
WS:    ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
       ← 左声道 (16位) → ← 右声道 (16位) →
SD:    MSB ... LSB        MSB ... LSB

注意WS在数据发送前一个BCLK周期就切换了,这是飞利浦模式的特点。STM32的I2S外设默认支持这种模式,所以咱们直接用HAL库配置就行。

⚠ 避坑指南: 我曾经在STM32F103上用过软件模拟I2S,结果采样率一高就丢数据。后来换成硬件I2S外设+DMA,问题才解决。所以——录音项目务必用硬件I2S,别自己折腾GPIO模拟。

1.4 开发板选型建议

选开发板这件事,我踩过不少坑。直接说结论:

需求场景 推荐型号 理由 预算
入门学习、低采样率录音 STM32F407VGT6 I2S外设完善,HAL库支持好 ¥80-120
高保真录音 (96kHz/24bit) STM32H743 SAI接口支持TDM,DMA带宽大 ¥200-350
多通道音频处理 STM32F746 内置DSP指令,FFT加速 ¥150-250
低功耗便携设备 STM32L4R5 LPUART+低功耗I2S ¥100-180

我个人习惯用STM32F407做原型验证。为什么?因为它的I2S外设和DMA配合得很成熟,网上资料也多。如果你手头已经有F4系列,完全够用。H7系列虽然性能强,但SAI接口的配置比I2S复杂不少,新手容易在时钟树上卡住。

我的建议: 别一上来就追求顶级芯片。先用F4把I2S和WM8960调通,理解了音频数据流之后,再移植到H7上做性能优化。这样遇到问题你知道是硬件瓶颈还是代码问题。

1.5 本章小结

这节课我们做了三件事:

  • 理清了STM32和WM8960的硬件连接——I2C配寄存器,I2S传数据,MCLK给时钟
  • 搞懂了I2S协议的核心——BCLK、WS、SD三根线,以及它们怎么配合
  • 给出了开发板选型建议——F4入门,H7进阶,L4低功耗