3、PCM与TDM接口:从单声道到多通道的音频传输之路

各位工程师朋友,今天我们来聊聊音频接口里最基础、也最容易出问题的两个家伙——PCM和TDM。说实话,我见过不少硬件工程师,I2S玩得贼溜,但一碰到TDM就懵了。其实没那么玄乎,咱们一步步拆开看。

3.1 PCM接口特点与帧结构

PCM,全称Pulse Code Modulation,脉冲编码调制。说白了,就是把模拟音频信号变成一串串0和1的数字流。咱们平时说的I2S,其实就是PCM的一种具体实现方式。

一个标准的PCM帧结构长什么样?我画个图你就明白了。

PCM帧结构示意图 一个帧周期(Frame Period) 左声道数据(Left Channel) 右声道数据(Right Channel) 位时钟(BCLK)— 每个脉冲对应一个数据位 帧同步(LRCLK/FSYNC)— 高电平左声道,低电平右声道 常见配置:16位/声道,48kHz采样率,BCLK = 48k × 32 × 2 = 3.072MHz

你看,一个帧周期里,左声道和右声道的数据是交替出现的。帧同步信号(LRCLK)负责告诉接收端:现在传的是左声道还是右声道。我个人习惯把LRCLK叫做「声道选择信号」,这样更好理解。

关键参数速查:

  • 采样率(Fs):每秒采集多少个音频样本,常见48kHz、96kHz
  • 位深(Bit Depth):每个样本用多少位表示,常见16bit、24bit、32bit
  • BCLK频率 = Fs × 位深 × 声道数 × 2(如果每个声道占一个BCLK周期)
  • MCLK:主时钟,通常是BCLK的整数倍,用于内部PLL锁相

3.2 TDM多通道音频传输原理

好,PCM搞明白了,那TDM是什么?TDM就是时分复用(Time Division Multiplexing)。你想想看,如果我要传8个声道的数据,用I2S得拉4根数据线,多麻烦。TDM就聪明了——它把多个声道的数据塞进同一根数据线里,按时间片轮流传输。

我在一个车载音频项目里就遇到过这问题。客户要求支持8个声道,板子空间又紧张。用TDM一根数据线搞定,省了3根线,走线轻松多了。

TDM的帧结构长这样:

TDM帧结构示意图(4声道示例) 一个TDM帧周期 Slot 0
声道1 Slot 1
声道2
Slot 2
声道3
Slot 3
声道4
帧同步(FSYNC)— 每个帧周期开始处产生一个脉冲 每个时隙(Slot)可以配置为8/16/24/32位,时隙数由声道数决定

TDM的核心思想就是:一个帧周期内,按顺序给每个声道分配一个固定的时隙(Slot)。接收端根据时隙编号来识别数据属于哪个声道。

我的经验之谈:

配置TDM时,最容易踩的坑是时隙对齐方式。有些Codec要求数据在BCLK的上升沿采样,有些要求下降沿。我曾经因为没仔细看数据手册,把TDM的时隙偏移配错了半个BCLK周期,结果声道3和声道4的数据串了。排查了整整两天才发现问题。

3.3 TDM与I2S的异同点

很多新手会问:TDM和I2S到底啥关系?我打个比方你就懂了:I2S是TDM的一个特例,就像轿车是汽车的一个特例一样。

咱们用表格对比一下:

对比项 I2S TDM
声道数 固定2声道(左+右) 可配置,2/4/6/8/16声道等
帧同步信号 LRCLK,50%占空比,高左低右 FSYNC,脉冲信号,每个帧周期开始处触发
数据线数量 1根(SDATA) 1根(SDATA),但可扩展多根
时隙分配 固定:左声道在前,右声道在后 可编程:每个时隙可独立配置
典型应用 立体声音频、耳机、麦克风 多声道音响、车载音频、专业音频设备
BCLK频率 Fs × 位深 × 2 Fs × 位深 × 声道数

说白了,I2S就是TDM的一种简化版本。I2S的帧同步信号(LRCLK)在左声道期间保持高电平,右声道期间保持低电平。而TDM的帧同步信号(FSYNC)只是一个短脉冲,告诉接收端「新的一帧开始了」,剩下的靠时隙编号来区分。

⚠️ 重要提醒:

有些Codec支持「TDM模式下的I2S兼容模式」。说白了就是把TDM配置成2个时隙,帧同步信号改成50%占空比。但我不建议你这么干——容易把自己搞晕。老老实实按数据手册推荐的配置来,别玩花活。

3.4 实际项目中的选型建议

好,理论讲完了,咱们聊聊实际怎么选。

什么时候用I2S?

  • 只有2个声道(立体声)
  • 主控芯片的I2S外设资源有限
  • 对BCLK频率敏感,想降低EMI
  • 兼容性要求高,I2S是业界最通用的接口

什么时候用TDM?

  • 需要4个或更多声道
  • 板子空间紧张,想减少走线
  • 需要灵活配置时隙(比如某些声道用16bit,某些用24bit)
  • 主控芯片支持TDM模式

我记得有个项目,客户非要在一根I2S总线上挂4个立体声Codec。我劝他用TDM,他不听。结果呢?4个Codec的片选信号占用了4个GPIO,数据线还得用MUX切换,板子画得跟蜘蛛网似的。后来改TDM,一根数据线搞定,片选都省了。

避坑指南:

  • 时隙对齐:确认Codec的时隙0是从FSYNC之后第几个BCLK开始
  • 数据格式:确认是左对齐还是右对齐,I2S标准是左对齐
  • BCLK极性:确认数据在上升沿还是下降沿采样
  • 帧同步极性:确认FSYNC是高电平有效还是低电平有效
  • 时隙宽度:确认每个时隙占用多少位,不足的位要补0

嗯,PCM和TDM这块儿,说白了就是「一根数据线,多个声道轮流用」。搞懂了帧结构和时隙分配,剩下的就是对着数据手册配寄存器了。别怕,多试几次就熟了。