第2章:硬件原理图分析——主控I2S与WM8960外围电路
硬件原理图分析,是音频驱动开发的第一步。说白了,你得先搞清楚芯片之间怎么连的,才能写对驱动。我见过不少工程师,上来就撸代码,结果发现BCLK和FS接反了,折腾好几天。嗯,咱们别走这个弯路。
这一章,我会带你过一遍I2S接口的信号定义、WM8960的外围电路设计,最后给出一份硬件检查清单。你拿着这份清单去对原理图,基本不会漏东西。
核心原则:音频驱动的问题,60%以上出在硬件连接上。原理图分析越仔细,后面调试越省心。
2.1 主控I2S控制器接口
先看主控这边。I2S接口有四根主要信号线,咱们一个一个说。
| 信号名 | 全称 | 方向 | 说明 |
|---|---|---|---|
| BCLK | Bit Clock | 主控输出 | 位时钟,每个bit一个脉冲 |
| FS | Frame Sync | 主控输出 | 帧同步,也叫LRCK,左右声道切换 |
| DIN | Data In | 主控输入 | 从WM8960接收音频数据 |
| DOUT | Data Out | 主控输出 | 向WM8960发送音频数据 |
BCLK 的频率决定了音频的采样率和位深。举个例子,采样率48kHz、位深16bit、双声道,BCLK就是 48k × 16 × 2 = 1.536MHz。我个人习惯先算这个值,再去核对主控时钟树能不能分频出来。
FS 的频率等于采样率。48kHz采样时,FS就是48kHz。注意,有些主控叫LRCK,其实一回事。
DIN和DOUT 的方向容易搞混。我刚开始做的时候,总觉得DIN是输出,结果焊好板子不出声。你记住:DIN是进主控的,DOUT是出主控的。WM8960那边正好相反。
小技巧:看原理图时,把主控和CODEC的I2S引脚标上方向箭头。主控DOUT → CODEC DIN,主控DIN ← CODEC DOUT。这样一眼就能看出问题。
2.2 WM8960外围电路
WM8960是个好东西,集成了DAC、ADC、耳机功放、喇叭功放。但外围电路如果没做好,再好的芯片也白搭。我拆成三块来讲:电源、时钟、模拟输入输出。
2.2.1 电源
WM8960需要三组电源:
- AVDD:模拟电源,3.3V。纹波要小,我建议加LC滤波。
- DVDD:数字电源,1.8V或3.3V。看主控IO电平,保持一致。
- SPKVDD:喇叭功放电源,3.3V或5V。电流需求大,走线要粗。
曾经有个项目,喇叭有滋滋声,查了半天发现SPKVDD和AVDD共用一个LDO,功放的大电流干扰了模拟电路。后来分开供电,问题解决。
注意:WM8960的电源上电顺序有要求。DVDD要先于AVDD上电,否则可能锁死I2C寄存器。数据手册第7页有详细时序图,建议贴在你的调试笔记里。
2.2.2 时钟
WM8960需要外部时钟源,通常是MCLK。频率可以是11.2896MHz、12.288MHz、24.576MHz等。选哪个?看你的采样率需求。
| 采样率 | 推荐MCLK | 备注 |
|---|---|---|
| 44.1kHz | 11.2896MHz | 256×FS,CD标准 |
| 48kHz | 12.288MHz | 256×FS,DVD标准 |
| 96kHz | 24.576MHz | 256×FS,高清音频 |
我个人习惯用12.288MHz,因为48kHz和96kHz都能覆盖。如果你要同时支持44.1kHz和48kHz,那就得用双PLL或者可编程振荡器。
MCLK的走线要远离开关电源和数字总线。我在一个项目里遇到过MCLK被DDR时钟串扰,导致音频有周期性噪声。后来把MCLK走线包地处理,噪声消失。
2.2.3 模拟输入输出
WM8960的模拟接口很丰富,咱们挑常用的说。
模拟输入:
- LINE_IN:线路输入,典型接法是通过电容耦合到IN1/IN2引脚。
- MIC_IN:麦克风输入,需要偏置电压和放大。WM8960内部有MICBIAS,可以给驻极体麦克风供电。
模拟输出:
- HP_OUT:耳机输出,直接驱动32Ω耳机。注意要加串联电阻(通常10Ω)和ESD保护。
- SPK_OUT:喇叭输出,WM8960内置D类功放,效率高。但输出要加LC滤波器,否则EMI会超标。
避坑指南:我曾经在HP_OUT上没加串联电阻,结果耳机插入瞬间有爆破声。后来加了10Ω电阻和100μF电解电容,问题解决。原理图里这两个元件不能省。
2.3 硬件连接检查清单
好了,理论说完了。咱们来点实际的。下面这份清单,是我多年调试经验的总结。你拿到一块新板子,按这个顺序检查,能省下大量时间。
- I2S信号线检查
- BCLK、FS、DIN、DOUT是否一一对应?
- 有没有串接电阻?通常0Ω或22Ω,用于阻抗匹配。
- 走线长度是否等长?不等长会导致时序偏移。
- I2C控制线检查
- SCL、SDA是否上拉?通常4.7kΩ到3.3V。
- 地址引脚配置是否正确?WM8960的7位地址是0x1A(ADDR接地)或0x1B(ADDR接DVDD)。
- 电源检查
- AVDD、DVDD、SPKVDD电压是否在规格范围内?
- 去耦电容是否靠近芯片引脚?我建议每个电源引脚放一个0.1μF陶瓷电容。
- 上电顺序是否满足?DVDD先于AVDD。
- 时钟检查
- MCLK频率是否正确?用示波器量一下。
- MCLK幅度是否足够?WM8960要求最小1.5Vpp。
- MCLK抖动是否过大?抖动大会导致DAC SNR下降。
- 模拟通路检查
- 输入耦合电容是否焊接?通常1μF~10μF。
- 输出串联电阻和电容是否焊接?
- 耳机座和喇叭座是否共地?
- 复位和使能检查
- WM8960的RST引脚是否拉高?低电平复位。
- 如果用了GPIO控制电源,确保上电后GPIO输出正确电平。
我的习惯:每次拿到新板子,先用万用表量一遍电源对地电阻,确认没有短路。然后上电,用示波器看MCLK和BCLK波形。这两步没问题,再开始写驱动。你想想看,如果硬件有问题,驱动写得再好也没用。
2.4 知识结构图:I2S与WM8960硬件连接全景
下面这张图,把主控、WM8960、外围电路的关系画清楚了。你可以把它打印出来,贴在工位上。
这张图里,主控和WM8960通过I2S总线传音频数据,通过I2C总线配寄存器。外围电路提供电源、时钟和模拟接口。你检查原理图时,就按这个框架来,不会乱。
2.5 实战案例:一次I2S调试经历
最后分享一个真实案例。有次我调试一块板子,WM8960能初始化,I2C读写正常,但就是没声音。用示波器看BCLK和FS,波形正常。看DIN,也有数据。问题出在哪?
后来我仔细看原理图,发现主控的DOUT连到了WM8960的DIN,但WM8960的DOUT没连到主控的DIN——中间断开了。原来硬件工程师把DIN和DOUT搞反了。飞线解决。
你想想看,如果我先用检查清单过一遍,这个问题十分钟就能发现。所以,别偷懒,清单用起来。