OpenEdv-开源电子网

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

fatfs读写文件问题

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-11-20
在线时间
2 小时
发表于 2012-11-20 22:51:17 | 显示全部楼层 |阅读模式
小弟新学fatfs,在sd卡上放了一个“1.mp3”的文件作为测试,然后使用fatfs的读文件函数读写该mp3文件,送到vs1053播放,但是没有声音。开始考虑是vs1053没设置或者复位好,就把mp3文件弄成2进制送vs1053就有声音,然后用fatfs的函数读写sd卡上的txt文件也没用问题,而且可以读出该mp3文件的歌曲名字和作者等信息无误,就是没声音,现在不知道问题出在哪里。
程序简单的很,就是想测试下能否用fatfs读mp3文件,
void music_dis(void)
{
    unsigned int i,j;
    unsigned char *music_name;        //歌曲名称
    unsigned char *music_auther;    //歌曲作者


    FATFS fs;         /* Work area (file system object) for logical drive */
    FIL fl;         /* file objects */  
    FRESULT res=FR_OK;
    UINT r;
    SPIx_SetSpeed(SPI_SPEED_8);
    while(1)
    {   
//        music_kbps = 0;
//        music_order[0] = (music_sign+1)/10+'0';
//        music_order[1] = (music_sign+1)%10+'0';

        f_mount(0,&fs);
        f_open(&fl,"1.mp3",FA_OPEN_EXISTING|FA_READ);
       
        //ID3V1(存储于MP3最后128字节)
        res = f_lseek(&fl,fl.fsize-128);
        if((res = f_read(&fl,buffer,128,&r))== FR_OK)
        {
            //判断是否有ID3V1
            if(buffer[0] == 'T' && buffer[1] == 'A' && buffer[2] == 'G')
            {
                music_name = buffer+3;//指向歌曲名称
                music_auther = buffer+33;//指向歌曲作者
                *(music_name+19) ='\0';//*(music_name+20) ='\0';
                *(music_auther+19) ='\0';//*(music_auther+20) ='\0';

                printf("\r\n %s ", music_name);    //显示歌曲名称
                printf("\r\n %s ", music_auther);//显示歌曲作者
            }
            else
            {   
            }
        }
        res = f_lseek(&fl,0);

//        VS_Get_DecodeTime();
        while((res = f_read(&fl,buffer,512,&r))== FR_OK)
        {   
            //音乐播放开始
            if(res || r==0)break;  //when r is 512 ,then r>>5 is 16
            for(j=0;j<(r>>5);j++)  //16 * 32 = 512
            {
                while(VS_DQ == 0);//等待VS1053数据空闲
                VS_XDCS=0;
                for(i=0;i<32;i++)
                VS_WR_Data(buffer[(j<<5)+i]);
                VS_XDCS=1;
            }
            printf("\r\n %s ", buffer);
    //        MP3_Msg_Show(fl.fsize);
        }
       
        f_close(&fl);//关闭当前打开的文件
        f_mount(0,NULL);
    }
}


int main(void)
{
    u32 n ,m;
    uart_init(9600);
    SD_Initialize();
    VS_Init();

    music_dis();



}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-20 23:19:02 | 显示全部楼层
回复【楼主位】bat0301:
---------------------------------
送MP3数据之前,先复位一下VS1053。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2012-11-20
在线时间
2 小时
 楼主| 发表于 2012-11-21 00:00:43 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
复位了还是不行啊,。。
VS_HD_Reset() ;
VS_Soft_Reset(); 
set10XX();
while((res = f_read(&fl,buffer,512,&r))== FR_OK)
{
//音乐播放开始
if(res || r==0)break;  //when r is 512 ,then r>>5 is 16
for(j=0;j<(r>>5);j++)  //16 * 32 = 512
{
while(VS_DQ == 0);//等待VS1053数据空闲
VS_XDCS=0; 
for(i=0;i<32;i++)
VS_WR_Data(buffer[(j<<5)+i]);
VS_XDCS=1; 
}
printf("\r\n %s ", buffer);
// MP3_Msg_Show(fl.fsize);
}
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 22:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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