初级会员

- 积分
- 66
- 金钱
- 66
- 注册时间
- 2014-8-12
- 在线时间
- 4 小时
|
5金钱
近段时间一直在强化自己的能力,但是也只有在下班回来看看网络上的代码,遇到好的例程,我就想通过移植到自己的安富莱开发板做实验,
再看看功能怎么实现。
现在看战舰板的例程,SD卡驱动是SPI方式的,我在网上找了SDIO驱动方式的,可以读取SD卡里面的jpg、bmp图片并且显示出来了,
现在我遇到问题了,就是音乐播放器实验,串口打印出来的数据一直是fn=yyyyyyyy.yyy,res=255 (y上面有两点,一看就知道是乱码)
不知道错在哪里,望哪位大神给指导知道,现贴出mp3_play(void)的代码:
void mp3_play(void)
{
u8 res;
DIR mp3dir; //目录
FILINFO mp3fileinfo;//文件信息
u8 *fn; //长文件名
u8 *pname; //带路径的文件名
u16 totmp3num; //音乐文件总数
u16 curindex; //图片当前索引
u8 key; //键值
u16 temp;
u16 *mp3indextbl; //音乐索引表
while(f_opendir(&mp3dir,"0:/MUSIC"))//打开图片文件夹
{
Show_Str(60,190,240,16,"MUSIC文件夹错误!",16,0);
delay_ms(200);
LCD_Fill(60,190,240,206,WHITE);//清除显示
delay_ms(200);
}
totmp3num=mp3_get_tnum("0:/MUSIC"); //得到总有效文件数
while(totmp3num==NULL)//音乐文件总数为0
{
Show_Str(60,190,240,16,"没有音乐文件!",16,0);
delay_ms(200);
LCD_Fill(60,190,240,146,WHITE);//清除显示
delay_ms(200);
}
mp3fileinfo.lfsize=_MAX_LFN*2+1; //长文件名最大长度
mp3fileinfo.lfname=mymalloc(SRAMIN,mp3fileinfo.lfsize); //为长文件缓存区分配内存
pname=mymalloc(SRAMIN,mp3fileinfo.lfsize); //为带路径的文件名分配内存
mp3indextbl=mymalloc(SRAMIN,2*totmp3num); //申请2*totmp3num个字节的内存,用于存放音乐文件索引
while(mp3fileinfo.lfname==NULL||pname==NULL||mp3indextbl==NULL)//内存分配出错
{
Show_Str(60,190,240,16,"内存分配失败!",16,0);
delay_ms(200);
LCD_Fill(60,190,240,146,WHITE);//清除显示
delay_ms(200);
}
VS_HD_Reset();
VS_Soft_Reset();
vsset.mvol=220; //默认设置音量为220.
mp3_vol_show((vsset.mvol-100)/5); //音量限制在:100~250,显示的时候,按照公式(vol-100)/5,显示,也就是0~30
//记录索引
res=f_opendir(&mp3dir,"0:/MUSIC"); //打开目录
if(res==FR_OK)
{
curindex=0;//当前索引为0
while(1)//全部查询一遍
{
temp=mp3dir.index; //记录当前index
res=f_readdir(&mp3dir,&mp3fileinfo); //读取目录下的一个文件
if(res!=FR_OK||mp3fileinfo.fname[0]==0)break; //错误了/到末尾了,退出
fn=(u8*)(*mp3fileinfo.lfname?mp3fileinfo.lfname:mp3fileinfo.fname);
res=f_typetell(fn);
printf("res=%d,fn=%s\r\n",res,fn);
if((res&0XF0)==0X40)//取高四位,看看是不是音乐文件
{
mp3indextbl[curindex]=temp;//记录索引
curindex++;
}
}
}
curindex=0; //从0开始显示
res=f_opendir(&mp3dir,(const TCHAR*)"0:/MUSIC"); //打开目录
while(res==FR_OK)//打开成功
{
dir_sdi(&mp3dir,mp3indextbl[curindex]); //改变当前目录索引
res=f_readdir(&mp3dir,&mp3fileinfo); //读取目录下的一个文件
if(res!=FR_OK||mp3fileinfo.fname[0]==0)break; //错误了/到末尾了,退出
fn=(u8*)(*mp3fileinfo.lfname?mp3fileinfo.lfname:mp3fileinfo.fname);
strcpy((char*)pname,"0:/MUSIC/"); //复制路径(目录)
strcat((char*)pname,(const char*)fn); //将文件名接在后面
LCD_Fill(60,190,240,190+16,WHITE); //清除之前的显示
Show_Str(60,190,240-60,16,fn,16,0); //显示歌曲名字
mp3_index_show(curindex+1,totmp3num);
key=mp3_play_song(pname); //播放这个MP3
if(key==2) //上一曲
{
if(curindex)curindex--;
else curindex=totmp3num-1;
}else if(key<=1)//下一曲
{
curindex++;
if(curindex>=totmp3num)curindex=0;//到末尾的时候,自动从头开始
}else break; //产生了错误
}
myfree(SRAMIN,mp3fileinfo.lfname); //释放内存
myfree(SRAMIN,pname); //释放内存
myfree(SRAMIN,mp3indextbl); //释放内存
}
SDIO驱动SD卡建立文件,打开读写都是正常的,
//写测试
f_res = f_open(filedst, "0:/test.txt", FA_OPEN_NEW_COVER); //创建文件,如果存在则覆盖
printf("\r\nf_open res :%d\r\n", f_res);
f_res = f_write(filedst, test_buff, sizeof(test_buff), &bw); //写入字符串
printf("f_write res :%d\r\n", f_res);
f_res = f_close(filedst); //关闭文件
printf("f_close res :%d\r\n", f_res);
//打开刚才创建的文件
f_res = f_open(filescr, "0:/test.txt", FA_OPEN_DEFAULT); //打开文件
printf("f_open res :%d\r\n", f_res);
f_res = f_read(filescr, SDdatabuff, 30, &br); //读取文件内容
printf("f_read res :%d\r\n", f_res);
f_res = f_close(filescr); //关闭文件
printf("f_close res :%d\r\n", f_res);
printf("read string is: %s", SDdatabuff);
不知道在读MP3文件的时候问什么是失败的,调试了三个晚上了也没有思路。
|
最佳答案
查看完整内容[请看2#楼]
回复【2楼】正点原子:
---------------------------------
我看了SD卡里面的文件属性,是只读类型的,我昨晚把卡格式化了,可以读MP3数据了,哈哈
SD Init OK!!!!
SD_PowerON() ok
SD_InitializeCards() ok
SD_GetCardInfo ok
SD_SelectDeselect ok
SDIO_STD_CAPACITY_SD_CARD_V1_1_V2_0
SDIO_BusWide_4b start
SDIO_Send_CMDIndex CMD55&nb ...
|