第三章 数字音频接口:I2S、TDM、PDM协议详解与时序配置

各位工程师朋友,咱们今天聊聊数字音频接口。说实话,这可能是平板音频系统里最容易出问题的地方。我见过不少项目,模拟前端设计得漂漂亮亮,结果数字接口时序没调好,出来的声音全是杂音。嗯,咱们今天就把它彻底讲透。

3.1 I2S协议:最经典的音频总线

I2S,全称是Inter-IC Sound,飞利浦公司在80年代搞出来的。到现在三十多年了,依然是音频设备间传输数据的主流方式。我个人习惯把它叫做「数字音频的RS232」——简单、可靠、到处都在用。

I2S总线只有三条线:

  • BCLK(位时钟):也叫SCK,每个脉冲对应一个数据位
  • LRCK(左右声道时钟):也叫WS,高电平左声道,低电平右声道
  • SDATA(数据线):串行传输音频数据

你想想看,就这么三根线,就能搞定立体声传输。为什么能这么简洁?因为I2S把时钟和数据分开走了,不像SPI那样还要片选信号。

关键时序参数:

参数说明典型值
BCLK频率采样率 × 位宽 × 通道数48kHz×32bit×2ch = 3.072MHz
LRCK频率等于采样率48kHz
数据延迟SDATA相对BCLK的建立/保持时间≥10ns
时钟占空比BCLK高电平时间占比45%~55%

这里有个坑,我必须要说。I2S标准规定数据在BCLK的下降沿变化,在上升沿采样。但有些便宜的CODEC芯片偏偏反着来。我曾经在一个项目里,用了某国产CODEC,手册上写的是「兼容I2S」,结果实际是左对齐格式。嗯,那次调试花了我整整两天。

3.2 TDM协议:多通道音频的救星

平板设备现在动不动就4个麦克风、2个扬声器,再加上回采通道。如果用I2S,你得用好几个接口。这时候TDM就派上用场了。

TDM,时分复用。说白了就是在一根数据线上,按时间片轮流传输多个通道的数据。结构上跟I2S很像,但LRCK变成了帧同步信号(FSYNC),一个帧周期内可以塞8个、16个甚至32个通道。

我的经验:在平板项目中,我通常把TDM配置成8通道模式。4个麦克风占用4个slot,立体声回采占用2个slot,剩下2个slot留着做回声参考。这样一根总线就搞定了所有音频数据采集。

TDM的时序比I2S复杂一些,主要多了个slot对齐的问题:

  • FSYNC宽度:可以是1个BCLK周期,也可以是半个帧周期
  • Slot大小:通常等于位宽,32bit slot最常用
  • 数据对齐:第一个slot从FSYNC有效后第几个BCLK开始
// TDM 8通道配置示例(STM32H7系列)
// 8通道,32bit slot,48kHz采样率
hi2s.Instance = SPI2;
hi2s.Init.Mode = I2S_MODE_MASTER_TX;
hi2s.Init.Standard = I2S_STANDARD_PHILIPS;
hi2s.Init.DataFormat = I2S_DATAFORMAT_32B;
hi2s.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
hi2s.Init.AudioFreq = I2S_AUDIOFREQ_48K;
hi2s.Init.CPOL = I2S_CPOL_LOW;
// 关键:使能TDM模式,配置slot
HAL_I2SEx_TDMConfig(&hi2s, &tdm_config, I2S_TDM_ENABLE);

警告:TDM模式下,BCLK频率会非常高。8通道32bit 48kHz,BCLK = 48k × 32 × 8 = 12.288MHz。PCB走线如果超过5cm,建议加串联电阻匹配阻抗,否则信号反射会让你怀疑人生。

3.3 PDM接口:数字麦克风的标配

PDM,脉冲密度调制。现在平板上的MEMS麦克风,十有八九都是PDM输出。为什么?因为PDM只需要两根线:CLK和DATA,而且抗干扰能力比模拟输出强太多了。

PDM的原理很有意思。它不是直接输出音频幅值,而是输出一串密集的脉冲。脉冲密度越高,代表信号幅值越大。你可以把它理解成1bit的Σ-Δ调制器输出。

时序上要注意:

  • CLK频率:通常是采样率的64倍。48kHz采样对应3.072MHz时钟
  • 数据输出:一般在CLK的上升沿或下降沿输出,取决于具体芯片
  • 左右声道:立体声PDM麦克风,左声道在CLK高电平时输出,右声道在低电平时输出

PDM vs I2S 对比:

特性PDMI2S
线数2根(CLK+DATA)3根(BCLK+LRCK+SDATA)
数据格式1bit脉冲密度多bit PCM
抗干扰强(数字信号)中等
后处理需要抽取滤波器直接使用
典型应用MEMS麦克风CODEC、DSP互联

我记得有一次,客户反馈平板录音有周期性噪声。查了半天,发现是PDM时钟线跟I2S的BCLK靠太近,串扰了。后来把PDM时钟从3.072MHz改成2.048MHz(48kHz的42.67倍),问题就解决了。所以PDM时钟不一定要用64倍频,只要后端的抽取滤波器能处理就行。

3.4 主从模式配置:谁说了算?

数字音频接口的主从配置,说白了就是谁产生时钟的问题。主设备产生BCLK和LRCK,从设备被动接收。这个选择直接影响系统设计的复杂度。

主模式:

  • 音频CODEC或DSP作为时钟源
  • CPU作为从设备接收数据
  • 优点:时钟抖动小,适合高保真应用
  • 缺点:CPU需要支持从模式,且时钟频率固定

从模式:

  • CPU产生时钟,CODEC被动接收
  • 优点:时钟频率可灵活调整,方便多设备同步
  • 缺点:CPU的时钟质量直接影响音频性能

我的建议:平板设备里,我一般让CPU做主设备。原因很简单——平板里CPU的时钟源通常是高精度晶振,而且可以动态调整频率来省电。CODEC做主设备的话,还得额外给它配晶振,占PCB面积不说,还多了一颗物料成本。

配置主从模式时,有几个容易忽略的点:

  1. 时钟极性要匹配:主设备的CPOL必须跟从设备一致,否则数据采样会错位
  2. MCLK要不要用:有些CODEC需要主时钟MCLK,通常是BCLK的整数倍。如果CPU不支持输出MCLK,就得选内部PLL模式的CODEC
  3. 上电时序:从设备必须在主设备输出时钟之后才能初始化。我曾经遇到过CODEC先上电,CPU后输出时钟,结果CODEC检测不到时钟直接罢工了
// 主模式配置(CPU作为I2S主设备)
// BCLK = 3.072MHz, LRCK = 48kHz
I2S->CR1 |= I2S_CR1_MODE_MASTER;  // 设置为主模式
I2S->CR1 |= I2S_CR1_CKEN;         // 使能时钟输出
I2S->PR = (SYSCLK / (3.072MHz * 2)) - 1;  // 设置分频系数

// 从模式配置(CPU作为I2S从设备)
I2S->CR1 &= ~I2S_CR1_MODE_MASTER; // 清除主模式位
I2S->CR1 |= I2S_CR1_MODE_SLAVE;   // 设置为从模式
// 注意:从模式下不需要配置分频器

避坑指南:我曾经在一个项目里,CPU做主设备输出48kHz,CODEC从模式接收。结果发现CODEC输出的音频有周期性「咔咔」声。查了三天,最后用示波器一看——CPU输出的LRCK占空比是40%,而CODEC要求45%~55%。CPU的I2S外设时钟分频器算出来不是整数,导致占空比偏差。后来换了PLL输出,问题解决。

好了,数字音频接口这块就聊到这儿。I2S是基础,TDM解决多通道问题,PDM搞定数字麦克风。主从配置选对了,能省掉一半的调试时间。下一章咱们聊聊PCB布局和电源设计,那才是真正考验功力的地方。