【疑问】利用VS1003B、CH375B模块制作基于51单片机的MP3

2019-07-15 09:23发布

     最近在用51单片机制作一个MP3,功能是从U盘读取文件数据,将数据送给VS1003模块进行音频解码,最后DA转化由耳机播放。     目前我的进展是:
     1.利用CH375B芯片的开源文件操作子函数库 (ch375fileopen()等)可以将U盘中指定名称的文件中的指定长度的字节读取出来。
     2.使用Winhex将MP3文件转化为C语言数组形式,利用VS1003模块将其成功播放(MP3文件形式如图举例)
WechatIMG46.jpeg

     (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。如图
WechatIMG47.jpeg
     但结果并不理想,通过串口助手观察,单片机在不断地从文件中读取数据,但VS1003B并没有反应。

     2.将MP3直接存入U盘,再利用CH375传给VS1003B,这种做法完全是死马当活马医,非常可笑。最后串口助手中读取的数据都全是乱码。

     最后将我的问题拆分一下,以方便前辈们解答,如果前辈能勉强看懂我上面的问题,也可以直接按照自己的思路解答:
     问题1:U盘中存储MP3文件的类型?我应该将MP3文件转换为什么格式的文档才能方便CH375正常读取,并完美的传输给VS1003模块,即能使VS1003模块识别?
     问题2:在上面的测试程序中,VS1003放到模拟SPI上的数据是以8位的字节作为元素的数组。难道想要让VS1003识别音频数据,接收数据的类型只能是这样的数组吗?








友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
wangling123
2019-07-16 09:54
zy979228369 发表于 2017-12-13 13:09
楼主有解决这个问题吗?目前正准备做单片机课程设计

问题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次,我用的是后者)

一周热门 更多>