原创 VS1003播放音乐成功

2009-10-27 17:00 10322 7 24 分类: MCU/ 嵌入式

玩MP3播放,之前已经实现了VS1003的正弦波测试,从耳机可以听到一定频率的声音了。之后开始写程序,希望从MMC/SD卡读取文件发送到VS1003播放。我的板子上MMC卡和VS1003都接在同一个硬件SPI接口上,靠不同的片选控制。程序的思路就是单片机从MMC卡读取一个扇区(512字节)的音频文件暂存在SRAM中,然后再依次将其发送到VS1003的串行数据口(SDI),循环以上过程从而实现音频文件的播放。原理还是很简单的,但是编出来的程序却不能播放声音出来,通过串口输出的调试信息看到有数据传送,可就是不响。经过仔细检查程序发现是引用的一个函数的变量类型指定错了(应该为unsigned int,写成了unsigned char)。排除这个错误后再实验,更新程序,上电运行,初始化MMC卡和VS1003,发命令开始播放文件,从耳机里传来了久违的音乐声。当时还是很激动的,毕竟从能出声(正弦波)到能放音乐之间花费的时间太久了。
能播放MP3之后又试了WMA,也是没有问题的。接下来的就是选不同的MP3文件进行码率测试了。最初,程序能流畅播放8,16,24,32,48,64kbps文件,再往上就会卡,估计是文件传送的速度不够快,开始优化程序。首先把SPI的时钟调到8Mhz,再实验,感觉好了点,但改善不大。问题出在哪呢?回过头来再看程序,读MMC卡的函数里我使用了循环,循环512次每次读一个字节,这样完成一个block的读取,发送数据到VS1003的函数也是如此。这样写程序层次感很好,但感觉循环的开销太大了(因为是512次循环,变量还必须用int型的)。于是改程序,在读扇区函数里每次循环读8字节数据,只需循环64次了,VS1003函数也同样修改。这样再试验,板子已经可以流畅播放128kbps的MP3,峰值数据传输率达到140k。有了这次的成功,我继续对程序优化,再次修改MMC_read(),每次循环读64字节数据,循环8次。VS1003_write()中每次循环读32字节数据,循环16次(数据手册说VS1003在芯片空闲时,至少能接收32字节数据,再多就需要查询DREQ引脚状态再判断)。这回提升的效果也很让人振奋,播放160k码率文件很流畅,换用高码率文件测试峰值数据传输速率172kbps。优化程序的成就感还是很大的:)
之后又对SPI中断函数动了手术,去掉了关中断和开中断的语句(因为我的中断函数中执行的语句就2条),尽量压缩处理时间。另外在SPI发送数据后有一个等待发送完成的检测环节,必须等SPI发送完毕才可以进行下一次发送,经过分析后,我发现这个检测可以去掉,因为我的SPI时钟已经达到8M,CPU工作在33M,STC宏晶的数据手册上显示一条指令大都在2-3个时钟周期内才可以完成,再加上每次SPI发送后我都需要移动指针(又是一条指令),而这时SPI发送早已完成。因此可以不必检测,直接再次发送数据。按照这个思路修改程序后,我的板子解码速度已经达到272kbps了,后来又做了些小的修改最高解码速率稳定在280kbps。至此,除了320k CBR编码的MP3播放有点卡以外,其他各种音频文件已没有任何问题(当然得是VS1003支持的格式:))。
在这个程序的开发过程中,我深深地感到仔细很重要,另外,有时候可以突破陈规大胆尝试(去掉SPI发送完毕检测就是一例)。现在模式只能顺序播放MMC卡中指定区域的数据,下一步我准备移植FAT文件系统到MCU上,这样就可以按文件播放了。希望我的经历对同样在用STC单片机,VS1003的朋友有所益处。


STC12+VS1003播放MP3程序开发历程
控制VS1003成功-〉播放正弦波-〉播放MP3成功-〉性能提高-〉64kbps-〉112kbps-〉140kbps-〉172kbps-〉272kbps-〉280kbps

PARTNER CONTENT

文章评论17条评论)

登录后参与讨论

用户426391 2012-8-24 11:39

您好!我也在做这个,用的是VS1003芯片,单片机用的是STM32F103RCT6系ARM单片机。我已经做到可以以数组形式发送数据给VS1003,并且播放正常。但是当我从SD读数据再发给VS1003时就不行了。用串口能监测到有数据发出,但VS1003就是不能解码发声。能帮帮我吗? 谢谢!

用户595705 2012-2-18 16:47

好东西啊

用户412121 2011-9-27 14:17

没有什么不方便的。使用的都是能够找到资料的硬件,比如MCU我用的是STC12LE5A60S2,MP3解码芯片是VS1003B等等。这些资料网上多的很。

用户381683 2011-9-23 22:18

楼主放不方便透漏一下所使用的相关硬件资料,我qq77234606,打扰了

用户1588142 2011-9-9 00:51

mark!

用户412121 2011-6-9 10:56

想问什么,直接说吧。

用户1605777 2011-6-8 12:20

高手QQ是多少 我想向您请教 关于MP3文件的码率

用户412121 2009-11-27 19:08

还是你自己解决的问题:) 这样进步最快了

用户230614 2009-11-27 09:36

首先 谢谢你的回复,其次我要说的是 我的问题找出来了 是我的vs1003的RX跟TEST没有接到IOVDD 我用的是spi传送 RX必须接IOVDD 这样数据请求标志DREQ就没有用 再次谢谢你

用户412121 2009-11-26 21:49

让VS1003播放音乐大致的流程是这样,上电后用MCU或其他设备初始化VS1003,设置好它的寄存器;检测VS1003解码器是否忙(DREQ引脚是否为低),如果不为低就向SDI接口发送要播放的音乐文件数据。不知这几步你都严格遵守了没有? 看你的描述,低码率的文件都卡,有可能出在从存储器读取文件这部分的速度慢跟不上。因为VS1003播放MP3是一个连续的过程,所以务必做到数据流的连续传输,只有数据供应充足,解码器才能源源不断的解码输出音频信号。你在这方面多看看,是不是这里有问题。
相关推荐阅读
用户412121 2015-09-11 09:59
我今年的作品:智能家居物联网实验板(STM32+ESP8266)
去年就开始关注物联网和智能家居了。一开始看到不少用路由器方案做的智能插座,感觉太浪费芯片资源了。直到有一天无意中看到了ESP8266,感觉这是一个适合单片机的wifi解决方案,应该可以做不少好玩的...
用户412121 2013-10-29 11:41
STM32迷你核心板运行ST emWin + FreeRTOS成功
新板子做好后受到了很多人的关注, 比如板上有哪些资源,有哪些例程等等。有的人还会问是否能外接LCD等等,对于我这些,我的板子都预留了接口肯定是没有问题的。但是口说无凭还是实实在在 的测一次才能令人信服...
用户412121 2013-10-15 14:11
新版STM32迷你核心板做好了
之前也跟大家多多少少介绍过了,这次做的新版就是对前一版不满意地方的小修补(比如印字,焊盘尺寸等等),另外对外扩IO做了微调,可以保证F407的每 种外设都可以扩展(之前是按照F103设计的兼容407但...
用户412121 2013-09-22 22:58
在STM32上运行FreeRTOS操作系统(基于STM32 V3.5.0固件库)
很久以前就想实用FreeRTOS了,优点就不必说了,网上可以搜到一大堆它和ucos-ii以及其他几种嵌入式操作系统的比较。最重要的一点它是免费的,不想ucos那样商业使用需要收费。只是之前本人比较忙而...
用户412121 2013-08-13 11:00
华美A5无线3G路由器升级内存,flash,刷openwrt成功
Hame A5(华美A5)号称最小的3G无线路由器,可惜只有16M SDRAM, 4M FLASH虽然理论上可以刷openwrt,但是限于硬件资源太少运行起来很卡,到最后几乎死机。 于是我尝试给...
用户412121 2013-05-08 17:29
我的STM32核心板升级到F4了(目前可以运行u-boot)
年初做的这个可以跑uCLinux的STM32核心板用的是STM32F103ZET6(http://bbs.ednchina.com/BLOG_ARTICLE_3010701.HTM),当时已经考虑...
EE直播间
更多
我要评论
17
7
关闭 站长推荐上一条 /3 下一条