OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4263|回复: 2

战舰板STM32\标准例程-V3.5库函数版本\实验44 音乐播放器实验,读MP3文件没有通过,求助大神!

[复制链接]

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2014-8-12
在线时间
4 小时
发表于 2015-8-26 23:35:39 | 显示全部楼层 |阅读模式
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 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2014-8-12
在线时间
4 小时
 楼主| 发表于 2015-8-26 23:35:40 | 显示全部楼层
回复【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 start
SDIO_Send_CMDIndex CMD55 
SDIO_Send_CMDIndex ACMD6 
SDEnWideBus(ENABLE) 
SD_EnableWideBusOperation ok 
errorstatus=0
res f_opendir=0
res f_readdir=0
fname=王筝-~1.MP3
res f_readdir=0
fname=THESOU~1.MP3
res f_readdir=0
fname=凤凰传~1.MP3
res f_readdir=0
fname=徐誉滕~1.FLA
res f_readdir=0
fname=02.jpg
res f_readdir=0
fname=03.jpg
res f_readdir=0
res f_opendir=0
res f_readdir=0
fname=王筝-~1.MP3
res f_readdir=0
fname=THESOU~1.MP3
res f_readdir=0
fname=凤凰传~1.MP3
不过文件名是8字节的,没支持长文件名。

我之前也看到过别人有这个问题,open函数会卡死,说是栈溢出,不过,原子哥,用了内存管理之后,应该不那么容易存在内存不够而函数卡死的问题吧?感谢原子哥,用了你的SDIO库程序之后,我可以读取kingston 8G的大卡了,不过有张国产的1G的卡不能读数据,只能显示卡容量和类型。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165538
金钱
165538
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-27 23:14:41 | 显示全部楼层
DIR mp3dir;  //目录
FILINFO mp3fileinfo;//文件信息
定义成全局变量试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 11:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表