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

📄 fat.h

📁 单片机读写U盘源码 基于51单片机和国产USB芯片CH374
💻 H
字号:
/****************************************Copyright (c)**************************************************
**                               CH374做主机操作U盘读写程序
**                                     FAT16文件系统层
**                                         头文件
**
**                                        VBeat 0.5
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: FAT.H
**创   建   人: 徐亦朱
**最后修改日期: 2007年9月26日
**描        述: FAT文件系统总头文件
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 徐亦朱
** 版  本: VBeat 0.4
** 日 期: 2007年9月24日
** 描 述: 改善头文件格式
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007年9月27日
** 描 述: 优化数据结构及算法
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

/* 调试宏定义 */
/*
#define  DEBUG_NAME                //8 + 3文件名处理 ProcessName
#define  DEBUG_PATH                //路径处理函数 ProcessPath
#define  DEBUG_Init                //初始化函数 Init_FAT
#define  DEBUG_LIST                //FAT表信息读取计算函数x16List
#define  DEBUG_CF                  //查找文件地址信息函数 CheckFile
#define  DEBUG_XCF                 //查找文件地址信息函数 CheckFirst16/x16CheckFile
#define  DEBUG_YCF                 //FAT16根目录项处理函数x16RootDirectory
#define  DEBUG_READ                //读取文件函数 x16ReadFile
#define  DEBUG_WRITE               //写入文件函数 x16WriteFile
#define  DEBUG_CLOSE               //关闭文件函数 FATClose
#define  DEBUG_CREAT               //新建文件函数 x16Creat
#define  DEBUG_OPEN                //打开文件函数 FATOPEN
*/
/* 错误码 */

//  路径处理函数 ProcessPath
#define  NextContinue     0x90    //路径未处理结束
#define  EndPath          0x91    //路径处理结束
//  初始化函数 Init_FAT
#define  ERR_Init         0x92    //文件系统初始化错误
#define  InitSuccess      0x93    //文件系统成功初始化
//  FAT表信息读取计算函数 x16List
#define  ERR_List        0x94     //FAT表信息读取计算错误
#define  ListSuccess     0x95     //FAT表信息成功读取计算
//  目录项处理函数 xProcessDirectory/x16RootDirectory
#define  ERR_Directory    0x96    //目录项操作异常传输错误
#define  DirectorySuccess 0x97    //目录项操作成功
//  FAT16根目录项处理函数x16RootDirectory
#define  ERR_FullRoot     0x98    //根目录写满,无法创建新文件/目录
//  查可写簇函数 x16CheckClus
#define  ERR_CheckClus    0x0001  //查找空簇异常传输错误
//  查找文件地址信息函数 x16CheckFile/CheckFirst16/x16CheckFile
#define  ERR_Check        0x02    //查找文件异常传输错误
//  读取文件函数 x16ReadFile
#define  ERR_Read         0x72    //读取文件操作异常传输错误
#define  ReadSuccess      0x73    //读取文件操作成功完成
#define  Clu_End          0x66    //读取一簇完成
#define  File_End         0x88    //文件读取完成
//  写入文件函数 x16WriteFile
#define  ERR_Write        0x74    //写入文件操作异常传输错误
#define  WriteSuccess     0x75    //写入文件操作成功完成
#define  ERR_FullDisk     0x76    //磁盘满,无法写入数据
//  新建文件函数 x16Creat
#define  ERR_Creat        0x77    //Creat操作异常错误
#define  CreatSuccess     0x78    //Creat操作成功完成
//  打开文件函数 FATOpen
#define  ERR_OPEN         0x99    //Open函数没有发现可用的文件结构,返回错误
#define  ERR_NOFile       0x51    //Open函数没有发现要求操作的文件,返回错误
#define  OpenSuccess      0x50    //Open操作成功完成
//  关闭文件函数 FATClose
#define  CloseSuccess     0x52    //Close操作成功完成
#define  ERR_Close        0x53    //Close操作异常错误
//  复制文件函数 CopyFile
#define  ERR_Copy         0x41    //复制操作有误
#define  CopySuccess      0x40    //复制操作成功完成

/* 操作码 */

//  x16List操作码
#define  ModeZ1  0x00         //更新FAT表
#define  ModeZ2  0x01         //查找FAT表中下个簇的值

//  FATOpen操作码
#define  ModeA1  0x00        //打开文件,以便读,若文件不存在则退出
#define  ModeA2  0x80        //打开文件,以便写,若文件不存在则退出
#define  ModeA3  0x01        //打开文件,以便读,先将文件长度截为0,如果文件不存在则退出
#define  ModeA4  0x81        //打开文件,以便写,先将文件长度截为0,如果文件不存在则退出
#define  ModeA5  0x82        //打开文件,以便写,向已有文件的尾部追加内容,如果文件不存在则退出
#define  ModeB1  0x10        //打开文件,以便读,若文件不存在则创建之
#define  ModeB2  0x90        //打开文件,以便写,若文件不存在则创建之
#define  ModeB3  0x11        //打开文件,以便读,先将文件长度截为0,若文件不存在则创建之
#define  ModeB4  0x91        //打开文件,以便写,先将文件长度截为0,若文件不存在则创建之
#define  ModeB5  0x92        //打开文件,以便写,向已有文件的尾部追加内容,若文件不存在则创建之
#define  ModeC1  0xF1        //创建目录
#define  ModeC2  0xF2        //删除文件/目录 

//  xProcessDirectory操作码
#define  ModeX1  0x00        //创建新文件
#define  ModeX2  0x01        //创建新目录
#define  ModeX3  0x02        //对打开的文件截0
#define  ModeX4  0x03        //删除文件/目录
#define  ModeX5  0x04        //更新写入日期/时间

/* FAT文件系统层数据结构及外部变量 */

//  FAT类型码
#define  FAT12   0x00
#define  FAT16   0x01
#define  FAT32   0x02

//FAT文件系统层函数牵涉到的其他变量 
//  文件缓冲区FILE_BUF的字节数
#define  FILEBUF_BYTES  2560
//  磁盘缓冲区DISK_BUF的字节总数
#define  DISKBUF_BYTES  2048

//  ADT抽象数据结构

//    BPB结构
typedef  struct _BPB
{
     struct _BASE
     {
          UINT8  jmpBoot[ 3 ] ;         //Offset:0
          UINT8  OEMName[ 8 ] ;         //Offset:3
          UINT8  BytesPerSec[ 2 ] ;     //Offset:11
          UINT8  SecPerClus ;           //Offset:13
          UINT8  RsvdSecCnt[ 2 ] ;      //Offset:14
          UINT8  NumFATs ;              //Offset:16
          UINT8  RootEntCnt[ 2 ] ;      //Offset:17
          UINT8  TotSec16[ 2 ] ;        //Offset:19
          UINT8  Media ;                //Offset:21
          UINT8  FATSz16[ 2 ] ;         //Offset:22
          UINT8  SecPerTrk[ 2 ] ;       //Offset:24
          UINT8  NumHeads[ 2 ] ;        //Offset:26
          UINT8  HiddSec[ 4 ] ;         //Offset:28
          UINT8  TotSec32[ 4 ] ;        //Offset:32
     } base ;
     
     union _EXT
     {
          struct _FAT16
          {
               UINT8  drvNum ;               //Offset:36
               UINT8  Reserved1 ;            //Offset:37
               UINT8  BootSig ;              //Offset:38
               UINT8  VolID[ 4 ] ;           //Offset:39
               UINT8  VolLab[ 11 ] ;         //Offset:43
               UINT8  FileSysType[ 8 ] ;     //Offset:54
          } fat16 ;
          
          struct  _FAT32
          {
               UINT8  FATSz32[ 4 ] ;         //Offset:36
               UINT8  ExtFlags[ 2 ] ;        //Offset:40
               UINT8  FSVer[ 2 ] ;           //Offset:42
               UINT8  RootClus[ 4 ] ;        //Offset:44
               UINT8  FSInfo[ 2 ] ;          //Offset:48
               UINT8  BkBootSec[ 2 ] ;       //Offset:50
               UINT8  Reserved[ 12 ] ;       //Offset:52
               UINT8  drvNum ;               //Offset:64
               UINT8  Reservedl ;            //Offset:65
               UINT8  BootSig ;              //Offset:66
               UINT8  VolID[ 4 ] ;           //Offset:67
               UINT8  VolLab[ 11 ] ;         //Offset:71
               UINT8  FileSysType[ 8 ] ;     //Offset:82
          } fat32 ;
     } ext ;
} BPB, *PUSB_BPB ; 

//    FDT结构 
typedef  struct _FDT
{
     UINT8  FileName[ 11 ] ;            //Offset:0     文件名
     UINT8  Attribute ;                 //Offset:11    文件属性
     UINT8  Reserved_NT ;               //Offset:12    WIN NT保留字节
     UINT8  CtrlTimeTeenth ;            //Offset:13    文件创建时间的ms级时间戳
     UINT8  CrtTime[ 2 ] ;              //Offset:14    文件创建时间
     UINT8  CrtDate[ 2 ] ;              //Offset:16    文件创建日期
     UINT8  LastAccDate[ 2 ] ;          //Offset:18    最后访问日期
     UINT8  Reserved[ 2 ] ;             //Offset:20    该目录簇号的高位字,FAT12/16该字节为0
     UINT8  WrtTime[ 2 ] ;              //Offset:22    最后写的时间,文件创建被认作写
     UINT8  WrtDate[ 2 ] ;              //Offset:24    最后写的日期,文件创建被认做写
     UINT8  StartClus[ 2 ] ;            //Offset:26    该目录开始簇号
     UINT8  FileSize[ 4 ] ;             //Offset:28    文件长度
} FDT, *PUSB_FDT ;

//    FAT文件系统参数结构
typedef  struct _FS
{
     UINT8  Type ;                      //FAT类型标识
     UINT8  SecPerClus ;                //DISK每簇扇区数
     UINT8  shift ;
     UINT8  filenum ;
     UINT16 BytesPerSec ;               //DISK每扇区字节数
     UINT16 RsvdSecCnt ;                //DISK保留扇区数
     
     UINT16 RootDirSectors ;            //DISK根目录所占的扇区数
     UINT32 FirstDataSector ;           //DISK簇2的第一个扇区的扇区号
     UINT32 FirstSectofClu ;            //DISK簇N的第一个扇区的扇区号
     UINT32 FirstRootSector ;           //DISK根目录第一个扇区的扇区号
     
} FS ;

//    文件信息结构
typedef  struct _FILE
{
     UINT8  Name[ 11 ] ;                //文件名
     UINT8  Flags ;                     //一些标志位
     UINT16 ShortLength ;               //文件末尾不足一个扇区的字节数      
     UINT32 Sectors ;                   //文件占据的整数个扇区数
     UINT32 FileSize ;                  //文件长度
     UINT32 StartSector ;               //文件起始扇区号
     UINT32 EndSector ;                 //文件结束扇区号
     UINT32 UsedSectors ;
     
     union  
     {
          struct  
          {
               UINT16 StartClus ;            //起始簇号( FAT16 )                 
               UINT16 EndClus ;              //结束簇号( FAT16 )
               UINT16 LastClus;              //上级目录簇号( FAT16 )
               UINT16 NextClus ;             
          } fat16 ;
          struct
          {
               UINT32 StartClus ;            //起始簇号( FAT32 )
               UINT32 EndClus ;              //结束簇号( FAT32 )
               UINT32 LastClus;              //上级目录簇号( FAT32 )
               UINT32 NextClus ;
          } fat32 ;
     } clus ;
     
     struct
     {
          UINT8  *Offset ;
          UINT8  TransNum ;
          UINT32 Sector ;
     } find ; 
     
     union
     {
          struct
          {
               UINT8  LastClu ;
               UINT8  RemainSectors ;
               UINT8  ReadSectors ;
          } read ;
          
          struct
          {
               UINT8  WritedSectors ;
               UINT16 extra ; 
          } write ;
     } wr ;
} FILE ;

//    系统时间结构
typedef  struct _CLOCK
{
     struct
     {
          UINT8  day ;
          UINT8  month ;
          UINT16 year ;
     } date ;
     
     struct
     {
          UINT8  sec ;
          UINT8  min ;
          UINT8  hour ;
     } time ;
} clock ;

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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