⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat32.c

📁 基于Embest开发环境
💻 C
字号:

#include "USB_SYS.h"

//   8BIT		BYTE;
//  16BIT   	WORD;
//  32BIT   	LWORD;


//BYTE   	MassStorageDataBuf[0x200];
//BYTE   	MassStorageDataBuf[0x200];

#pragma pack(push)
#pragma pack(1)  

typedef struct
{
	WORD Addr;/////ok
   
} DBR,*pDBR;

DBR Dbr32;



typedef struct
{
	WORD  Addr;  /////ok
    BYTE  Num;   /////ok
    WORD  Length;/////ok
} FAT,*pFAT;

FAT Fat32;


typedef struct
{
	WORD Addr;////OK
    BYTE Size;////OK
    WORD ClusterHao;////OK
            
} ROOT,*pROOT;

ROOT Root32;


typedef struct
{
	BYTE  Name[11];/////ok
    LWORD Size;/////ok
    BYTE  Fat[8];////ok
    LWORD SectorNum; ////ok
    WORD SectorSize; ////ok
    WORD ClusterNum; ////////////????OK
    BYTE ClusterSize; ////ok 单位:扇区 
    BYTE Class;////ok 
    
} DISKINFO,*pDISKINFO;

DISKINFO Diskinfo32;

typedef struct
{
	BYTE Name[8];////OK
    BYTE ExtName[3];////OK
    LWORD Size;
    BYTE Class;////OK
    WORD Addr;
      
} FILEINFO,*pFILEINFO;

FILEINFO Fileinfo32[64];

#pragma pack(pop) 

BYTE ASCII_Test( BYTE c )
{
     if((c>31)&&(c<123)) return 0;
     else return 1;
     
}

BYTE Analyse_Sector0(void)
{
     if(UFLReadSector(0))
			{

		Dbr32.Addr=(WORD)MassStorageDataBuf[455]<<8|(WORD)MassStorageDataBuf[454];
		Diskinfo32.SectorNum=(LWORD)MassStorageDataBuf[461]<<24|(LWORD)MassStorageDataBuf[460]<<16|
					(LWORD)MassStorageDataBuf[459]<<8|(LWORD)MassStorageDataBuf[458];		//总扇区数
         
        Uart_Printf("得到 --> DBA 地址和总扇区数 \n");
        
		    }
		else{
            Uart_Printf("error at Analyse_Sector0(void) \n");
			return FALSE;
		     }
   return TRUE;
		     
}

BYTE Analyse_DBR(void)
{
    BYTE i=0,j;
	while(i<20){
                		
		if(UFLReadSector(Dbr32.Addr))	break;

		USB_Delay(200);	
		Reset_U();	
		USB_Delay(200);	
		UFLRequestSense();		
		USB_Delay(200);	
		i++;	
	}	
	if(i==20) return FALSE;
	
	Diskinfo32.SectorSize = (WORD)MassStorageDataBuf[0x0C]<<8|(WORD)MassStorageDataBuf[0x0B];//每扇区字节数
	Diskinfo32.ClusterSize = MassStorageDataBuf[0x0D];//每簇扇区数
	
	Uart_Printf("SectorSize = %d (512),ClusterSize = %d\n",Diskinfo32.SectorSize,Diskinfo32.ClusterSize);
	
	Fat32.Addr = Dbr32.Addr+((WORD)MassStorageDataBuf[0x0F]<<8|(WORD)MassStorageDataBuf[0x0E]);
									//fat表地址=系统引导记录(长为一个扇区)地址+保留扇区数
	Fat32.Num = MassStorageDataBuf[0x10];  //fat的个数
	
	Uart_Printf("FAT Num = %d \n",Fat32.Num);
	Uart_Printf("FAT Addr = %ld \n",Fat32.Addr);
	
	Diskinfo32.Class = MassStorageDataBuf[0x15];
	Diskinfo32.Size = Diskinfo32.SectorSize*(Diskinfo32.SectorNum/1024);//(单位KB)
	
	for(j=0;j<8;j++)
	{
     Diskinfo32.Fat[i] = MassStorageDataBuf[0x52+i];
     Uart_Printf("%c",Diskinfo32.Fat[i]);
     }
    Uart_Printf("\n"); 
	
	Fat32.Length =(WORD)MassStorageDataBuf[0x25]<<8|(WORD)MassStorageDataBuf[0x24];//每个fat占的扇区数
	
	Root32.Addr = Fat32.Addr+Fat32.Length*Fat32.Num;//根目录地址
	
	Root32.ClusterHao =  MassStorageDataBuf[0x2D]<<8|MassStorageDataBuf[0x2C];
	
	Root32.Size=Diskinfo32.ClusterSize;//根目录占多少个扇区
	
	Uart_Printf("RootDirSize = %d \n",Root32.Size);
	
	return TRUE;
	
}

BYTE Analyse_ROOT(void)
{
    BYTE i=0,j,k=1;
    
   
	while(i<20){
	    if(UFLReadSector(Root32.Addr))	break;

		USB_Delay(200);	
		Reset_U();	
		USB_Delay(200);	
		UFLRequestSense();		
		USB_Delay(200);	
		i++;	
	}	
	if(i==20) return FALSE; 
    
    for(i=0;i<11;i++)
    {
       Diskinfo32.Name[i] = MassStorageDataBuf[i];        
    } 
    
    //////////////////////////////////
    
    for(j=0;j<16;j++)
    {
     if(ASCII_Test(MassStorageDataBuf[0+(j+1)*32])==0)
     {
        Uart_Printf("文件名 :");
        for(i=0;i<8;i++)
        {
            Fileinfo32[j].Name[i] =  MassStorageDataBuf[i+(j+1)*32];
            Uart_Printf("%c",Fileinfo32[j].Name[i]);                     
        }
        
        Fileinfo32[j].ExtName[0] = MassStorageDataBuf[8+(j+1)*32];
        Fileinfo32[j].ExtName[1] = MassStorageDataBuf[9+(j+1)*32];
        Fileinfo32[j].ExtName[2] = MassStorageDataBuf[10+(j+1)*32];
        
        Uart_Printf("  扩展名 :%c%c%c",MassStorageDataBuf[8+(j+1)*32],MassStorageDataBuf[9+(j+1)*32],MassStorageDataBuf[10+(j+1)*32]);
        
        Fileinfo32[j].Class = MassStorageDataBuf[11+(j+1)*32];
        if(Fileinfo32[j].Class&(1<<4)) Uart_Printf(" 属性 :文件夹\n");
        else  Uart_Printf(" 属性 :文件\n"); 
        
        Fileinfo32[j].Size = (LWORD)MassStorageDataBuf[31+(j+1)*32]<<24|(LWORD)MassStorageDataBuf[30+(j+1)*32]<<16|(LWORD)MassStorageDataBuf[29+(j+1)*32]<<8|(LWORD)MassStorageDataBuf[28+(j+1)*32];
        
        Fileinfo32[j].Addr = MassStorageDataBuf[27+(j+1)*32]<<8|MassStorageDataBuf[26+(j+1)*32];
     }
     
     else Fileinfo32[j].Name[0] = 0 ;    
        
    } 
    
    while(k!=(Diskinfo32.ClusterSize))
    {
      while(i<20){
	    if(UFLReadSector(Root32.Addr+k))	break;

		USB_Delay(200);	
		Reset_U();	
		USB_Delay(200);	
		UFLRequestSense();		
		USB_Delay(200);	
		i++;	
	}	
	if(i==20) return FALSE; 
    
    for(j=0;j<16;j++)
    {
     if(ASCII_Test(MassStorageDataBuf[0+j*32])==0)
     {
        Uart_Printf("文件名 :");
        for(i=0;i<8;i++)
        {
            Fileinfo32[16*k+j].Name[i] =  MassStorageDataBuf[i+j*32];
            Uart_Printf("%c",Fileinfo32[16*k+j].Name[i]);                     
        }
        
        Fileinfo32[16*k+j].ExtName[0] = MassStorageDataBuf[8+j*32];
        Fileinfo32[16*k+j].ExtName[1] = MassStorageDataBuf[9+j*32];
        Fileinfo32[16*k+j].ExtName[2] = MassStorageDataBuf[10+j*32];
        
        Uart_Printf("  扩展名 :%c%c%c",MassStorageDataBuf[8+j*32],MassStorageDataBuf[9+j*32],MassStorageDataBuf[10+j*32]);
        
        Fileinfo32[16*k+j].Class = MassStorageDataBuf[11+j*32];
        if(Fileinfo32[16*k+j].Class&(1<<4)) Uart_Printf(" 属性 :文件夹");
        else  Uart_Printf(" 属性 :文件"); 
        
        Fileinfo32[16*k+j].Size = (LWORD)MassStorageDataBuf[31+j*32]<<24|(LWORD)MassStorageDataBuf[30+j*32]<<16|(LWORD)MassStorageDataBuf[29+j*32]<<8|(LWORD)MassStorageDataBuf[28+j*32];
      
        Fileinfo32[16*k+j].Addr = MassStorageDataBuf[27+j*32]<<8|MassStorageDataBuf[26+j*32];
     }
     
     else Fileinfo32[j].Name[0] = 0 ;    
        
    }                                     
    
    }
    return TRUE;    
}

BYTE Analyse_FAT(void)
{
     
     }

BYTE Analyse_FILE(void)
{
     
     }





























⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -