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硬件连接
先看一张我手绘的硬件连接框图,这是整个课程的基础。
这张图里,我特意把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年代制定的音频总线标准。说实话,协议本身不复杂,但初学者容易被各种模式搞晕。我把它拆成三个核心点:
- 数据线只有一根:半双工,要么发要么收。所以WM8960用了DIN和DOUT两根线来实现全双工。
- 帧同步信号WS:左右声道切换。WS=0时传左声道,WS=1时传右声道。频率等于采样率。
- 位时钟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低功耗