当前位置:首页 > 工业控制 > 电路设计项目集锦
[导读]如果你想将完整的专辑、长语音提示或背景音乐存储在 SD 卡中,MP3 是标准选择。然而,I2S 数字音频放大器无法自行解码 MP3 文件,它只能理解原始的数字音频样本(PCM)。

在嵌入式开发板上播放未压缩的 WAV 文件很简单,但文件大小会迅速累积。一分钟的 CD 音质音频大约占用 10.5 MB 的存储空间。

如果你想将完整的专辑、长语音提示或背景音乐存储在 SD 卡中,MP3 是标准选择。然而,I2S 数字音频放大器无法自行解码 MP3 文件,它只能理解原始的数字音频样本(PCM)。

下面我展示了如何使用 MicroPython,在 W55MH32L-EVB 开发板上实时构建一个 MP3 播放管道,通过 I2S 总线直接从 SD 卡流式传输压缩音频轨道。

什么是 I2S?

I2S 是 Inter-IC Sound 的缩写(不要与 I2C 混淆)。I2C 是专为低速传感器设计的通用总线,而 I2S 则专门用于在芯片之间传输脉冲编码调制(PCM)数字音频。

普通电线采集的模拟音频信号容易吸收微控制器电源轨和处理器开关产生的电磁噪声。通过将信号在放大器阶段保持为数字信号,I2S可避免背景的嘶嘶声和嗡嗡声。

I2S总线使用三条主要线路:

•BCLK(位时钟/SCK):用于同步传输过线路上的每个单独比特。

•LRC(左/右时钟/WS/字选择):指示接收端接收到的比特属于左声道还是右声道。它在采样率下每帧音频切换一次(例如CD质量为每秒44,100次)。

•DIN(数据输入/SD):表示音频振幅采样值的一串1和0的串行流。

I2S放大器的工作原理

此处使用的模块是一个紧凑型数字放大器扩展板(如MAX98357A)。

该模块无需额外的DAC(数模转换器)芯片,再连接一个模拟运算放大器,而是将两者集成在一起:

- 通过I2S从微控制器读取数字比特;

- 内置DAC将这些比特解码为音频振幅;

- 内部Class-D开关电源驱动连接的扬声器,最大输出功率可达3.2W;

- 支持8 kHz至96 kHz的采样率,并能平稳处理16位音频。

连接至W55MH32L-EVB的接线方式:

•VIN → 5V(或3.3V)

•GND → GND

•BCLK → PB3

•LRC -> PA15

•DIN -> PB5

代码的工作原理

1. 移除元数据标签(skip_id3)

大多数商业MP3文件都以包含歌曲元数据(如艺术家、专辑封面、标题)的ID3v2标签开头。

ID3标签通过4字节的7位同步安全整数(size_bytes)来编码其有效载荷长度。该函数可重建总头部大小,并直接将文件指针移动到第一个原始音频帧,从而避免启动时出现明显的嗡鸣声或解码器崩溃。

2. 滑动缓冲机制(refill_buffer)

MP3帧长度不一,很少与标准的4096字节SD卡读取边界对齐。一个音频帧可能从一次读取的末尾开始,到下一次读取中结束。

•前一次解码通过留下的字节会被移动到in_buffer的前面。

•f.readinto()仅读取填充剩余数组所需的数据量。

•使用内存视图切片可避免在播放循环内分配新的堆对象。

3. 自动格式检测

脚本在设置I2S外设之前,会先解码一帧数据,而不是硬编码采样率和声道:

流中的MP3头文件会报告文件是单声道还是立体声,以及采样时钟是32 kHz、44.1 kHz还是48 kHz。脚本将自动配置硬件时钟以匹配这些参数。

4. 连续解码与DMA传输

在主循环中,解码和硬件传输同步进行:

•dec.decode() 将压缩帧转换为 pcm_data 中的 16 位 PCM 样本。

•i2s.write() 将这些样本加载到内部 8 字节或 192 字节的环形缓冲区(I2S_IBUF_SIZE)中。

•直接内存访问(DMA)在后台将样本传输到放大器引脚,同时 CPU 可继续处理下一帧的解压。

•每 20 帧调用一次 gc.collect(),可保持内存清洁,而不会中断音频流。

5. 安全的外设清理

停止播放或按下 Ctrl+C 会触发 finally 块。调用 deinit() 可以干净地关闭硬件时钟线,释放 DMA 频道,并消除扬声器持续存在的背景嗡鸣声。

结论

从零开始构建一个嵌入式MP3播放器,充分展示了现代微控制器在高效软件与专用硬件结合时所能实现的强大功能。通过将无损WAV文件转换为实时MP3解码,有效解决了SD卡的存储瓶颈;同时,将重负的音频处理任务交给I2S放大器完成,使声音更加饱满、清晰,且避免了典型的模拟噪声。

借助动态格式检测、双缓冲DMA流传输以及硬件中断控制,W55MH32L-EVB能够无缝处理整个数据流流程。接下来,你还可以轻松地将此系统扩展为独立的便携式音箱:只需加装I2C OLED显示屏以显示曲目名称,连接旋转编码器调节音量,或利用电路板内置的以太网接口,流媒体播放网络电台。

本文编译自hackster.io

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭