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内部结构其实挺清晰的。我画了一张简化的功能框图,帮你理解数据流:

WM8960 内部数据流与外部接口框图 数字音频接口 I2S / 左对齐 / DSP BCLK, WS, SD DAC 24位立体声 SNR 98dB 输出混音器 音量/静音控制 3D增强 耳机输出 HPOUT 喇叭输出 SPKOUT 麦克风输入 MIC1/MIC2 差分/单端 ADC 24位立体声 ALC自动电平 I2C 控制接口 配置寄存器 说明:I2C用于配置音量、格式、EQ等 音频数据流走I2S,控制流走I2C,互不干扰

从图上可以看得很清楚: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可以给板子供电(如果板子没有独立电源)

接好线之后,上电前用万用表测一下电源和地之间有没有短路。嗯,这一步虽然基础,但能救你一块板子。