1. 课程导论与硬件准备:I2S协议简介、WM8960特性、STM32选型建议、开发板与调试器连接
各位同学好,我是你们的嵌入式音频讲师。今天咱们正式开始《STM32 I2S DMA音频播放与WM8960调试实战》的第一章。
做音频播放,说白了就是让单片机把数字音频数据,通过一个专门的接口送给音频解码芯片,然后解码芯片驱动喇叭或者耳机发出声音。这个专门的接口,绝大多数情况下就是 I2S。
我个人习惯,在动手写代码之前,先把整个链条上的关键器件和协议摸清楚。你想想看,如果连I2S的时钟极性都搞反了,或者选了个不支持DMA的STM32型号,后面调试起来得多痛苦。所以这一章,咱们先把地基打牢。
本章核心目标:搞懂I2S是什么、WM8960能干什么、怎么选STM32、怎么把板子连起来。一句话概括:知道信号怎么流,知道线怎么接。
1.1 I2S协议简介——数字音频的“普通话”
I2S(Inter-IC Sound)是飞利浦公司制定的一种串行总线协议,专门用来在数字音频设备之间传输音频数据。它跟I2C名字有点像,但完全是两码事。I2S是点对点的音频数据流协议,没有地址概念。
一个标准的I2S总线有三条核心信号线:
- SCK(位时钟,BCLK):每个脉冲对应一个数据位。频率 = 采样率 × 位宽 × 声道数。比如44.1kHz采样、16位、立体声,BCLK = 44.1k × 16 × 2 = 1.4112MHz。
- WS(字选择,LRCK):用来区分左右声道。WS为低电平时传输左声道数据,高电平时传输右声道数据。频率等于采样率。
- SD(串行数据):音频数据的传输线,一般是二进制补码格式。
我刚开始接触I2S时,最容易搞混的是WS的极性。有些芯片是WS低电平左声道,有些是反的。嗯,这里要注意,WM8960默认是标准I2S格式,WS低电平左声道,数据在SCK的下降沿变化,上升沿采样。
避坑提示:我曾经在一个项目里因为I2S格式配置错误,导致左声道数据跑到了右声道,听起来像“左右互搏”。后来用示波器抓了WS和SD的时序才定位到问题。所以,强烈建议你在调试初期用逻辑分析仪看一眼I2S波形。
除了标准I2S格式,还有左对齐、右对齐、DSP/PCM等格式。咱们这门课主要用标准I2S格式,这也是最通用的。
1.2 WM8960特性——一颗功能强大的音频编解码器
WM8960是Cirrus Logic(原Wolfson)出品的一款低功耗立体声音频编解码器。我选它来做课程芯片,原因很简单:它几乎集成了音频系统需要的所有功能,而且价格适中,资料丰富。
来看看它的关键特性:
| 特性 | 参数/说明 |
|---|---|
| DAC/ADC | 24位立体声DAC和ADC,信噪比(SNR)高达98dB |
| 采样率 | 8kHz ~ 96kHz,覆盖语音到高保真音乐 |
| 输入接口 | 3路立体声输入(LINE IN、MIC、AUX),支持差分/单端 |
| 输出接口 | 立体声耳机输出(32Ω负载下40mW)、立体声喇叭输出(8Ω负载下1W) |
| 数字接口 | I2S、左对齐、右对齐、DSP/PCM格式,支持主/从模式 |
| 控制接口 | I2C(地址0x1A或0x1B),用于配置内部寄存器 |
| 其他功能 | 3D增强、自动电平控制(ALC)、EQ均衡器、去爆音电路 |
WM8960内部结构其实挺清晰的。我画了一张简化的功能框图,帮你理解数据流:
从图上可以看得很清楚:I2S接口负责数字音频数据的输入输出,I2C接口负责控制。这两个通道是独立的。你在调试时,如果声音不对,先确认I2C能不能读写WM8960的寄存器,再查I2S波形。
1.3 STM32选型建议——别选错了,否则DMA都救不了你
STM32家族庞大,但不是所有型号都适合做I2S音频。我根据实际项目经验,给你一些选型建议。
首先,必须确认芯片有I2S外设。STM32的I2S通常是跟SPI复用引脚的。比如STM32F4系列,SPI2和SPI3可以配置为I2S模式。但有些低端型号如STM32F0、F1的部分型号,I2S功能是残缺的,或者不支持DMA。
我个人推荐以下型号:
| 系列 | 推荐型号 | I2S接口数 | DMA支持 | 最高主频 | 适合场景 |
|---|---|---|---|---|---|
| STM32F4 | STM32F407VGT6 | 2个(SPI2/SPI3) | 双缓冲DMA | 168MHz | 高保真音频、实时处理 |
| STM32F7 | STM32F746ZGT6 | 2个 | 双缓冲DMA | 216MHz | 带LCD显示的高级播放器 |
| STM32H7 | STM32H743ZIT6 | 3个 | MDMA+BDMA | 480MHz | 多通道、高采样率专业音频 |
| STM32G4 | STM32G474RET6 | 1个 | DMA | 170MHz | 性价比方案、工业音频 |
重要提醒:我曾经帮一个朋友排查问题,他选了STM32F103C8T6做音频播放,结果发现F103的I2S不支持DMA传输,只能CPU轮询,导致播放时有明显的卡顿和爆音。所以,如果你打算做实时音频流,务必选择支持I2S DMA的型号。F4系列是性价比最高的选择。
另外,注意看芯片的封装和引脚数。I2S至少需要3个引脚(SCK、WS、SD),如果还要用I2C控制WM8960,再加2个引脚(SCL、SDA)。建议选100脚以上的封装,方便布线。
1.4 开发板与调试器连接——把线接对,成功一半
咱们课程以STM32F407VGT6 + WM8960模块为例。我建议你买一块STM32F4 Discovery板,或者自己画一块核心板。WM8960模块淘宝上很多,十几块钱一块,带耳机接口和喇叭接口,非常方便。
接线其实不复杂,我列个表:
| STM32F407引脚 | 功能 | WM8960模块引脚 | 备注 |
|---|---|---|---|
| PB13 | SPI2_SCK (I2S2_CK) | BCLK | 位时钟 |
| PB12 | SPI2_NSS (I2S2_WS) | LRCK | 字选择 |
| PB15 | SPI2_MOSI (I2S2_SD) | DIN | 数据输出(播放) |
| PC3 | I2C1_SCL | SCL | I2C时钟 |
| PC2 | I2C1_SDA | SDA | I2C数据 |
| GND | GND | GND | 共地 |
| 3.3V | VCC | VCC | 供电(注意模块电压) |
接线小技巧:我习惯把I2S的BCLK和LRCK用不同颜色的杜邦线,比如BCLK用黄色,LRCK用蓝色,SD用绿色。这样调试时一眼就能分辨。另外,电源和地线尽量用粗一点的线,或者直接焊接到板子上,避免接触不良导致杂音。
调试器方面,我用的是ST-Link V2,便宜又好用。如果你用J-Link或者DAP-Link也行,只要能下载和调试STM32即可。连接方式:
- ST-Link的SWDIO接STM32的PA13
- ST-Link的SWCLK接STM32的PA14
- ST-Link的GND接STM32的GND
- ST-Link的3.3V可以给板子供电(如果板子没有独立电源)
接好线之后,上电前用万用表测一下电源和地之间有没有短路。嗯,这一步虽然基础,但能救你一块板子。