3、硬件原理图设计实战:WM8960外围电路设计

好了,到了真正动手画原理图的环节了。很多同学拿到WM8960的数据手册,一看一百多页,头就大了。其实核心的外围电路就四大块:电源、时钟、模拟输入/输出、数字接口。把这四块理清楚,剩下的就是连线活。

我个人习惯,画任何Codec的原理图之前,先画一张系统级电源树。为什么?因为WM8960是个混合信号芯片,数字和模拟供电一旦串扰,底噪直接起飞。我早期一个项目就吃过这个亏,数字地和模拟地没处理好,录音全是“滋滋”声,后来重新改板才解决。

WM8960 外围电路设计四大模块 WM8960 电源模块 AVDD / DVDD / SPKVDD 时钟模块 MCLK / 外部晶振 模拟输入/输出 LINE_IN / MIC / HP_OUT 数字接口 I2S / I2C 设计要点 • 电源:模拟与数字供电必须隔离,推荐LC滤波 • 时钟:MCLK抖动直接影响THD+N,走线要短 • 模拟:差分输入抗干扰强,单端输入注意偏置

3.1 电源设计:模拟与数字的“楚河汉界”

WM8960有三组电源引脚:AVDD(模拟供电)、DVDD(数字供电)、SPKVDD(扬声器供电)。这三者绝对不能混为一谈。

电源域典型电压主要负载纹波要求
AVDD3.3VADC、DAC、模拟混音器< 50mVpp
DVDD1.8V 或 3.3V数字核心、I2S接口< 100mVpp
SPKVDD5V扬声器功放(D类)< 200mVpp(但电流大)
我曾经踩过的坑: 早期一个项目,我把AVDD和DVDD用同一个LDO供电,结果播放音乐时底噪明显。后来用示波器一量,数字部分的开关噪声直接串到了模拟参考电压上。解决方案很简单:AVDD用独立的低噪声LDO,输出加10uF+0.1uF去耦,靠近芯片引脚放置。

具体到原理图,我建议这样做:

  • AVDD:选用低噪声LDO(如TPS7A20xx系列),输出端串联一个磁珠(600Ω@100MHz)再进芯片,磁珠后面放10uF钽电容+0.1uF陶瓷电容。
  • DVDD:如果SoC那边有现成的1.8V或3.3V,可以直接拉过来用,但要加个LC滤波隔离一下。
  • SPKVDD:这个电流大(驱动8Ω喇叭时峰值可达1A以上),建议直接从系统电源轨取电,走线宽度至少40mil。
  • 地平面:模拟地和数字地在芯片下方单点连接,用0Ω电阻或磁珠跨接。别搞成大面积分割,否则回流路径会绕远路。

3.2 时钟设计:MCLK是音频的“心跳”

WM8960需要外部提供MCLK(主时钟)。这个时钟的质量直接决定了音频的THD+N(总谐波失真+噪声)。你想想看,如果MCLK抖动大,ADC采样时刻就不准,还原出来的声音能不“糊”吗?

MCLK的频率通常是采样率的整数倍:

  • 采样率 48kHz → MCLK = 12.288MHz(256×fs)
  • 采样率 44.1kHz → MCLK = 11.2896MHz(256×fs)
  • 采样率 96kHz → MCLK = 24.576MHz(256×fs)
我的个人习惯: 如果SoC有专用的MCLK输出引脚(比如I2S的MCLK),直接用SoC提供。但要注意SoC的MCLK输出质量——有些SoC的MCLK是从PLL分频出来的,抖动偏大。这时候我宁愿在板子上放一颗有源晶振,虽然多花几毛钱,但省心。

时钟走线的注意事项:

  • MCLK走线要短而直,远离开关电源、DC-DC电感。
  • 串接一个22Ω~33Ω的电阻靠近WM8960的MCLK引脚,用于抑制过冲和反射。
  • 如果MCLK走线超过2英寸,建议做包地处理,两侧打地过孔。

3.3 模拟输入/输出:差分还是单端?

WM8960的模拟输入支持差分和单端两种模式。差分输入的共模抑制比(CMRR)更好,抗干扰能力强。但很多实际产品(比如对讲机、录音笔)用的是单端麦克风,这时候就得注意偏置电压了。

3.3.1 麦克风输入(单端)

单端麦克风输入,WM8960内部有可编程的MICBIAS(麦克风偏置电压),默认输出2.2V。外部电路很简单:

MICBIAS --> 2.2kΩ电阻 --> MIC+(电容耦合)
MIC-(通过0.1uF电容接地)

这里有个细节:MICBIAS的输出电流有限(最大3mA),如果接的是驻极体麦克风,2.2kΩ偏置电阻就够了。如果是数字硅麦,别用这个,得外部单独供电。

3.3.2 线路输入(差分)

差分输入我一般用于LINE_IN,比如从外部音源(手机、电脑)输入音频。电路如下:

LINE_IN_L+ --> 1uF耦合电容 --> WM8960 IN1L
LINE_IN_L- --> 1uF耦合电容 --> WM8960 IN1R(配置为反相输入)

差分输入的好处是,如果LINE_IN线缆比较长,共模噪声会被抵消掉。我在做车载音频项目时,差分输入帮了大忙——车内的电磁环境太恶劣了,单端根本扛不住。

3.3.3 耳机输出

WM8960的耳机输出是电容耦合的,需要外接220uF~470uF的电解电容。这个电容不能省,否则直流偏置会烧耳机。

注意: 耳机输出的地(HP_GND)是虚拟地,不能直接接系统地。WM8960内部通过电荷泵产生一个负压,让耳机输出可以以0V为参考。所以HP_GND走线要单独走,不要和模拟地混在一起。

3.4 数字接口:I2S + I2C,两条“高速公路”

WM8960的数字接口分两条路:

  • I2S:传输音频数据(PCM码流)
  • I2C:传输控制命令(音量、EQ、路由配置)

3.4.1 I2S接口连接

I2S有四根线:

信号方向说明
MCLKSoC → WM8960主时钟,256×fs或384×fs
BCLKSoC → WM8960位时钟,64×fs
LRCKSoC → WM8960帧时钟,等于采样率fs
DINSoC → WM8960音频数据输入(播放)
DOUTWM8960 → SoC音频数据输出(录音)

连接时,SoC作为I2S Master,WM8960作为Slave。SoC提供BCLK和LRCK,WM8960根据这两个时钟同步收发数据。

我曾经遇到的问题: 有次I2S通信时好时坏,用逻辑分析仪抓波形发现BCLK的占空比不对。后来查出来是SoC的I2S引脚驱动能力不够,BCLK上升沿太缓。解决办法:在BCLK引脚上拉一个4.7kΩ电阻到3.3V,波形立马干净了。

3.4.2 I2C接口连接

I2C就两根线:SCL(时钟)和SDA(数据)。WM8960的I2C地址是0x1A(7位地址),如果ADDR引脚拉高,地址变成0x1B。

硬件上注意:

  • SCL和SDA必须接上拉电阻,典型值4.7kΩ。
  • 走线长度尽量一致,避免信号歪斜。
  • 如果I2C总线上挂了多个设备,总负载电容不要超过400pF,否则通信会出错。

3.5 与主控SoC的连接要点

最后说说WM8960和SoC怎么连。以我常用的全志V3s为例:

SoC (V3s)                WM8960
-----------------        -----------------
I2S0_MCLK (PB2)  --->   MCLK
I2S0_BCLK (PB3)  --->   BCLK
I2S0_LRCK (PB4)  --->   LRCK
I2S0_DIN  (PB5)  --->   DIN
I2S0_DOUT (PB6)  --->   DOUT
I2C0_SCL  (PA12) --->   SCL
I2C0_SDA  (PA11) --->   SDA
GPIO (任意)      --->   nRST (复位引脚,低电平复位)

这里有几个要点:

  • 复位引脚:WM8960的nRST必须由SoC的GPIO控制,不能直接接VCC。否则上电时序不对,I2C可能无法初始化。
  • 电平匹配:如果SoC是3.3V,WM8960也是3.3V,直接连没问题。如果SoC是1.8V,需要加电平转换芯片(如TXS0102)。
  • 电源上电顺序:先给DVDD上电,再给AVDD上电。如果反过来,芯片内部可能会锁死。我习惯在DVDD和AVDD的LDO使能引脚上加RC延时,确保DVDD先起来。
一个小技巧: 在原理图里,把WM8960的每个引脚功能用Net Label标注清楚,比如“WM_MCLK”、“WM_BCLK”。这样Layout工程师布线时一目了然,不会搞混。我见过太多因为Net Label不清晰导致连错线的案例了。

好了,原理图设计这部分就讲到这里。核心就是记住:电源隔离、时钟干净、模拟差分、数字匹配。把这四点做到位,WM8960的硬件设计基本不会出大问题。