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

📄 fatfunction.h

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

FS  FAT ;
FILE  files[ 2 ] ;
clock sysclock ;
UINT8  DiskNums ;                                 //DISKBUF能存储的扇区数  
UINT8  FileNums ;                                 //FILEBUF能存储的扇区数 

/*********************************************************************************************************
** 函数名称: ProcessName
** 功能描述: 8 + 3文件名处理
**
** 输 入: string:   指向一个普通的文件名
**         filename: 指向一个11字节的空数组
** 输 出: string指向的文件名被处理为11字节大小8 + 3文件名数组
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   DEBUG_NAME
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
static void  ProcessName( const UINT8 * string, UINT8 * filename ) ;

/*********************************************************************************************************
** 函数名称: ProcessPath
** 功能描述: 文件路径处理
**
** 输 入: string:   指向要操作的文件路径,路径输入格式: /……/……/……
**         filename: 指向一个11字节的空数组
** 输 出: string指向的文件路径被处理为8 + 3字符数组
**           A.返回EndPath报告路径处理结束,当前处理的是最终文件名
**           B.否则返回继续标识符NextContinue
**         
** 全局变量: 无
** 调用模块: ProcessName
** 调试码:   DEBUG_PATH
**
**PS:      A.暂时文件名输入需要尽可能准确,例如不要输入10个字符的基本名   
**         B.此程序因为没有对static变量Count初始化而导致POINT2指针乱飞,由于编译器会经常出现莫名其妙的问题
**           对static显式初始化很有必要  
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  ProcessPath( const UINT8 *string, UINT8 * filename ) ;

/*********************************************************************************************************
** 函数名称: x16List
** 功能描述: 根据簇号计算并读取FAT16表中相关信息
**
** 输 入: clus  : 要计算的簇号
**         value : 要更新的值
**         ProcessMode: 函数工作模式
**           A.ModeZ1: 更新FAT表
**           B.ModeZ2: 查找FAT表中下个簇的值
** 输 出: A.返回ERR_List报告异常传输错误
**         B.返回ListSuccess表示操作成功完成
**         C.ModeZ2下会返回下个簇的值
** 全局变量: FAT.SecPerClus, FAT.FirstDataSector, DISKBUF
** 调用模块: mReadSector, mWriteSector
** 调试码:   DEBUG_LIST
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

UINT16 x16List( UINT16 clus, UINT16 value, UINT8 ProcessMode ) ;

/*********************************************************************************************************
** 函数名称: x16CheckClus
** 功能描述: FAT16查可写簇以便写入数据
**
** 输 入: 无
** 输 出: 返回找到的可写簇簇号
**           A.返回ERR_CheckClus报告异常传输错误
**           B.若磁盘簇已写满,返回簇号0
**         
** 全局变量: FAT.RsvdSecCnt, FAT.FirstRootSector, FAT.BytesPerSec
** 调用模块: mReadSector, mWriteSector
** 调试码:   无
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT16  x16CheckClus( void ) ;

/*********************************************************************************************************
** 函数名称: xProcessDirectory
** 功能描述: 处理目录/文件名
**
** 输 入: wr:        指向文件信息结构FILE的指针
**         Attribute: 目录/文件操作模式
**           A.模式ModeX1: 创建新文件
**           B.模式ModeX2: 创建新目录
**           C.模式ModeX3: 对打开的文件截0
**           D.模式ModeX4: 删除文件/目录
** 输 出: 根据模式选择完成相应的操作
**           A.返回ERR_Directory 报告异常传输错误
**           B.返回DirectorySuccess表示操作成功完成
**         
** 全局变量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector, FAT.FirstSectofClu
** 调用模块: mReadSector, mWriteSector, x16CheckClus, x16List
** 调试码:   无
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱  
** 日 期: 2007.9.27 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  xProcessDirectory( FILE * wr, UINT8 Attribute ) ;

/*********************************************************************************************************
** 函数名称: x16RootDirectory
** 功能描述: FAT16根目录下新建目录/文件名
**
** 输 入: wr :       指向文件信息结构FILE的指针
**         Attribute: 目录/文件操作模式
**           A.模式ModeX1: 创建新文件
**           B.模式ModeX2: 创建新目录
** 输 出: 根据模式选择完成相应的操作
**           A.返回ERR_Directory 报告异常传输错误
**           B.返回DirectorySuccess表示操作成功完成
**           C.返回ERR_FullRoot报告根目录已写满,无法正常创建文件/目录
**         
** 全局变量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector, FAT.RootDirSectors, FAT.FirstRootSector, 
** 调用模块: mReadSector, mWriteSector, xProcessDirectory
** 调试码:   DEBUG_YCF
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  x16RootDirectory( FILE * wr, UINT8 Attribute ) ;

/*********************************************************************************************************
** 函数名称: x16Creat
** 功能描述: FAT16目录下处理目录/文件名
**
** 输 入: wr :       指向文件信息结构FILE的指针
**         Attribute: 目录/文件操作模式
**           A.模式ModeX1: 创建新文件
**           B.模式ModeX2: 创建新目录
** 输 出: 根据模式选择完成相应的操作
**           A.返回ERR_Creat 报告异常传输错误
**           B.返回Creat_Success表示操作成功完成
**         
** 全局变量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector
**           FAT.SecPerClus, FAT.FirstSectofClu, FAT.shift, DiskNums
** 调用模块: mReadSector, mWriteSector, x16List, x16CheckClus, xProcessDirectory
** 调试码:   DEBUG_CREAT
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  x16Creat( FILE * wr, UINT8 Attribute ) ;

/*********************************************************************************************************
** 函数名称: CheckFile
** 功能描述: 在一定范围内查找文件/目录
**
** 输 入: wr : 指向文件信息结构FILE的指针
**         TotalSectors: 为该范围总扇区数
**         ProcessSector: 为该范围首地址
** 输 出: 在该范围内查找文件,返回FindFlag标识,以便外部程序调用
**         找到的文件/目录在簇内的地址信息记录在FIND结构中
**           A.返回ERR_Check报告异常传输错误
**           B.返回FindFlag为0x00表示未找到文件
**           C.返回FindFlag为0x01表示找到文件
**         
** 全局变量: wr -> find.Offset, wr -> find.TransNum, wr -> find.Sector, DiskNums
** 调用模块: mReadSector
** 调试码:   DEBUG_CF
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  CheckFile( FILE * wr, UINT16 TotalSectors, UINT32 ProcessSector ) ;

/*********************************************************************************************************
** 函数名称: CheckFirst16
** 功能描述: 在FAT16根目录内查找文件 /目录
**
** 输 入: wr : 指向文件信息结构FILE的指针
** 输 出: 在该范围内查找文件,返回FindFlag标识,以便外部程序调用
**         找到的文件/目录在簇内的地址信息记录在FIND结构中
**           A.返回ERR_Check报告异常传输错误
**           B.返回FindFlag为0x00表示未找到文件
**           C.返回FindFlag为0x01表示找到文件
**         
** 全局变量: FAT.RootDirSectors, FAT.FirstRootSector
** 调用模块: CheckFile
** 调试码:   无
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱 
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  CheckFirst16( FILE * wr ) ;

/*********************************************************************************************************
** 函数名称: x16CheckFile
** 功能描述: 在FAT16目录内查找文件
**
** 输 入: wr : 指向文件信息结构FILE的指针
** 输 出: 在该范围内查找文件,返回FindFlag标识,以便外部程序调用
**         找到的文件/目录在簇内的地址信息记录在FIND结构中
**           A.返回ERR_Check报告异常传输错误
**           B.返回FindFlag为0x00表示未找到文件
**           C.返回FindFlag为0x01表示找到文件
**         
** 全局变量: wr -> find.Offset, FAT.SecPerClus, FAT.FirstSectofClu
** 调用模块: x16List, CheckFile
** 调试码:   DEBUG_XCF
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月21日
**-------------------------------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007.9.27
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  x16CheckFile( FILE * wr ) ;

/*********************************************************************************************************
**
**                                 引用变量及函数声明
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

extern UINT8  xdata DISKBUF[ DISKBUF_BYTES ] ;    //磁盘缓冲区
extern UINT8  xdata FILEBUF[ FILEBUF_BYTES ] ;    //文件缓冲区  

extern UINT8  mReadSector( UINT32 StartLba, UINT8 SectCount, PUINT8 DataBuf );
extern UINT8  mWriteSector( UINT32 StartLba, UINT8 SectCount, PUINT8 DataBuf );

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

⌨️ 快捷键说明

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