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 的核心数据流和时钟路径画在了一起。你盯着看两分钟,比读十页数据手册都管用。
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 的时钟树,说白了就是一条流水线:
- MCLK(主时钟):外部输入,可以是 12.288MHz、11.2896MHz 等标准频率,也可以是 STM32 的 MCO 输出。
- PLL(锁相环):把 MCLK 倍频到内部需要的频率。PLL 输出范围是 90kHz ~ 100MHz。
- SYSCLK(系统时钟):PLL 输出经过分频后的时钟,作为 ADC/DAC 和数字滤波器的基准。
- BCLK(位时钟):I2S 接口的位时钟,由 SYSCLK 分频得到。
- 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% 的时钟问题都能解决。