找过好多个VS1003的驱动程序,基本上是要全部发完音频后才有声音播放出来,但是这样的话其它需要驱动的程序会卡死,比如说7段数码管程序等就会停顿住, 增加SPI的速度又不行.
使用的驱动程序如下
void MP3_Play(const u8 *add)
{
FRESULT res;
char j = 0;
u8 add2[17];
f_mount(0, &fs);
memcpy((u8 *)add2,(u8 *)add,17);
res = f_open( &fsrc, (const XCHAR*)add2, FA_OPEN_EXISTING | FA_READ ); /* 以只读方式打开 */
br = 1; // br 为全局变量
/* ------------------- 一曲开始 --------------------*/
while(1)
{
res = f_read( &fsrc, buffer, sizeof(buffer), &br );//SD读取扇区数据
if ( res == FR_OK )//读取成功
{
count = 0;/* 512字节完重新计数 */
delay_ms(10);
do
{ SPI1_SetSpeed(6);//设置SPI的速率为64
if ( p_MP3_DREQ!= 0 ) // //等待数据请求为高
{
p_MP3_XDCS(0);// 选中vs1003数据片选
for (j=0; j<32; j++ ) // VS1003的FIFO只有32个字节的缓冲
{
SPI1_WriteReadByte(buffer[count]);//发送数据
count++;
//return;
}
p_MP3_XDCS(1);// 选中vs1003数据片选
}
}while ( count < 512); // SD卡读取一个sector,一个sector为512字节
}
if (res != FR_OK ) break; // 出错或者到了文件尾
if ( br == 0) break; //出错或者到了文件尾
}
/* ------------------- 一曲结束 --------------------*/
f_close(&fsrc); // 关闭打开的文件
}
有没有什么比较好的方式能避免这个停顿.之后会尝试将VS1003的DREQ引脚用中断,看看效果会不会比较好,在IO口中断中处理发送数据,实验出来后告诉结果.
现在搭的板子有问题,在搞一个PCB.等PCB出来后再实验.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>