2、WM8960芯片深度解析:芯片特性、内部框图、电源管理、时钟树、音频路径(ADC/DAC路径)

各位同学,大家好。今天我们来啃一块硬骨头——WM8960这颗编解码芯片。说实话,在嵌入式音频领域,WM8960算是一颗“常青树”了。我最早接触它是在一个便携式录音笔的项目上,那时候就被它丰富的功能和灵活的配置给吸引了。你想想看,一颗芯片集成了立体声ADC/DAC、耳机驱动、扬声器功放,还支持多种音频路径切换,这在十年前简直是神器。

咱们这节课,不搞虚的。我会从芯片特性、内部框图、电源管理、时钟树,再到ADC/DAC的音频路径,一层层剥开来看。嗯,这里要注意,很多同学拿到芯片手册就懵,觉得寄存器太多。其实只要理解了内部数据流,寄存器配置就是水到渠成的事。

2.1 芯片特性概览

先看一张表,把WM8960的核心参数捋一遍。我个人习惯,拿到新芯片第一件事就是看它的“硬指标”,这决定了它能不能用在你的项目里。

特性类别 具体参数 备注
音频性能 信噪比(SNR) 98dB (ADC), 98dB (DAC) 典型值,实际取决于PCB布局
采样率 8kHz ~ 96kHz 支持标准音频采样率
音频接口 I2S / 左对齐 / DSP 模式 兼容主流SoC
控制接口 I2C (最高400kHz) 用于寄存器配置
输出驱动 耳机: 40mW @ 16Ω; 扬声器: 1W @ 8Ω 单声道BTL模式
电源 核心: 2.7V~3.6V; 数字IO: 1.65V~3.6V 支持独立IO电压域
封装 QFN-32 (5mm x 5mm) 小尺寸,适合便携设备
我的经验: 98dB的SNR在消费级产品里算不错了。但如果你要做专业录音笔,建议在模拟输入前端加一级低噪声运放。我曾经在一个项目中直接怼麦克风进WM8960,底噪感人,后来加了OPA1611才搞定。

2.2 内部框图:数据流才是王道

理解了参数,我们来看内部结构。下面这张SVG图,是我根据手册重新整理的,去掉了那些不常用的辅助模块,只保留了核心数据流。你跟着箭头走一遍,基本就明白WM8960是怎么工作的了。

WM8960 内部核心数据流框图 LINE_IN MIC_IN 输入 混音器 ADC 数字滤波 I2S 接口 (音频总线) DAC 回放路径 输出 混音器 HP_OUT SPK_OUT I2C 控制 关键路径说明: 录音:MIC→混音器→ADC→I2S 播放:I2S→DAC→混音器→HP 直通:LINE_IN→混音器→HP

从这张图你能看到,WM8960的核心就是两个混音器——输入混音器和输出混音器。所有音频路径都围绕着它们展开。说白了,你配置芯片的过程,就是在告诉这两个混音器:“把哪几路信号混合,再送到哪里去。”

2.3 电源管理:别让功耗坑了你

WM8960的电源管理非常灵活,但也容易踩坑。它内部有多个独立的电源域,你可以通过寄存器按需开启或关闭。

我曾经踩过的坑: 有一次调试,发现耳机输出有“噗”声。查了半天,发现是SPK_AMP(扬声器功放)的电源没关。虽然没接扬声器,但功放电路还在工作,上电瞬间的冲击耦合到了耳机通路。所以,不用的模块一定要通过寄存器关掉电源!

电源管理的核心寄存器是 R2 (Power Management 1)、R3 (Power Management 2) 和 R4 (Power Management 3)。我习惯把它们叫做“三兄弟”。

寄存器 控制对象 典型配置
R2 (0x02) MICBIAS、VMID、输入混音器、ADC 录音时开启,播放时可关
R3 (0x03) 输出混音器、DAC、耳机功放 播放时开启,录音时可关
R4 (0x04) 扬声器功放、BYPASS路径 按需开启,默认关闭

这里有个小技巧:VMID(中间电压)一定要先开启,再开其他模块。VMID是内部模拟电路的参考地,它没稳定之前,开ADC或DAC会导致输出直流偏移,严重时会烧喇叭。我一般会在初始化时先开VMID,然后等10ms,再开其他电源。

2.4 时钟树:音频的“心跳”

时钟是音频系统的命脉。WM8960的时钟树设计得相当灵活,它可以从MCLK(主时钟)或BCLK(位时钟)中衍生出所有内部需要的时钟。

核心时钟路径是这样的:

  1. MCLK 或 BCLK 进入芯片后,先经过一个 时钟分频器。
  2. 分频后的时钟送给 内部PLL(锁相环),PLL可以倍频或分频。
  3. PLL输出再经过 可编程分频器,生成 ADC/DAC采样时钟 和 系统时钟。

关键公式:

采样率 (Fs) = (MCLK / 分频系数) / (256 或 384)

为什么是256或384?这是WM8960内部过采样率(OSR)决定的。比如你设OSR=128,那内部DAC会以128*Fs的频率工作。

我建议你直接用MCLK作为主时钟源,省去PLL配置的麻烦。比如你系统里有一个12.288MHz的晶振,那它可以直接产生48kHz及其倍数的采样率。如果你只有24MHz的晶振,那就必须用PLL了。

配置PLL时,有一个公式要记住:

PLL输出频率 = (MCLK * (N + 1)) / (R * 2^K)
其中:
- N: 分频比 (0~7)
- R: 参考分频 (1~15)
- K: 后分频 (0~7)

嗯,这个公式看着有点绕。我一般会直接用Wolfson官方提供的PLL计算工具,或者自己写个Python脚本算。手动算容易出错,我曾经因为算错一个N值,导致音频变调,听起来像“慢放”,排查了半天。

2.5 音频路径:ADC与DAC的“高速公路”

最后,我们来看最核心的音频路径。这部分理解了,寄存器配置就是填空。

2.5.1 ADC路径(录音)

信号从麦克风或线路输入,到I2S接口输出,中间经过以下关卡:

  1. 输入引脚:LINPUT1/2、RINPUT1/2 或 MIC输入。
  2. 输入混音器:可以混合多路输入,并调节增益(-17.25dB ~ +30dB)。
  3. ADC:模拟信号转数字,支持可编程增益放大器(PGA)。
  4. 数字滤波:包括高通滤波器(HPF)和数字音量控制。
  5. I2S接口:将数字音频数据发送给CPU。
避坑指南: 我曾经在录音时发现声音有“咔咔”的爆音。检查后发现是输入信号太强,超过了ADC的满量程。解决办法是降低PGA增益,或者开启输入混音器的衰减器。记住,ADC的输入范围是±1V(典型值),超过就会削波。

2.5.2 DAC路径(播放)

信号从I2S接口进来,到耳机或扬声器输出,路径如下:

  1. I2S接口:接收CPU送来的数字音频数据。
  2. 数字滤波:包括插值滤波器和数字音量控制。
  3. DAC:数字信号转模拟,内置低通滤波器。
  4. 输出混音器:可以混合DAC输出和直通信号(Bypass)。
  5. 输出功放:耳机功放(HPOUT)或扬声器功放(SPKOUT)。

这里有一个很实用的功能——模拟直通 (Analog Bypass)。你可以把LINE_IN的信号直接送到输出混音器,不经过ADC/DAC。这在一些对延迟要求高的场景(比如K歌监听)非常有用。配置也很简单,只需要在输出混音器寄存器里把对应的输入通道使能即可。

好了,关于WM8960的芯片特性、内部框图、电源管理、时钟树和音频路径,我们就讲到这里。这些是后续配置驱动和优化性能的基础。你把这些概念吃透了,后面写代码的时候就会觉得“原来如此”。