初级会员

- 积分
- 190
- 金钱
- 190
- 注册时间
- 2014-8-15
- 在线时间
- 47 小时
|
发表于 2016-12-20 16:22:08
|
显示全部楼层
请问原子哥,我在调试VS1003的时候使用SPI已经调试成功了。但是我需要显示歌曲信息。这样就导致了有的时候放码率高的歌曲就会出现卡段的现象。所以想用SPI的DMA发送数据到VS1003提高速度,下面是我播放的MP3歌曲的代码,修改了下,但是没有调试成功。麻烦帮我看看,问题出在哪里呢。
[mw_shl_code=c,true]
[mw_shl_code=c,true]/播放一曲指定的歌曲
//返回值:0,正常播放完成
// 1,下一曲
// 2,上一曲
// 0XFF,出现错误了
//播放音乐
u8 mp3_play_song(u8 *pname,u8 *fn)
{
FIL* fmp3;
u16 br;
u8 res,rval;
u16 i=0;
u8 key,j=0;
u8 pause_Flag=0;
rval=0;
fmp3=(FIL*)mymalloc(SRAMIN,sizeof(FIL));//申请内存
if(fmp3==NULL) rval=0xFF;//内存申请失败
if(rval==0)
{
VS_Soft_Reset(); //软复位
VS_Set_All(); //设置音量等信息
VS_Reset_DecodeTime(); //复位解码时间
res=f_open(fmp3,(const TCHAR*)pname,FA_READ);//打开文件
if(res==0) //打开成功
{
VS_SPI_SpeedHigh(); //高速
while(rval==0) //读出512个字节
{ //btr是用户要读的数据量,br是实际读取的数据量
res=f_read(fmp3,mp3_buf,512,(UINT*)&br); //这样当判断到br==0时,文件读完
i=0;
do
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC3)!=RESET) //等待通道3传输完成
{
VS_XDCS=1; //完成一次传输
DMA_ClearFlag(DMA1_FLAG_TC3); //清除通道3传输完成标志
DMA1_Channel3->CMAR =(u32)(mp3_buf+i); //重新赋予一次数据地址开启一次DMA传输
if(VS_DQ!=0)
{
VS_XDCS=0;
printf("传输一组数据..\n");
SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE); //启动一次DMA传输
DMA_Enable(DMA1_Channel3); //使能DMA传输
i+=32;
}
}
else
{
key=KEY_Scan(0);//不支持连按0
switch(key)
{
case KEY0_PRES:
SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE); //启动一次DMA传输
DMA_Enable(DMA1_Channel3); //使能DMA传输
break;
}
}
}while(i<512);
if(br!=512||res!=0)
{
printf("读完了..\n");
rval=0;
break; //读完了
}
}
f_close(fmp3);
}else rval=0xFF;//出现错误
}
myfree(SRAMIN,fmp3);
return rval;
}[/mw_shl_code][/mw_shl_code]
|
|