1. 课程介绍与硬件准备:STM32与WM8960简介、开发板选型、硬件连接图、I2S与I2C总线概述

各位同学,欢迎来到这门实战课。我是你们的老朋友,一个在嵌入式音频领域摸爬滚打了十来年的工程师。今天咱们正式开始《STM32与WM8960音频Codec从初始化到播放实战》的第一章。

音频这东西,说简单也简单,不就是把数字信号转成声音嘛。但真要做起来,坑可不少。我记得刚入行那会儿,调一个I2S接口调了整整三天,最后发现是MCLK的相位没配对。嗯,从那以后我就养成了一个习惯——先把硬件和总线协议吃透,再动手写代码。这节课,咱们就先把地基打好。

1.1 为什么是STM32 + WM8960?

市面上音频Codec芯片那么多,为什么我偏偏选WM8960?说白了,三个理由:

  • 功能全:WM8960集成了立体声DAC、ADC、耳机放大器、麦克风偏置,甚至还有数字信号处理(DSP)效果。一颗芯片搞定音频输入输出,省事。
  • 音质好:信噪比(SNR)能做到98dB以上,THD+N(总谐波失真加噪声)低于-84dB。这个指标,做消费级音频产品完全够用。
  • 生态成熟:WM8960的驱动代码在STM32社区里一抓一大把,遇到问题也好找答案。

至于STM32,不用我多说了吧?Cortex-M内核,外设丰富,价格亲民。我个人的习惯是,做音频项目首选STM32F4或H7系列,因为它们带硬件I2S外设,省CPU资源。

核心知识点:WM8960负责音频信号的数模/模数转换,STM32负责控制逻辑和音频数据传输。两者通过I2C(控制通道)和I2S(数据通道)通信。

1.2 开发板选型建议

选开发板这事儿,我踩过不少坑。你想想看,如果板子选错了,后面调试起来有多痛苦?我给大家列个清单,照着买基本不会错:

方案 STM32型号 WM8960模块 推荐理由
入门级 STM32F407VGT6 WM8960音频模块(淘宝搜就有) 性价比高,资料多,适合初学者
进阶型 STM32H743ZIT6 WM8960官方评估板 性能强,支持更复杂的音频处理
成品板 正点原子探索者 板载WM8978(兼容WM8960) 省去接线麻烦,到手即用

我的建议:如果你手头已经有STM32F4开发板,直接买个WM8960模块就行,十几块钱,接线也不复杂。别一上来就买几百块的官方板,没必要。

1.3 硬件连接图

好,接下来是硬核内容——怎么把STM32和WM8960连起来。我直接画了个连接图,大家照着接就行。

STM32与WM8960硬件连接图 STM32 ↔ WM8960 硬件连接图 STM32F4 (主控) PB6 (I2C1_SCL) PB7 (I2C1_SDA) PC3 (I2S3_SCK) PC10 (I2S3_SD) PA4 (I2S3_WS) PC7 (I2S3_MCK) WM8960 (音频Codec) SCLK (I2C时钟) SDIN (I2C数据) BCLK (位时钟) DACDAT (音频数据) LRC (左右声道时钟) MCLK (主时钟) 图例: I2C控制总线(红色) I2S音频总线(紫色) 注意:MCLK由STM32提供,频率为256×采样率(如48kHz采样率下MCLK=12.288MHz)

避坑指南:我曾经因为MCLK没接,导致WM8960死活不出声。后来查手册才发现,WM8960的MCLK是必须的,不能省。另外,I2C的上拉电阻(4.7kΩ)别忘了加,不然通信不稳定。

1.4 I2S与I2C总线概述

这两个总线是咱们项目的命脉。我分开讲,大家仔细听。

1.4.1 I2C总线——控制通道

I2C用来干嘛?说白了,就是STM32给WM8960发指令。比如设置音量、选择输入源、配置采样率,全走I2C。

I2C的特点:

  • 两根线:SCL(时钟线)和SDA(数据线)。
  • 主从模式:STM32是主机,WM8960是从机。
  • 地址:WM8960的I2C地址是0x1A(7位地址),写操作时左移一位变成0x34。
  • 速度:标准模式100kHz,快速模式400kHz。音频控制用100kHz就够了。

关键点:I2C的时序要求很严格。启动条件(SCL高电平时SDA从高到低)、停止条件(SCL高电平时SDA从低到高),一个都不能错。我建议用STM32的硬件I2C外设,别用GPIO模拟,省心。

1.4.2 I2S总线——数据通道

I2S是音频数据的专用通道。你想想看,音频数据量多大?44.1kHz采样率、16位精度、双声道,每秒就是44.1k × 16 × 2 = 1.4112Mbps。用I2C传?慢死了。所以得用I2S。

I2S的引脚:

  • SCK(位时钟):每个音频位对应一个脉冲。比如16位数据,SCK频率 = 采样率 × 位数 × 声道数。
  • WS(左右声道时钟):高电平传右声道,低电平传左声道(或者反过来,看配置)。
  • SD(串行数据):音频数据就从这个引脚传。
  • MCK(主时钟):给Codec提供系统时钟,通常是256×采样率。

我给大家整理了一个表格,对比一下I2C和I2S的区别:

特性 I2C I2S
用途 控制/配置 音频数据传输
线数 2根(SCL, SDA) 3~4根(SCK, WS, SD, MCK)
速度 100kHz~400kHz 最高可达几十MHz
数据格式 字节流,带地址 串行音频帧,左右声道交替
主从关系 STM32为主,WM8960为从 STM32为主(提供时钟),WM8960为从

个人经验:调试I2S时,我习惯先用逻辑分析仪抓一下波形。看看SCK、WS、SD的时序对不对。特别是WS的极性,有些Codec要求WS高电平是左声道,有些是右声道。WM8960默认是WS高电平为左声道,别搞反了。

1.5 本章小结

好,第一章的内容就到这儿。咱们把STM32和WM8960的硬件连接、I2C和I2S总线的基本概念都捋了一遍。这些东西看着简单,但后面所有代码都建立在这个基础上。你想想看,如果硬件接错了,或者总线协议没搞明白,后面写再多代码也是白搭。