3. WM8960 芯片深度解析:内部框图、电源管理、时钟树结构、PLL 与分频器

WM8960 这颗芯片,我前前后后用了不下五个项目。从便携式录音笔到车载免提模块,它都能胜任。说白了,它就是一颗高度集成的音频编解码器,专门为便携设备设计的。但很多新手拿到数据手册就懵了——内部框图密密麻麻,电源管理脚位一堆,时钟树更是绕得头晕。

别急,这一章我带你把它拆开揉碎。你搞懂了 WM8960 的骨架,后面配时钟、调采样率就是水到渠成的事。

3.1 内部功能框图:一颗芯片的骨架

我们先看整体架构。WM8960 内部大致可以分为四个功能区:

  • 模拟输入前端:包括麦克风偏置、输入多路选择器、可编程增益放大器(PGA)。
  • ADC / DAC 转换核心:24 位 Sigma-Delta 转换器,支持 8kHz 到 96kHz 采样率。
  • 模拟输出后端:耳机放大器、扬声器驱动器(双声道 1W @ 8Ω)。
  • 数字接口与控制:I2S / PCM 数字音频接口、I2C 控制接口、时钟与 PLL 模块。

我个人习惯把框图分成“信号路径”和“控制路径”两条线来看。信号路径就是声音怎么进来、怎么出去;控制路径就是你怎么通过 I2C 去设置增益、切换模式、配置时钟。

核心要点:WM8960 的模拟输入和输出是完全独立的路径。你可以同时录音和放音,这就是全双工模式。我在做对讲机项目时就利用了这个特性,一路 ADC 采麦克风,一路 DAC 放喇叭,中间用 MCU 做回声消除。

下面这张 SVG 图,我把 WM8960 的核心数据流和时钟路径画在了一起。你盯着看两分钟,比读十页数据手册都管用。

WM8960 内部架构与时钟路径 模拟输入 MIC / LINE IN PGA (0~+70dB) ADC 24位 Σ-Δ 8k~96k S/s 数字接口 I2S / PCM 16/20/24/32位 DAC 24位 Σ-Δ 带数字音量 模拟输出 HP OUT / SPK OUT 1W @ 8Ω PLL & 时钟 MCLK → PLL → SYSCLK 分频器链 I2C 控制 寄存器配置 时钟分发到 ADC / DAC / 数字接口 注意:PLL 输出 SYSCLK 是所有数字模块的主时钟。ADC 和 DAC 的采样率由 SYSCLK 经过分频器链得到。 MCLK 可以是外部晶振,也可以来自 STM32 的 MCO 引脚。

3.2 电源管理:别让供电拖了后腿

WM8960 的电源脚位很多,我第一次看的时候也数了半天。它主要有三组电源域:

电源脚 典型电压 供电对象 注意事项
AVDD 2.7V ~ 3.6V 模拟电路(ADC/DAC/PGA) 纹波要小,建议 LDO 单独供电
DBVDD 1.71V ~ 3.6V 数字核心(I2S/I2C/控制逻辑) 可以和 MCU 共用 3.3V
DCVDD 1.71V ~ 3.6V 数字 I/O 缓冲 通常与 DBVDD 同电压
SPKVDD 2.7V ~ 5.5V 扬声器功放 电压越高输出功率越大

我曾经踩过的坑:有一次板子回来,扬声器声音断断续续,查了两天才发现 SPKVDD 纹波太大。WM8960 的扬声器功放对电源噪声非常敏感。后来我在 SPKVDD 入口加了一颗 10μF + 0.1μF 的去耦电容,问题立刻解决。记住,模拟电源和数字电源要分开走线,最好用地线隔开。

WM8960 还有一个省电模式,通过寄存器 R2(0x02)的 BIASEN 位来控制。你可以在不使用时关掉模拟偏置,把功耗降到微安级别。我做的便携录音笔项目,待机时就是靠这个功能把整机功耗控制在 50μA 以下。

3.3 时钟树结构:音频系统的命脉

时钟是音频系统的命脉。WM8960 的时钟树,说白了就是一条流水线:

  1. MCLK(主时钟):外部输入,可以是 12.288MHz、11.2896MHz 等标准频率,也可以是 STM32 的 MCO 输出。
  2. PLL(锁相环):把 MCLK 倍频到内部需要的频率。PLL 输出范围是 90kHz ~ 100MHz。
  3. SYSCLK(系统时钟):PLL 输出经过分频后的时钟,作为 ADC/DAC 和数字滤波器的基准。
  4. BCLK(位时钟):I2S 接口的位时钟,由 SYSCLK 分频得到。
  5. LRCLK(帧时钟):等于采样率,由 BCLK 分频得到。

你想想看,如果 MCLK 不准,PLL 就锁不住,SYSCLK 就飘了,最后采样率全乱套。这就是为什么我反复强调晶振精度要 50ppm 以内。

我的个人习惯:在原理图阶段就把 MCLK 的走线包地处理,远离开关电源和数字信号线。晶振负载电容要按数据手册推荐值选,别为了省几毛钱用错容值。我曾经见过一个项目,晶振起振不稳定,就是因为负载电容从 18pF 换成了 22pF,导致频率偏移了 0.3%。

3.4 PLL 与分频器:采样率的幕后推手

WM8960 的 PLL 是整数分频结构,公式如下:

PLL 输出频率 = MCLK × (R + N / M) / K

其中:

  • R:整数分频比(4 位,范围 1~15)
  • N / M:小数分频部分(N 9 位,M 9 位)
  • K:输出分频比(2 位,可选 1、2、3、4)

PLL 的输出必须经过分频器链才能得到 SYSCLK。分频器链的配置在寄存器 R4(0x04)中:

寄存器位 名称 说明
R4[7:6] SYSCLKDIV SYSCLK 分频比:00=1, 01=1.5, 10=2, 11=3
R4[5:4] BCLKDIV BCLK 分频比:00=1, 01=2, 10=4, 11=8
R4[3:0] LRCLKDIV LRCLK 分频比:0000=1, 0001=2, ... 1111=16

举个例子,假设你要用 48kHz 采样率,16 位数据,立体声:

  • BCLK = 48kHz × 16 × 2 = 1.536MHz
  • SYSCLK 通常设为 256 × LRCLK = 12.288MHz
  • 如果 MCLK 也是 12.288MHz,PLL 可以旁路(Bypass),直接让 MCLK 作为 SYSCLK
  • 如果 MCLK 是 24.576MHz,就需要用 PLL 分频到 12.288MHz

避坑指南:WM8960 的 PLL 锁定需要时间,大约 2ms ~ 5ms。你在初始化代码中,配置完 PLL 后一定要等待 PLL_LOCK 位(R1[5])置 1,再开始传输音频数据。我曾经偷懒没等这个标志位,结果前几帧音频全是噪声,听起来就像爆音。

最后,我建议你在调试时用示波器测量 LRCLK 的频率。如果 LRCLK 不准,先查 MCLK,再查 PLL 配置,最后查分频器。按照这个顺序排查,90% 的时钟问题都能解决。