4、Codec数字接口:I2S、TDM、PCM、PDM接口协议详解与时序匹配
数字接口是Codec芯片的“神经”。选错了接口,或者时序没对上,音频数据根本传不过去。我见过不少工程师,芯片选型时只看ADC/DAC指标,结果画板子时才发现接口不匹配,只能飞线改方案。
今天咱们就把I2S、TDM、PCM、PDM这四种接口彻底讲透。你想想看,搞懂了它们,Codec选型至少能避开一半的坑。
核心观点:接口协议决定了你能接多少通道、跑多高采样率、以及主控端要不要额外做时钟处理。选型第一步,先看接口。
4.1 I2S:最经典的音频总线
I2S(Inter-IC Sound)是飞利浦在1986年定义的。到现在快40年了,依然是Codec最常用的接口。说白了,它就是三根线加一根可选的MCLK。
- BCLK(位时钟):每个bit一个脉冲。频率 = 采样率 × 位深 × 通道数。
- LRCK(帧时钟/字选择):左右声道切换。频率 = 采样率。
- SDATA(串行数据):音频数据,通常是二进制补码格式。
- MCLK(主时钟):可选,用于内部PLL同步。频率通常是采样率的256倍或512倍。
我在一个车载项目里遇到过:主控的I2S只支持16bit,但Codec需要24bit。结果数据截断,底噪直接高了6dB。所以啊,位深匹配是硬门槛。
经验之谈:I2S的LRCK在左声道时是低电平,右声道是高电平。但有些日本厂商的Codec会把左右反过来。画原理图前,一定先看数据手册里的时序图。
4.2 TDM:多通道的救星
TDM(Time Division Multiplexing)本质上是I2S的扩展。它把多个声道的数据塞进同一个数据线上,靠时隙来区分。
举个例子:8通道TDM,每个通道分配一个时隙。BCLK频率 = 采样率 × 位深 × 8。主控只需要一组BCLK/LRCK/SDATA,就能搞定8个麦克风或8个扬声器。
| 参数 | I2S(2通道) | TDM(8通道) |
|---|---|---|
| BCLK频率(48kHz/24bit) | 2.304 MHz | 9.216 MHz |
| 数据线数量 | 1 | 1 |
| LRCK频率 | 48 kHz | 48 kHz |
| 时隙对齐 | 无 | 需要配置时隙偏移 |
我曾经调试过一个TDM 16通道的阵列麦克风。主控的TDM控制器只支持8时隙,结果只能外接CPLD做时隙扩展。嗯,选型时一定要确认主控的TDM能力上限。
注意:TDM的时隙对齐方式各家不同。有些Codec要求第一个时隙从LRCK上升沿开始,有些要求下降沿。时序不匹配,数据全错位。
4.3 PCM:短帧与长帧的玄机
PCM(Pulse Code Modulation)接口在通信芯片里很常见。它和I2S最大的区别是:PCM的帧同步信号(FSYNC)只持续一个BCLK周期,而I2S的LRCK持续半个帧周期。
- 短帧PCM:FSYNC宽度 = 1个BCLK。适合低延迟场景。
- 长帧PCM:FSYNC宽度 = 8个BCLK。兼容性更好。
我建议:如果主控和Codec都支持,优先选长帧PCM。因为短帧PCM对BCLK的占空比要求更严格,容易受PCB走线长度影响。
另外,PCM接口通常支持A-law和μ-law压缩。但咱们做高保真音频时,一般不用压缩,直接传线性PCM数据。
4.4 PDM:数字麦克风的标配
PDM(Pulse Density Modulation)和前面三种完全不同。它传的不是多bit数据,而是一串1bit的脉冲密度流。说白了,就是用脉冲的密度来表示模拟信号的幅度。
PDM只有两根线:
- CLK:由主控提供,通常是1~4 MHz。
- DATA:1bit数据流,每个CLK周期输出一个bit。
PDM麦克风内部自带Σ-Δ调制器,输出的是过采样后的1bit流。主控端需要做抽取滤波(Decimation Filter)才能得到标准的PCM数据。
关键点:PDM接口的CLK频率决定了信噪比。CLK越高,噪声整形效果越好。但CLK太高,主控的GPIO可能扛不住。我一般选2.4 MHz或3.072 MHz,这是比较折中的值。
4.5 时序匹配:最容易翻车的地方
接口协议选对了,时序匹配才是真正的考验。我总结了几条铁律:
- BCLK极性:I2S标准是BCLK下降沿采样数据。但有些Codec用上升沿。必须一致。
- LRCK延迟:I2S标准是LRCK变化后,下一个BCLK才开始传数据。但有些Codec要求LRCK变化前数据就准备好。
- MCLK与BCLK的比率:常见比率是256、384、512。如果主控给不了精确的MCLK,Codec内部的PLL会失锁,产生爆音。
- 时隙对齐:TDM模式下,时隙0是从LRCK边沿后的第几个BCLK开始?这个偏移量必须和Codec的寄存器配置一致。
我曾经在一个项目里,主控和Codec的BCLK极性反了。示波器上看波形完全正常,但就是没声音。折腾了两天才发现是极性配置位写反了。从那以后,我每次调接口都先看数据手册的时序图,再对着示波器一根一根线确认。
调试技巧:用示波器同时抓BCLK、LRCK和SDATA。看LRCK边沿和SDATA第一个bit之间的延迟。如果延迟是半个BCLK周期,那就是I2S标准模式。如果是一个BCLK周期,那就是左对齐模式。
4.6 四种接口的选型对比
| 接口 | 通道数 | 典型应用 | 线数 | 主控要求 |
|---|---|---|---|---|
| I2S | 2(立体声) | 耳机Codec、DAC | 3~4 | 低 |
| TDM | 2~16 | 阵列麦克风、多声道音箱 | 3~4 | 高(需支持多时隙) |
| PCM | 1~8 | 通信语音、VoIP | 3 | 中 |
| PDM | 1~8(需抽取滤波) | 数字麦克风 | 2 | 中(需软件滤波) |
我个人习惯:如果通道数不超过2,用I2S最省事。超过2通道,优先考虑TDM。如果主控的I2S/TDM接口不够用,再考虑PDM麦克风加外部抽取滤波器。
4.7 接口协议知识图谱
下面这张图帮你理清四种接口的关系和适用场景:
4.8 避坑指南:我踩过的那些雷
最后分享几个实战中容易忽略的点:
- MCLK抖动:有些主控的MCLK是从PLL分频出来的,抖动很大。Codec内部的Σ-Δ调制器对时钟抖动敏感,会导致噪声恶化。我建议加一个专用的时钟缓冲器。
- 电平匹配:1.8V的Codec接3.3V的主控,不经过电平转换直接连。我烧过一块Codec,就是因为IO电压不匹配。
- PDM的CLK走线:PDM的CLK频率高,走线长了会反射。我一般控制在5cm以内,超过10cm就得加串联电阻。
- TDM的空时隙:有些Codec要求所有时隙都必须有数据,不能留空。如果主控只用了4通道,但Codec配置成8时隙,空时隙要填充0,否则会出噪声。
嗯,接口协议这块内容不少,但核心就一句话:先看时序图,再对示波器,最后写代码。顺序搞反了,调试时间翻倍。