|
发表于 2011-10-28 20:53:53
|
显示全部楼层
vs1003解码MP3数据,你只要把MP3数据送给它,它就能自动识别MP3码率,然后按照这个解码速率进行解码。vs1003有0.5k的数据RAM做为音频数据的缓冲,为了确定数据缓冲区里是否有数据,芯片设定了一个中断脚DREQ,当DREQ变高时,外部可以至少向vs1003发送 32字节的数据,当vs1003收到32字节的数据之后DREQ脚变为低,如果数据缓冲区内再次少于32字节的数据,那么vs1003又将DREQ置为高电平。之前说数据缓冲区是0.5k,这里又说每次送32个数据,vs1003只是设置了一个32byte为标准,你可以当在检测到DREQ脚变高时,往里边一次性发送少于0.5k的字节(这个我没验证,有网友说可以,但是一次送32字节肯定没错,这是官方的说法),然后再去检测DREQ的状态。
所以程序中可以这样写(可以定义#define DREQ P2.0,keyup,keydown分别对应上一首和下一首按键,在中断里面改变)
while(true){
while(DREQ )
{
send_to_vs1003(32);
//这里可以检查单片机内部缓冲区是否空,如果是则在这里去读SD卡或者U盘上的文件到缓冲区,如果不用内部缓冲区就可以省了这一步,你用的STC12C5A60S2单片机,内部RAM应该够用了吧!
}
if(keyup)//上一首按键按下
{
keyup=0;
sd_read_prev();
}
if(keydown)//下一首按键按下
{
keydown=0;
sd_read_next();
}
}
其中send_to_vs1003是从单片机的数据缓冲区读取数据到vs1003,而sd_read_next,sd_read_prev则是从外部存储器(U盘,SD卡)读取下一首(上一首)歌曲数据数据到单片机的内部缓冲区,如果单片机内部没有足够的RAM来做缓冲区(一般大小为一个扇区512字节)则send_to_vs1003可以直接从U盘,SD卡读取到vs1003,而sd_read_prev,sd_read_next则只是打开对应的文件。
修改:特别注意keyup,keydown定义为全局变量,必须加上volatile修饰,否则默认优化级别都可能会出问题,原因你懂的! |
|