OpenEdv-开源电子网

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

Fatfs f_close函数为啥老是返回FR_DISK_ERR

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2013-5-21
在线时间
0 小时
发表于 2013-5-22 22:37:02 | 显示全部楼层 |阅读模式
小弟写了个简单的函数,函数首先创建一个文件夹Photo,然后在文件夹里面创建一个文件。
但是每次f_open可以成功,但是f_close总是返回0x01,失败。

如果我把f_open,f_close放到一个函数里面,然后让main函数调用,这样就没有问题

麻烦各位大拿帮我看一下是为什么啊?


void camera_new_pathname(u8 *pname)
{  
u8 res;  
u16 index=0;
while(index<0XFFFF)
{
sprintf((char*)pname,"0HOTO/PIC%05d.bmp",index);
res=f_open(ftemp,(const TCHAR*)pname,FA_READ);//尝试打开这个文件
if(res==FR_NO_FILE)break; //该文件名不存在=正是我们需要的.
index++;
}
}
int main(void)
{
     
    FIL* f_bmp;
    u8 *pname;
    f_bmp=(FIL *)mymalloc(SRAMIN,sizeof(FIL)); //开辟FIL字节的内存区域 
    mem_init(SRAMIN);
    exfuns_init();
    f_mount(0,fs[0]);
  f_mount(1,fs[1]);
    res=f_mkdir("0:/PHOTO"); //创建PHOTO文件夹


    pname=mymalloc(SRAMIN,30);
//为带路径的文件名分配30个字节的内存
    camera_new_pathname(pname);
    res=f_open(f_bmp,pname,FA_WRITE|FA_CREATE_NEW);
 
     if(res != 0)
     {
   printf("\r\n打开 %s 文件失败!\r\n\r\n", "0HOTO/PIC0001.txt");
   sd_ok = 0;
     }
     printf("\r\n打开文件完成.....\r\n\r\n");


     res = f_close(f_bmp);
     if(res != 0)
     {
   printf("\r\n关闭 %s 文件失败!\r\n\r\n", "0HOTO/PIC0001.txt");
   sd_ok = 0;
     }
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2013-5-21
在线时间
0 小时
 楼主| 发表于 2013-5-23 08:58:29 | 显示全部楼层
我上面贴出来的是有问题的,f_close的时候返回0x01
后来我改成如下这样就可以成功创建文件了

u8 bmp_encode(u8 *filename,u16 x,u16 y,u16 width,u16 height,u8 mode)
{
FIL* f_bmp;
u8 res;
UINT bw;
u8 *databuf = "12345";

        f_bmp=(FIL *)mymalloc(SRAMIN,sizeof(FIL));
if(mode==1)res=f_open(f_bmp,(const TCHAR*)filename,FA_READ|FA_WRITE);
  if(mode==0||res==0x04)res=f_open(f_bmp,(const TCHAR*)filename,FA_WRITE|FA_CREATE_NEW);     

res=f_write(f_bmp,databuf,6,&bw);
res = f_close(f_bmp);
return res;
}

int main(void)
{
   ...
   ...
    pname=mymalloc(SRAMIN,30);
    camera_new_pathname(pname);
    
    if(bmp_encode(pname,0,0,240,320,0))
    {
        printf("\r\n数据写入有误!.....\r\n\r\n");
    }
}
回复 支持 1 反对 0

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
286
金钱
286
注册时间
2012-9-13
在线时间
33 小时
发表于 2016-2-26 16:58:12 | 显示全部楼层
我也遇到这样的问题,  f_write 一直失败  FR_DISK_ERR
回来发现在 在diskio 的 disk_write 操作里要加上卡的状态等待

int MMC_disk_write(const unsigned char *buff, unsigned long sector, unsigned int count)
{
    SD_Error Status;
   
     switch(SD_Mode)
                  {
                           case 0:  //dma·&#189;ê&#189;
                              if(count==1) {      
                                  Status = SD_WriteBlock(sector << 9,(u32 *)(&buff[0]),BlockSize);//sector<<9 éè&#199;&#248;μ&#216;&#214;·×a&#206;a×&#214;&#189;úμ&#216;&#214;· ò&#187;&#184;&#246;éè&#199;&#248;512×&#214;&#189;ú                                             
                              }else {   
                                  Status = SD_WriteMultiBlocks(sector << 9,(u32 *)(&buff[0]),BlockSize,count);                                          
                              }         

                while(SD_GetTransferState() != SD_NO_TRANSFER);
                                break;

                           case 1:  //&#214;D&#182;&#207;·&#189;ê&#189;
                                if(count==1) {      
                                    Status = SD_WriteBlock(sector << 9 ,(u32 *)(&buff[0]),BlockSize);                                            
                              }else {   
                                       Status = SD_WriteMultiBlocks(sector << 9 ,(u32 *)(&buff[0]),BlockSize,count);                                    
                              }  
                while(SD_GetTransferState() != SD_NO_TRANSFER);
                                break;

                        default :
                                Status=SD_ERROR;
                }
        
     if(Status == SD_OK){
          return RES_OK;
     }else{
          return RES_ERROR;
     }
}
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-5-23 00:24:31 | 显示全部楼层
你上面的代码是正常 的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-5-23 10:35:49 | 显示全部楼层
是不是没加f_write(f_bmp,databuf,6,&bw);的缘故?
这个我倒还真没测试,仅创建文件,不执行f_write是否出问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2013-5-21
在线时间
0 小时
 楼主| 发表于 2013-5-23 11:00:15 | 显示全部楼层
我也试过的,只是创建文件的话,也没有问题的。
只要把f_open和f_close放在函数里面就OK
回复 支持 反对

使用道具 举报

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-1-29
在线时间
1 小时
发表于 2013-8-28 17:15:05 | 显示全部楼层
回复【5楼】披头四:
---------------------------------
楼主你好 请问你的问题解决了吗 我现在一直了FATFS  也遇到了F_CLOSE老是返回1 不知道怎么解决...
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-9-16
在线时间
0 小时
发表于 2013-9-16 16:30:56 | 显示全部楼层
我也遇到这个问题了,各路高手都是怎么解决的呢
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2015-2-3
在线时间
0 小时
发表于 2015-2-10 17:59:33 | 显示全部楼层
我也碰到了,放在一个函数里面都是返回1,,纠结了好久   求解答,
回复 支持 反对

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-8-22
在线时间
11 小时
发表于 2016-12-13 15:02:44 | 显示全部楼层
why
?
回复 支持 反对

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11525
金钱
11525
注册时间
2014-4-1
在线时间
1311 小时
发表于 2017-9-6 11:07:56 | 显示全部楼层
郭震2009 发表于 2016-2-26 16:58
我也遇到这样的问题,  f_write 一直失败  FR_DISK_ERR
回来发现在 在diskio 的 disk_write 操作里要加上 ...


谢谢,帮到我了。


回复 支持 反对

使用道具 举报

4

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2019-6-18
在线时间
67 小时
发表于 2019-11-1 09:26:16 | 显示全部楼层
郭震2009 发表于 2016-2-26 16:58
我也遇到这样的问题,  f_write 一直失败  FR_DISK_ERR
回来发现在 在diskio 的 disk_write 操作里要加上 ...

对的,根据你这个方法能解决FR_DISK_ERR错误,必须要等到SD卡处于TRANSFER的状态才行
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-8 11:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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