OpenEdv-开源电子网

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

FATFS文件系统读取u盘内文件出错

[复制链接]

5

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2015-11-13
在线时间
35 小时
发表于 2017-4-14 15:29:36 | 显示全部楼层 |阅读模式
10金钱
FATFS文件系统读取u盘内的OK.BIN文件,打开文件都正常,在while循环里面对打开的OK.BIN文件进行多次读操作,每次读取4096个数据。第一次读取都正常,但是第二次读取就出错,返回的错误代码为9。请问这是什么情况呢?请大家帮忙分析一下,看看哪儿出问题了。以下是man.c里面的程序。

#include "delay.h"
#include "sys.h"
#include "usart.h"        
#include "usbh_usr.h"
#include "timer.h"
#include "malloc.h"
#include "exfuns.h"
#include "w25qxx.h"
#include "ff.h"  
#include "usbh_msc_core.h"
#include "fattester.h"       
#define  WRIT_ADD 0xE0000

        USBH_HOST  USB_Host;
USB_OTG_CORE_HANDLE  USB_OTG_Core;
extern USBH_Class_cb_TypeDef  USBH_MSC_cb;
extern UINT br,bw;
extern FIL *file;                          //Îļt1
//enum NETstates netst=0;
u8 arpflag=3;
struct tcp_pcb *tcppcb_=NULL;
const char neam[]="2:/OK.BIN";
u8 USH_User_App(void)
{
        u32 total,free,bread;
        u32 offx=0,file_byte=0;
        u8 res=0,t=0xff;
        u16 j;
        FIL *fftemp;
        u8 *far_buf,*red_buf;
        float prog;
        res=exf_getfree("2:",&total,&free);
         printf("res=%u \r\n",res);
        if(res==0)
        {

                 printf("总容量%u KB\r\n",total);
                 printf("剩余容量%u KB\r\n",free);
        }
fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL));        //·ÖÅäÄú′æ
        far_buf=(u8*)mymalloc(SRAMIN,4096);        //·ÖÅäÄú′æ
        if(fftemp==NULL||far_buf==NULL)
        {
                myfree(SRAMIN,far_buf);
                myfree(SRAMIN,fftemp);       
                printf("内存申请失败\r\n");
                return 5;        //Äú′æéêÇë꧰ü
        } printf("内存申请 OK\r\n");
        res=f_open(fftemp,"2:/OK.BIN",FA_READ); //(const TCHAR*)pname1
printf("文件打开:%u\r\n",res);        //if(res)rval|=1<<4;//′ò&#191;a&#206;&#196;&#188;t꧰ü  
        //file_byte = f_size(&fftemp);
        file_byte = fftemp->fsize;
        printf("文件大小为:%uB\r\n",file_byte);
        //sprintf((char *)fatbuf,"%s",neam);
                while(res==0)//&#203;à&#209;-&#187;·&#214;′DD
                {

                         res=f_read(fftemp,far_buf,4096,(UINT *)&bread);                //&#182;áè&#161;êy&#190;Y                       
                        printf("当前指针%u\r\n",(u8*)br);
                        if(res!=FR_OK){printf("读取数据失败:%u\r\n",res);break;}                                                                //&#214;′DD′í&#206;ó
                //        W25QXX_Write(far_buf,offx+WRIT_ADD,4096);                //′ó0&#191;aê&#188;D′è&#235;4096&#184;&#246;êy&#190;Y  
                  offx+=bread;
                        prog=(float)offx/file_byte;
                        prog*=100;       
                        if(t!=prog)
                        {
                                printf("\r\n当前进度为:%u%%\r\n",(u8)prog);                               
                                t=prog;
                                if(t>100)t=100;                               
                        }       
                        for(j=0;j<bread;j++)printf("%x",*(far_buf+j));printf("\r\n");                       
                        if(bread!=4096){printf("读取数据完成\r\n");break;}                                                                //&#182;áíêá&#203;.

                 }                                
f_close(fftemp);
myfree(SRAMIN,fftemp);
myfree(SRAMIN,far_buf);

        while(HCD_IsDeviceConnected(&USB_OTG_Core))//éè±&#184;á&#172;&#189;ó3é1|
        {       
                printf("设备连接成功!\r\n");
                delay_ms(1000);
        }
        return res;
}








int main(void)
{         
        u8 res=0;
        u16 w25qid=0;         
        delay_init();                     
        NVIC_Configuration();          
        uart4_init(19200);       
        W25QXX_Init();                                //3&#245;ê&#188;&#187;ˉW25Q128
        my_mem_init(SRAMIN);                //3&#245;ê&#188;&#187;ˉ&#196;ú2&#191;&#196;ú′&#230;3&#216;       
        exfuns_init();                                                        //&#206;afatfs&#207;à1&#216;±&#228;á&#191;éê&#199;&#235;&#196;ú′&#230;       
        res=f_mount(fs[1],"1:",1);                                 //1ò&#212;&#216;FLASH.
        f_mount(fs[2],"2:",1);         //1ò&#212;&#216;U&#197;ì       
        printf("res=%u\r\n",res);         

        USBH_Init(&USB_OTG_Core,USB_OTG_FS_CORE_ID,&USB_Host,&USBH_MSC_cb,&USR_Callbacks);
        my_mem_init(SRAMIN);
        w25qid=W25QXX_ReadID();       
        printf("w25qid=%u\r\n",w25qid);
        while(1)
        {


                USBH_Process(&USB_OTG_Core, &USB_Host);


        }

}













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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2017-4-14 18:28:11 | 显示全部楼层
仿真找问题了,9是什么意思?去fatfs定义里面看看
回复

使用道具 举报

5

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2015-11-13
在线时间
35 小时
 楼主| 发表于 2017-4-15 17:12:34 | 显示全部楼层
正点原子 发表于 2017-4-14 18:28
仿真找问题了,9是什么意思?去fatfs定义里面看看

通过仿真发现在第一次读取4096个数据后,fil->fstyp和fil->fs->drv等很多变量都被修改了。导致了第二次读取数据失败。我把每次读取的数据从4096改为了512后就正常了。通过分析发现应该是从usb读取出来的数据覆盖的那些变量导致了错误。但是从u盘读出来的数据是放在申请好的内存里面的,为什么会把其他变量覆盖了呢?是内存管理的程序有问题吗?
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-4-12
在线时间
1 小时
发表于 2017-4-22 17:51:08 | 显示全部楼层
问题解决了吗 不妨试下 http://ranfs.com fat文件系统
提供中文技术支持
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2021-5-18
在线时间
12 小时
发表于 2021-6-14 20:06:20 | 显示全部楼层
我也遇到了同样的问题,请问楼主找到解决办法了吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 14:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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