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

2019-07-20 15:02发布

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 ",res);
        if(res==0)
        {

                 printf("总容量%u KB ",total);
                 printf("剩余容量%u KB ",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("内存申请失败 ");
                return 5;        //Äú′æéêÇë꧰ü
        } printf("内存申请 OK ");
        res=f_open(fftemp,"2:/OK.BIN",FA_READ); //(const TCHAR*)pname1
printf("文件打开:%u ",res);        //if(res)rval|=1<<4;//′ò&#191;a&#206;&#196;&#188;t꧰ü  
        //file_byte = f_size(&fftemp);
        file_byte = fftemp->fsize;
        printf("文件大小为:%uB ",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 ",(u8*)br);
                        if(res!=FR_OK){printf("读取数据失败:%u ",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(" 当前进度为:%u%% ",(u8)prog);                               
                                t=prog;
                                if(t>100)t=100;                               
                        }       
                        for(j=0;j<bread;j++)printf("%x",*(far_buf+j));printf(" ");                       
                        if(bread!=4096){printf("读取数据完成 ");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("设备连接成功! ");
                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 ",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 ",w25qid);
        while(1)
        {


                USBH_Process(&USB_OTG_Core, &USB_Host);


        }

}













友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。