2、WM8960芯片详解:内部架构、寄存器映射、时钟树与PLL配置、电源管理序列

WM8960 这颗芯片,我前前后后调了不下五个项目。从便携音箱到车载语音助手,它都出现过。说白了,它就是一颗集成了双声道 DAC/ADC、耳机功放、喇叭功放以及数字信号处理能力的音频编解码器。你把它理解成一个音频信号的「翻译官」加「放大器」就行。

2.1 内部架构:信号流与核心模块

我们先看它的内部信号流。我个人习惯把 WM8960 的架构分成三块:数字接口、数字处理核心、模拟输出。

核心模块速览:

  • 数字接口(I2S/PCM): 负责和 CPU/SoC 交换音频数据。
  • 数字信号处理(DSP): 包含 3D 环绕、EQ、自动电平控制(ALC)。
  • DAC/ADC 转换: 24 位精度,采样率最高 96kHz。
  • 模拟输出: 耳机功放(HPOUT)、喇叭功放(SPKOUT)、线路输出(LINEOUT)。
  • 时钟与 PLL: 内部锁相环,用于生成主时钟。

下面这张图是我画的内部架构简图,方便你理解数据怎么流进去、怎么流出来。

WM8960 内部架构框图 WM8960 内部架构与信号流 I2S / PCM 数字音频接口 数字处理核心 EQ / 3D / ALC DAC ADC HPOUT / SPKOUT 模拟输出 LINEIN / MIC 时钟与 PLL MCLK / SYSCLK I²C / SPI 控制接口 💡 信号流说明: 播放路径:I2S → 数字处理 → DAC → 模拟输出(耳机/喇叭) 录音路径:模拟输入(MIC/LINEIN)→ ADC → 数字处理 → I2S 时钟路径:外部 MCLK 或 PLL 生成 SYSCLK,驱动所有数字模块 控制路径:I²C/SPI 配置寄存器,控制所有模块的开关与参数

嗯,这里要注意:数字处理核心里的 ALC(自动电平控制)是个好东西,但搞不好会引入延迟。我在一个对讲机项目里就吃过这个亏,后面会专门讲。

2.2 寄存器映射:你只需要记住这几个

WM8960 的寄存器有 56 个,每个 9 位。你不需要全背下来,但有几个关键的必须烂熟于心。

寄存器地址 名称 功能描述 我常用的值
0x00 Reset 软件复位 0x00
0x02 Power Management (1) 控制各模块电源开关 0x1FF(全开)
0x03 Power Management (2) 控制输出级电源 0x1FF(全开)
0x04 Clock Management (1) PLL 与时钟分频配置 视 MCLK 而定
0x05 Clock Management (2) SYSCLK 分频与采样率 视采样率而定
0x06 Audio Interface (1) I2S 格式、字长、主从模式 0x0002(I2S 24bit)
0x18 ALC Control (1) ALC 开关与目标电平 0x003B
0x19 ALC Control (2) ALC 保持时间与衰减/增益步长 0x0032

我的调试习惯:每次上电后先读 0x00 寄存器确认芯片应答,然后写 0x02 和 0x03 把所有电源域打开,再配时钟。这样能最快排除「某个模块没供电」这种低级问题。

2.3 时钟树与 PLL 配置:最容易翻车的地方

WM8960 的时钟树,说白了就是怎么从外部 MCLK 得到内部 SYSCLK。SYSCLK 是所有数字模块的主时钟,DAC/ADC 的采样率、数字滤波器的运算都靠它。

为什么会翻车?因为很多人搞不清 MCLK、SYSCLK、采样率三者之间的关系。

核心公式就一个:

SYSCLK = MCLK × PLL_N / PLL_K
或者
SYSCLK = MCLK(直通模式)

然后:
SYSCLK = 采样率 × 256(或 384、512,取决于寄存器配置)

举个例子,我常用的配置:

  • MCLK = 12.288 MHz
  • 目标采样率 = 48 kHz
  • SYSCLK = 48 kHz × 256 = 12.288 MHz
  • 此时 MCLK 刚好等于 SYSCLK,不需要 PLL,直通模式即可。

但如果 MCLK 是 13 MHz 呢?那就得用 PLL 了。WM8960 的 PLL 配置稍微有点绕,它有一个整数分频和一个分数分频。

PLL 输出频率 = (MCLK / R) × N.K
其中:
R = 分频系数(1~8)
N = 整数部分(6~12)
K = 小数部分(0~9999)

⚠️ 避坑指南:我曾经在一个项目里直接用 13 MHz 的 MCLK 配 48 kHz 采样率,没开 PLL,结果声音变调。后来发现 SYSCLK 必须精确等于 12.288 MHz,差一点都不行。WM8960 的数字滤波器对时钟抖动很敏感,PLL 的环路滤波器配置也要按 datasheet 来,别自己瞎改。

下面这张图是我画的时钟树配置流程,照着走一般不会错。

WM8960 时钟树配置流程 WM8960 时钟树配置流程 输入 MCLK 频率 计算目标 SYSCLK = 采样率 × 256 MCLK == SYSCLK ? 是 否 直通模式 配置 PLL 配置分频与采样率

2.4 电源管理序列:顺序错了会无声

WM8960 的电源管理,不是一股脑把所有位都置 1 就完事了。它有严格的上下电顺序,尤其是 DAC 和耳机功放。

我总结的「黄金上电序列」:

  1. 先开数字核心电源: 寄存器 0x02 的 bit 0~5(DACL、DACR、ADCL、ADCR、MICB、VMID)。
  2. 再开输出级电源: 寄存器 0x03 的 bit 0~5(HPOUTL、HPOUTR、SPKL、SPKR、LINEOUTL、LINEOUTLR)。
  3. 配置时钟: 先配 PLL(如果需要),再配 SYSCLK 分频。
  4. 解除软静音: 寄存器 0x02 的 bit 6 和 bit 7。
  5. 设置音量: 从 -73dB 逐步提升到目标值,避免 pop 声。

⚠️ 避坑指南:我曾经在调试一个车载项目时,发现耳机插上去有巨大的「噗」声。查了两天,最后发现是上电时先开了耳机功放,再开的 DAC。顺序反了,DAC 上电瞬间的直流偏置被直接放大输出。改成先开 DAC 再开功放,问题解决。

下电序列反过来就行:先关功放,再关 DAC,最后关数字核心。这样可以避免关机时的爆破音。

2.5 小结

WM8960 的这几个核心点——架构、寄存器、时钟、电源——你搞透了,后面调试 I2S 延迟和故障定位就有了基础。时钟配置是重中之重,我建议你拿到板子后,第一件事就是用示波器量 MCLK 和 SYSCLK 的波形,确认频率对不对。别信代码里的打印,示波器不会骗人。