OpenEdv-开源电子网

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

移植FATFS 挂载SD总是失败一次后才能挂载成功 遍历根目录 打印结果乱码

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2017-5-31
在线时间
1 小时
发表于 2017-5-31 16:55:26 | 显示全部楼层 |阅读模式
1金钱
实现功能:在while循环里检测是否挂载成功,成功后扫描根目录,将结果打印到串口上,同时打印SD卡空间
在main函数里实现的代码:
while (1)
{
       if (FR_OK != res)
       {
            res = f_mount(&(fs[0]), "0:", 1);
            Delay_s(1);
       }
       if (FR_OK == res)
       {
            Delay_ms(200);
            mf_scan_files("0:");
            Delay_ms(200);
            mf_showfree("0");
      }
}
自己修改的mf_scan_files函数,其中_USE_LFN = 2, 使用堆栈的方式
全局变量也做了相应修改
FATFS fs[_VOLUMES]; //逻辑磁盘工作区.  
FIL file;     //文件1
FIL ftemp;     //文件2.
UINT br, bw;   //读写变量
FILINFO fileinfo; //文件信息
DIR dir;     //目录

void mf_scan_files(u8* path)
{
    FRESULT res;   
    char *fn;   /* This function is assuming non-Unicode cfg. */
        
#if _USE_LFN
    TCHAR lbuf[_MAX_LFN + 1];
    fileinfo.lfsize = _MAX_LFN + 1;
    fileinfo.lfname = lbuf;
#endif
    res = f_opendir(&dir, (const TCHAR*)path);
    if (res == FR_OK)
    {
        while(1)
        {
            res = f_readdir(&dir, &fileinfo);
            if ( (res != FR_OK) || (fileinfo.fname[0] == 0) )
            {
                break;
            }
#if _USE_LFN
           fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
#else         
           fn = fileinfo.fname;
#endif
            if (fn[0] == '.')
            {
                continue;
            }
            
           printf("%s/", path);
           printf("%s\r\n", fn);
        }
    }
    else
    {
        printf(" ------ mf_scan_files fail -------\r\n");
    }
}

实现现象:
串口打印结果
  ------ Mount Fail ------     <每次都会出现>
?------ Mount Success ------
0:/?怣SDOS.5.0                <第一次扫描的时候会打印一堆乱码出来>
0:/2.txt
0:/幯拣{庂?
0:/f?|&f;.&妛
0:/fFV.f
0:/肏黧F?.N?
0:/at2Nt 兦;?
0:/?
0:/;
0:/JJ奆
2澉.?f
0:/吟鰬黯b?树v
0:/嬼奦$?a.ar
0:/癰ootmgr
0:/hermedi.a.

最佳答案

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

首先感谢原子哥的解答 今天重新移植后问题解决了 问题原因diskio.c里的disk_read和disk_write接口没有写好,原子哥提供的例子是在底层的读写函数里等待操作完成,而我是用的DMA中断的方式,在实现接口里没有查询DMA是否操作完,导致底层IO操作还没完成就进行后续操作,从而导致失败
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2017-5-31
在线时间
1 小时
 楼主| 发表于 2017-5-31 16:55:27 | 显示全部楼层
正点原子 发表于 2017-5-31 21:08
应该是你的长文件名没搞好。参考我们例程慢慢改

首先感谢原子哥的解答
今天重新移植后问题解决了
问题原因diskio.c里的disk_read和disk_write接口没有写好,原子哥提供的例子是在底层的读写函数里等待操作完成,而我是用的DMA中断的方式,在实现接口里没有查询DMA是否操作完,导致底层IO操作还没完成就进行后续操作,从而导致失败
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-5-31 21:08:40 | 显示全部楼层
应该是你的长文件名没搞好。参考我们例程慢慢改
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2017-5-31
在线时间
1 小时
 楼主| 发表于 2017-6-1 15:56:41 | 显示全部楼层
重新实现disk_read和disk_write接口,问题解决
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 11:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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