STM32 HAL库WM8960音量控制与静音功能开发 - 第1节

1.1 WM8960 芯片特性速览

WM8960 是 Wolfson(现 Cirrus Logic)推出的一款低功耗立体声音频编解码器。说实话,我第一次拿到这颗芯片的 datasheet 时,第一反应是「功能真全」——它集成了双声道 DAC 和 ADC、耳机驱动、扬声器驱动,甚至还带了个数字信号处理引擎。

我个人习惯把它的核心特性归纳为以下几点:

  • 低功耗设计:典型工作电流在 10mA 左右,适合便携设备
  • 高信噪比:DAC 信噪比 98dB,ADC 信噪比 94dB
  • 内置扬声器驱动:每通道可输出 1W(8Ω 负载)
  • 可编程音频接口:支持 I2S、左对齐、右对齐、DSP 模式
  • 灵活的时钟管理:内置 PLL,支持多种采样率
  • 3D 音效与 EQ:硬件实现的立体声增强和均衡器

我的一点经验:WM8960 的 3D 音效功能在耳机端效果明显,但扬声器模式下建议慎用——我在一个项目中开了 3D 增强,结果声音发虚,后来关掉才恢复正常。

1.2 引脚功能详解

WM8960 采用 QFN-32 封装,引脚不算多,但功能划分很清晰。我把它分成几组来讲:

1.2.1 电源引脚

引脚名 功能 典型电压
AVDD 模拟电源 2.7V - 3.6V
DVDD 数字电源 1.71V - 3.6V
SPKVDD 扬声器电源 2.7V - 5.5V
DGND 数字地 0V
AGND 模拟地 0V

注意:SPKVDD 可以单独供电,最高支持 5.5V。我曾经因为没注意这个引脚接了 3.3V,导致扬声器输出功率不足——后来换成 5V 供电,音量直接翻倍。

1.2.2 音频接口引脚

这部分是 I2S 通信的关键:

  • BCLK:位时钟,由主设备提供
  • DACLRC:DAC 帧同步(左右声道时钟)
  • DACDAT:DAC 数据输入
  • ADCLRC:ADC 帧同步
  • ADCDAT:ADC 数据输出

嗯,这里要注意:WM8960 的 DACLRC 和 ADCLRC 是分开的,这意味着你可以让 DAC 和 ADC 工作在不同的采样率下。不过实际项目中我很少这么用,一般还是保持同步。

1.2.3 控制接口引脚

  • SCLK:I2C 时钟线
  • SDIN:I2C 数据线
  • CSB/GPIO1:I2C 地址选择(高电平 0x1A,低电平 0x1B)

你想想看,一个引脚同时做两件事——WM8960 的 CSB 引脚在 I2C 模式下就是地址选择,拉高拉低决定设备地址。我习惯拉低,用 0x1B 地址,这样和大多数开发板上的默认配置一致。

1.3 I2S 与 I2C 接口说明

1.3.1 I2S 音频总线

I2S(Inter-IC Sound)是数字音频传输的标准接口。说白了,它就是让 MCU 和编解码器之间传音频数据的通道。

WM8960 支持以下几种音频格式:

模式 数据格式 典型应用
I2S MSB 对齐,左声道在 LRC 低电平 通用音频设备
左对齐 MSB 对齐,数据在 LRC 边沿后立即开始 部分 DSP 处理器
右对齐 LSB 对齐,数据在 LRC 边沿前结束 旧式音频设备
DSP 模式 帧同步脉冲模式 多通道音频

我个人建议初学者先用标准 I2S 模式,兼容性最好。我在项目中踩过坑——有一次为了省引脚,想用 DSP 模式做时分复用,结果调试了两天才发现是帧同步时序没配好。

1.3.2 I2C 控制总线

I2C 负责配置 WM8960 的内部寄存器。这颗芯片有 56 个寄存器,每个 9 位宽(7 位地址 + 9 位数据)。

通信流程很简单:

  1. 主机发送起始信号
  2. 发送设备地址(7 位)+ 写位(0)
  3. 等待从机应答
  4. 发送寄存器地址(7 位)
  5. 等待从机应答
  6. 发送 9 位数据(高 1 位填充 0,低 8 位有效)
  7. 等待从机应答
  8. 主机发送停止信号

小技巧:WM8960 的寄存器写入需要 9 位数据,但 STM32 的 I2C 硬件一次只能发 8 位。我的做法是分两次发送——先发高 1 位(填充 0),再发低 8 位。或者直接用 HAL 库的 HAL_I2C_Mem_Write 函数,把 9 位数据拼成两个字节。

1.4 典型应用电路

下面这张图是我在实际项目中常用的 WM8960 电路结构:

WM8960 典型应用电路框图 WM8960 典型应用电路框图 STM32 MCU I2S I2C WM8960 音频编解码器 SPK_OUT 扬声器 HP_OUT 耳机 麦克风 MIC_IN 线路输入 LINE_IN 电源管理 AVDD/DVDD/SPKVDD 关键连接说明 • I2S: BCLK/DACLRC/DACDAT • I2C: SCLK/SDIN (地址 0x1A/0x1B) • 电源去耦电容靠近引脚放置

实际电路设计中,有几点我想特别强调:

  • 电源去耦:每个电源引脚旁边都要放 0.1μF 和 10μF 电容,靠近引脚放置。我见过有人偷懒只放一个电容,结果底噪大了 3dB。
  • 模拟地与数字地:建议用 0Ω 电阻或磁珠单点连接,避免数字噪声串入模拟电路。
  • I2S 信号线:BCLK 和 DACLRC 走线尽量等长,避免时序偏移。高速模式下这点尤其重要。
  • 耳机输出:串联 22Ω 电阻和 100pF 电容到地,可以抑制射频干扰。

避坑提醒:我曾经在一个项目中把 WM8960 的模拟地和数字地直接大面积铺铜连在一起,结果播放音乐时能听到明显的数字噪声。后来用磁珠隔离,问题才解决。所以地线处理千万别马虎。

1.5 本章小结