OpenEdv-开源电子网

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

wm8978 录音时,打开sd卡很多时候都会出错,是什么情况 ?

[复制链接]

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
发表于 2017-5-6 16:27:54 | 显示全部楼层 |阅读模式
1金钱
wm8978 录音时,打开sd卡很多时候都会出错,是什么情况 ?

出错界面如下:
rec-err.png

正常如下:
rec-ok.png



但是正常打开并写入的次数很少,

单独测试sd卡读写又完全没有问题,不知为何会这样啊 ??????????????








最佳答案

查看完整内容[请看2#楼]

找到问题的原因了啊, 原来你们的历程里面 _FS_LOCK 这个配置为0, 而我吧这个 _FS_LOCK 不小心设置为 4了, 我把他改成0就可以了, 如果设置为 4,那么 在获取文件名里面需要做如下修改就可以了: void REC_recoder_new_pathname(FIL * _file, u8 *pname) { #if _FS_LOCK > 0 // _FS_LOCK 不等于 0,即可以跟 _VOLUMES 这个的数目相同,但最大不能够超过 _VOLUMES // 所定义的最大数目 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2017-5-6 16:27:55 | 显示全部楼层
正点原子 发表于 2017-5-8 01:27
我们例程不是有8978录音的么?效果不错啊

找到问题的原因了啊,

原来你们的历程里面  _FS_LOCK 这个配置为0,

而我吧这个 _FS_LOCK 不小心设置为 4了,

我把他改成0就可以了,

如果设置为 4,那么 在获取文件名里面需要做如下修改就可以了:
void REC_recoder_new_pathname(FIL * _file, u8 *pname)
{         
#if   _FS_LOCK > 0    // _FS_LOCK  不等于 0,即可以跟 _VOLUMES 这个的数目相同,但最大不能够超过 _VOLUMES
           // 所定义的最大数目
        u8 res;                                         
        u16 index = 0;
        while(index < 0XFFFF)
        {
                sprintf((char *)pname,"0:RECORDER/REC%05d.wav",index);
                res = f_open(_file, (const TCHAR *)&pname[0], FA_OPEN_EXISTING  );     //尝试打开这个文件
                if(res == FR_NO_FILE)
      break;                            //该文件名不存在 = 正是我们需要的,退出循环

    f_close (_file);
                index++;               
        }

  f_close (_file);

#else   // _FS_LOCK 必须 == 0

        u8 res;                                         
        u16 index = 0;
        while(index < 0XFFFF)
        {
                sprintf((char *)pname,"0:RECORDER/REC%05d.wav",index);
                res = f_open(_file, (const TCHAR *)&pname[0], FA_READ  );     //尝试打开这个文件
                if(res == FR_NO_FILE)
      break;                            //该文件名不存在 = 正是我们需要的.

                index++;               
        }


#endif

}

回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-5-6 17:29:35 | 显示全部楼层
都提示你“write error”了!检查什么情况下输出write error!然后调试代码
回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2017-5-7 16:56:44 | 显示全部楼层
zuozhongkai 发表于 2017-5-6 17:29
都提示你“write error”了!检查什么情况下输出write error!然后调试代码

我单独测试读写sd卡都是没有问题的
  Fatfs_FileCopy((const TCHAR*)"0:music/020别再让我为你受折磨.mp3", (const TCHAR*)"0:_music/_020别再让我为你受折磨.mp3");

  Fatfs_FileCopy((const TCHAR*)"0:music/020别再让我为你受折磨.mp3", (const TCHAR*)"0:_music/_021别再让我为你受折磨.mp3");

  Fatfs_FileCopy((const TCHAR*)"0:music/020别再让我为你受折磨.mp3", (const TCHAR*)"0:_music/_022别再让我为你受折磨.mp3");



上述复制三个文件,最后使用电脑读取并播放,完全没有任何问题

复制函数如下:
FRESULT Fatfs_FileCopy(const char *Source_address, const char *Create_target_file)
{
#if   1     // 使用外部 sdram 作为 缓冲测试

        FATFS *fatfs_1, *fatfs_2;
       
        FIL *fsrc,*fdst;
        FRESULT res;                         // FatFs 函数公共结果代码
        UINT br, bw;                         // 文件读/写字节计数
       
  uint8_t  * RWbuf;

  fsrc = (FIL *)mymalloc(SRAMEX, sizeof(FIL));   // 使用外部 sdram 作为缓存
  fdst = (FIL *)mymalloc(SRAMEX, sizeof(FIL));

  fatfs_1 = (FATFS *)mymalloc(SRAMEX, sizeof(FATFS));
  fatfs_2 = (FATFS *)mymalloc(SRAMEX, sizeof(FATFS));  

  RWbuf   = (uint8_t *)mymalloc(SRAMEX, 4096);
       
        f_mount(fatfs_1, Source_address, 0);                                        // 注册工作区
        f_mount(fatfs_2, Create_target_file, 0);

        res = f_open(fsrc, Source_address, FA_OPEN_EXISTING | FA_READ);                //打开存在的源文件,如果没有则返回错误
        if(res)
                printf("打开源文件错误 = %d.. ... ?\r\n", res);
       
        res = f_open(fdst, Create_target_file, FA_CREATE_ALWAYS | FA_WRITE);        //打开目标文件,如果没有则创建
        if(res)
                printf("打开目标文件错误 = %d.. ... ?\r\n", res);       
       
        // 拷贝源文件到目标文件
        for (;;)
        {
                res = f_read(fsrc, &RWbuf[0], (4096), &br);
                if (res || br == 0) break;                 // 文件结束错误
               
                res = f_write(fdst, &RWbuf[0], br, &bw);
                if (res || bw < br) break;                 // 磁盘满错误
        }       
       
        // 关闭打开的文件
        res = f_close(fsrc);
        if(res)
                printf("关闭源文件错误 = %d.. ... ?\r\n", res);
       
        res = f_close(fdst);
        if(res)
                printf("关闭目标文件错误 = %d.. ... ?\r\n", res);
       
        f_mount(NULL, Source_address, 0);
        f_mount(NULL, Create_target_file, 0);          

        myfree(SRAMEX,fsrc);            //释放内存
        myfree(SRAMEX,fdst);            //释放内存  
  myfree(SRAMEX,fatfs_1);          //释放内存
        myfree(SRAMEX,fatfs_2);          //释放内存   
  myfree(SRAMEX,RWbuf);            //释放内存

}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-8 01:27:15 | 显示全部楼层
我们例程不是有8978录音的么?效果不错啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2017-5-8 11:22:54 | 显示全部楼层
是不是SD和wm8979共用了相同的IO,软件你要做分时复用哈
回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2017-5-8 15:41:39 | 显示全部楼层
小陀螺爱炒蛋 发表于 2017-5-8 11:22
是不是SD和wm8979共用了相同的IO,软件你要做分时复用哈

没有共用
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 09:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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