1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在用51单片机制作一个MP3,功能是从U盘读取文件数据,将数据送给VS1003模块进行音频解码,最后DA转化由耳机播放。 目前我的进展是: 1.利用CH375B芯片的开源文件操作子函数库 (ch375fileopen()等)可以将U盘中指定名称的文件中的指定长度的字节读取出来。 2.使用Winhex将MP3文件转化为C语言数组形式,利用VS1003模块将其成功播放(MP3文件形式如图举例) (VS1003播放模块代码如下) void test_1003_PlayMP3File() { unsigned int data_pointer;unsigned char i; unsigned int uiCount; uiCount = sizeof(MusicData); //MusicData就是MP3文件C语言数组格式下存放数据的数组 data_pointer=0; VS1003B_SoftReset(); //软复位 while(uiCount>0) { if(CheckVS1003B_DRQ()) { for(i=0;i<32;i++) //每次读32个字节 { VS1003B_WriteDAT(MusicData[data_pointer]); data_pointer++; } uiCount -= 32; } } VS1003B_Fill2048Zero(); } 这里我的第一个问题来了:目前我可以实现数组形式的MP3文件播放,如上面代码所写。直接循环读取该数组中的8位字节即可。但注意,我在CH375读写文件模块中读出的数据是按照字符串的形式,或者通俗点说是按照文本的形式读取的。举个例子:在上面VS1003模块使用的C语言数组格式的文件中,第一行是:unsigned AnsiChar data[184]......因此利用CH375子函数CH375fileopen()读出的一系列数据其实并没有任何的编码意义,因为他们虽然仍然是以数组(或指针)的形式读出,但和VS1003的子函数所读的数据(MusicData)相比,他们不再是有意义的音频数据。 因此,我如何能让VS1003识别利用CH375子函数库从U盘读出的数据?网上有很多同样利用这几个模块制作MP3的前辈,他们在描述这一过程的时候都是“一笔带过”。 我做了下面的一些尝试: 1.将MP3转换成16进制数文件存入U盘,再利用CH375直接依次传给VS1003B。如图 但结果并不理想,通过串口助手观察,单片机在不断地从文件中读取数据,但VS1003B并没有反应。 2.将MP3直接存入U盘,再利用CH375传给VS1003B,这种做法完全是死马当活马医,非常可笑。最后串口助手中读取的数据都全是乱码。 最后将我的问题拆分一下,以方便前辈们解答,如果前辈能勉强看懂我上面的问题,也可以直接按照自己的思路解答: 问题1:U盘中存储MP3文件的类型?我应该将MP3文件转换为什么格式的文档才能方便CH375正常读取,并完美的传输给VS1003模块,即能使VS1003模块识别? 问题2:在上面的测试程序中,VS1003放到模拟SPI上的数据是以8位的字节作为元素的数组。难道想要让VS1003识别音频数据,接收数据的类型只能是这样的数组吗? 评分
|
||
相关推荐
8个回答
|
||
|
|
关于VS1003和CH375模块的细节太多了,目前我还在读源码找思路的阶段,能力实在有限,表达的不太清楚。所以还是希望了解这两个模块的前辈能顺藤摸瓜试着回答一下,如果对我的表述有哪些地方不清楚,我一定补充!
|
|
|
|
不会帮顶哈哈哈哈(ಡωಡ)hiahiahia
|
|
|
|
本帖最后由 wangling123 于 2017-11-11 13:55 编辑
问题算是解决了,但仍然有新的问题出现: 首先,将MP3转换成16进制文件直接让CH375读取给VS1003是完全错误的。 举个例子“0x12”对应的数据流是:00010010。如果直接将12依次送进去,最后得到的值依然是:00010010。 这样看好像没有错误,但同样举个例子:”0x1f“,这个16进制数的高8位0001即使可以准确的送给VS1003,但f呢?f将作为一个字符型数据传送出去,很明显其对应的数据流不是1111。 关于第二种方法,将.MP3格式的文件直接传送给VS1003,我在网上找到的资料证明的确就是通过这种方法实现音频播放的。但具体代码上的实现仍然存在问题,我会进一步修改找出问题。 现在至少知道我的第一种做法是完全错误的。我现在的任务就是搞清楚:既然是将.MP3格式的文件直接利用CH375从U盘中传送给VS1003,已知我的CH375读取数据函数是以扇区为单位进行读取的,假设这个扇区的数据我存储在一个缓冲区中,那么VS1003直接一个字节一个字节的从缓冲中读取并放到SPI上面进而进行处理就可以了吗?我总觉得有哪里不对,还是进一步学学网上的源码找出错误吧! |
|
|
|
感谢回复,51单片机的确资源有限,但有了外置的音频模块,替51分担了很大的工作量,我用的是STC12系列的芯片,这块芯片目前是可以满足标准码率播放速度的。 |
|
|
|
谢谢你的信任~直接用解码芯片用单片机控制播放暂停
|
|
|
|
楼主有解决这个问题吗?目前正准备做单片机课程设计
|
|
|
|
问题1:U盘中存储MP3文件的类型?我应该将MP3文件转换为什么格式的文档才能方便CH375正常读取,并完美的传输给VS1003模块,即能使VS1003模块识别? 回答:U盘中存储的文件就是.MP3格式的文件,VS1003模块自带解码功能,不必纠结于将其中的数据转化为什么格式才能正常读取的问题! 只要以扇区为单位循环读取选中的某一个MP3文件即可! 问题2:在上面的测试程序中,VS1003放到模拟SPI上的数据是以8位的字节作为元素的数组。难道想要让VS1003识别音频数据,接收数据的类型只能是这样的数组吗? 回答:问题1已经回答了这个问题,VS1003放到SPI上的数据的确是以字节为单位。这里我再给你回顾一遍MP3中的数据流是怎么传递的: 以扇区为单位通过CH375从U盘中循环读取数据,将每次读出的一个扇区存放在设定的缓存(数组)中,再将该缓存中的数据分多次传给VS1003的SPI上。(至于传给SPI的次数不定,若缓存区设定为512字节,每次传给SPI64字节,则需要循环放8次,32字节则为16次,我用的是后者) |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
852 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
592 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
705 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
926 浏览 2 评论
657 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12005 浏览 31 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 23:47 , Processed in 0.972483 second(s), Total 91, Slave 70 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号