[原创] 双DMA实现I2S播放SD卡中音乐

btvnlue   2012-5-12 17:33 楼主
 本文讨论SD卡作为存储器,I2S播放音频的解决方案

SD卡数据的读取虽然很快,即使在最理想的状态下,播放一秒钟的数据,需要大约%4的时间消耗

8(bit)x2(ch)x2(byte)x48000(hz)/36(MHz)=0.042s

使用单流程模式,这部分损耗是无法忽略的,只能考虑使用DMA模式读取SD卡数据
如果考虑主程序需要承担诸如音量控制,数据监察的功能,I2S也使用DMA模式播放音频

音乐数据的制作
为了简化流程,音乐数据选择完全无编码PCM音频数据格式,将数据直接送往I2S即可播放
I2S设置为16位双声道,每个采样为4字节
可以使用ffmpeg转换mp3或wav及其它音频格式生成纯PCM格式

ffmpeg -i input.mp3 -acodec pcm_s16le -ar 48000 -ac 2 -f s16le output.pcm

在Linux环境中可以使用cat或dd命令写入SD读卡器
文件可以顺序灌入,最后写入'MUSICEND'标识使主程序可实现循环播放控制
结束标识要写入两次为防止跨页

#!/bin/sh

files=""
muend="MUSICEND"
echo -ne "$muend$muend" > music_end

for fff in pcm/*pcm; do
        files="$files $fff"
done
cat $files music_end | dd of=/dev/sde

run_simple_i2s_sd.zip (18.2 KB)
(下载次数: 79, 2012-5-12 17:33 上传)

http://sites.google.com/site/btvnlue/stm32

回复评论 (7)

好帖!!真需要!
点赞  2012-5-12 19:17
不错啊真好
点赞  2012-5-15 14:20

各位同学们,大家好!

为了方便大家的设计,特推荐一款SD卡串口读写模块。
该模块可以通过三线串口,就可以在SD卡上实现文件的创建和读写,很好用。
具体使用方法和说明,可以到以下链接查看。

http://115.com/file/bec5yoeh#串口读写SD卡模块说明书.pdf
http://115.com/file/an037sl3#串口读写SD卡模块视频讲解.rar
本人硬件出生。如有技术问题,欢迎交流。

点赞  2012-5-31 08:29
感谢楼主分享
点赞  2015-7-13 08:27
感想楼主,学习一下,
点赞  2017-2-5 15:41

7楼 px2 

好东西啊,楼主, 要是直接用的HAL库,很牛逼啊,直接操作REG。
点赞  2018-12-22 16:34

8楼 px2 

楼主,有个小问题,这个怎么配置用WS去控制是发的哪个通道的数据呢。还是配置为2通道,16位,然后发了16位数据之后,芯片自动就切换了WS??  刚接触不太懂。
点赞  2018-12-22 16:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复