VS1003音频解码芯片MP3播放器实现的问题-转载

来自:http://bbs.ednchina.com/BLOG_ARTICLE_276006.HTM

玩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
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值