stm32驱动VS1003占用时间长

2019-08-17 08:38发布

找过好多个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出来后再实验.




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。