第1章:PCM接口概述

各位同学,咱们今天聊聊PCM接口。说实话,这个接口在音频领域太常见了,但很多人对它一知半解。我刚开始做嵌入式音频时,也踩过不少坑。今天就把我这些年积累的经验,一次性讲清楚。

1.1 什么是PCM接口

PCM,全称是Pulse Code Modulation,脉冲编码调制。说白了,就是把模拟声音信号,变成一串数字脉冲。

你想想看,麦克风采集到的是连续变化的电压信号。但芯片只能处理0和1。怎么办?PCM就是干这个的——它每隔一小段时间,给声音信号拍个快照,记录下当时的电压值。这个快照,就叫一个采样点。

我习惯把PCM接口理解成一条数字音频的「高速公路」。它用三根线就能干活:

  • BCLK(位时钟):告诉设备什么时候该传输一个bit
  • LRCK(帧时钟):区分左声道和右声道
  • DATA(数据线):实际传输音频数据

嗯,这里要注意,有些芯片会把LRCK叫做FS(Frame Sync),其实一回事。

核心要点:PCM接口传输的是未经压缩的原始音频数据。采样率、位深、声道数,这三个参数决定了数据量的大小。

1.2 PCM与I2S的区别

很多初学者会问:PCM和I2S到底有啥区别?我当年也困惑过。

其实,I2S是PCM的一种特殊形式。它由飞利浦公司在1986年制定,专门用于数字音频设备之间的互联。我给大家列个表,一看就明白:

对比项 PCM I2S
数据格式 左对齐或右对齐 左对齐,数据在LRCK变化后延迟1位
声道控制 LRCK高/低电平表示左右声道 LRCK高电平=左声道,低电平=右声道
兼容性 更灵活,可自定义 标准化,设备间兼容性好
典型应用 蓝牙音频、数字麦克风 音频编解码器、DAC/ADC

我在项目中遇到过一件事:用某款蓝牙芯片和音频Codec对接,Codec只支持I2S,但蓝牙芯片默认输出的是标准PCM。结果声音全是噪声。后来我加了一个格式转换,才搞定。

避坑指南:我曾经因为没仔细看数据手册,把PCM和I2S的位时钟极性搞反了。调试了整整两天才发现。记住:I2S的数据在BCLK的下降沿变化,上升沿采样。而有些PCM设备正好相反。

1.3 PCM的应用场景

PCM接口的应用范围很广。我挑三个最常见的场景,给大家讲讲。

1.3.1 蓝牙音频

蓝牙耳机、蓝牙音箱,内部都离不开PCM接口。蓝牙芯片接收到数字音频信号后,通过PCM接口传给音频Codec,再转成模拟信号驱动喇叭。

我做过一个蓝牙音箱项目,用的是CSR8670芯片。它和Codec之间就是标准的PCM接口。采样率48kHz,位深16bit,双声道。数据量算一下:48k × 16 × 2 = 1.536Mbps。这个速率对蓝牙来说,完全没问题。

1.3.2 数字麦克风

现在很多手机、智能音箱都用数字麦克风。它内部集成了ADC,直接输出PCM数字信号。好处是抗干扰能力强,布线也简单。

我记得有一次做语音唤醒项目,用了一颗MEMS数字麦克风。它的输出就是PCM格式,直接连到MCU的I2S接口。省掉了模拟麦克风需要的放大器和滤波电路,板子面积小了很多。

小技巧:数字麦克风通常支持多种采样率。我个人习惯用16kHz,因为语音识别算法对这个频率支持最好。而且数据量小,MCU处理起来不费劲。

1.3.3 语音编解码器

语音编解码器,比如常见的VS1053、WM8960,它们和主控芯片之间也是通过PCM接口通信。主控把压缩的音频文件解码后,通过PCM接口把原始数据送给编解码器,由它完成D/A转换。

你想想看,如果不用PCM接口,主控就得自己处理D/A转换,那对MCU的性能要求就高多了。有了PCM接口,主控只管传数据,剩下的交给专用芯片。

小结

这一章咱们讲了PCM接口的基本概念,它和I2S的区别,以及三个典型应用场景。说白了,PCM接口就是数字音频世界的通用语言。不管你是做蓝牙音频、数字麦克风,还是语音编解码器,都绕不开它。

下一章,我会带大家深入PCM的时序细节,看看数据到底是怎么在线上跑的。到时候我会用示波器抓几个波形,给大家现场分析。嗯,敬请期待。