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

📄 fat.h

📁 文件系统,运行硬件环境:单片机,软件环境:keilc
💻 H
📖 第 1 页 / 共 2 页
字号:
#ifndef __FAT_H__
#define __FAT_H__

#ifdef __cplusplus
extern "C" {
#endif
/*
此程序在keil V7.06下编译通过,51MCU下调试通过.
2007-4-11
*/
#define F_FAT_VER           0X13                /*程序版本定义*/

/*包含文件*/
#include <LIMITS.H>                             /*提供类型的大小定义*/
#include "TYPE.H"                               /*完成对类型的定义*/
#include "CH375.H"                              /*提供磁盘操作函数*/
#include "OUT.H"                                /*提供串口输出函数,用于调试*/

/*程序配置*/
/******************************************************************************/
#define FAT_CMD_BUF_LEN     30                  /*命令缓冲区长度(与字节缓冲区共用)从9到256*/
#define FAT_FILE_BUF_LEN    (1*512)             /*文件缓冲区从1*512到255*512*/
#define FAT_CHAIN_LENGTH    20                  /*构建有用簇链表的深度1到255*/
/*以上配置根据需要进行改写*/

/*大小端配置及是否使用DSP*/
#define MCU_USE_BIG_ENDIAN  1                   /*1(CHAR_BIT=8)大端的MCU,0为小端*/
#define MCU_USE_DSP         0                   /*1(CHAR_BIT=16),否则不是*/

/*以下 1为加入对此类型的文件系统支持,0 取消支持,减少占用空间(确定所用磁盘的文件系统
类型时使用)*/
#define F_USE_FAT32         1                   /*是否支持FAT32文件系统*/
#define F_USE_FAT16         1                   /*是否支持FAT16文件系统*/
#define F_USE_FAT12         1                   /*是否支持FAT12文件系统*/

/*其它配置*/
#define F_EN_ADD_EDN        0                   /*1为允许在文件末尾添加数据,0为禁止(只对扇区方式有效)*/
#define F_EN_ENUM_BACK      0                   /*1为允许枚举文件时 调用回调函数,0为禁止*/
#define F_EN_WRITE          1                   /*1为允许写磁盘,0为禁止写*/ 
#define F_EN_BYTE           1                   /*1为允许字节方式操作 0为禁止*/
#define F_RE_TIME           0X03                /*读写扇区重试次数*/

#define F_EN_LONG_NAME      0                   /*1为在fat_fopen时收集长文件名,0为不收集*/

#if     F_EN_LONG_NAME == 1
#define F_LNAME_BUF_LEN     (10*26)             /*存放显示长文件名缓冲区长度从1*26到20*26*/
#endif

/*以下对文件系统配置进行检测*/
#if ((F_USE_FAT32 == 0)&&(F_USE_FAT16 == 0)&&(F_USE_FAT12 == 0))
#error 至少要选择一种文件系统
#endif

#define STATIC static
/******************************************************************************/

/*基础宏定义*/
/******************************************************************************/
#define F_CREATE_NEW        0X00                /*创建一个文件,存在返回错误*/
#define F_CREATE_ALWAYS     0X01                /*文件存在,删除后再建*/

#define F_STRAT_MODE        0X00                /*第一次开始收集有用簇*/
#define F_CONTI_MODE        0X01                /*继续收集有用簇*/

#define F_FALSE             0x00                /*用在初始变量*/
#define F_TRUE              0X01

#define F_TYPE_FAT12        0X01                /*文件系统为FAT12*/
#define F_TYPE_FAT16        0X02                /*文件系统为FAT16*/
#define F_TYPE_FAT32        0X03                /*文件系统为FAT32*/

#define F_FILE_OPENED       0X00                /*文件成功打开*/
#define F_FILE_CLOSED       0X01                /*文件已经关闭*/

#define F_OPEN_FILE         0X00                /*打开文件*/
#define F_OPEN_DIR          0X01                /*打开目录*/

#define F_FIND_DELETEF      0X00                /*发现删除文件*/
#define F_NON_FIND_DELETEF  0X01                /*没有发现删除文件*/

#define F_OPEN_MODE         0X00                /*打开文件模式*/
#define F_FIND_MODE         0X01                /*查找此目录下的第一个删除文件*/

#define F_DIR_NOT_FUL       0X00                /*当前目录还有空间创建文件*/
#define F_DIR_FUL           0x01                /*当前目录没有空间创建文件*/

#define F_DISK_NOT_END      0X00                /*磁盘还有空间可用*/
#define F_DISK_END          0X01                /*磁盘空间用完*/

#define F_GET_A_CLUSTER     0X00                /*得到一个空的簇*/
#define F_GET_CLUSTER_ARRY  0X01                /*构建一个空簇链表*/
#define F_COUNT_FREEC       0X02                /*统计当前有多少可用的簇*/

#define F_FIRST_IN          0X00                /*第一次进入次函数*/
#define F_NOT_FIRST_IN      0X01                /*不是第一次进入此函数*/

#define F_DELETE_FAT        0X00                /*删除FAT表*/
#define F_DESIGN_FAT        0X01                /*构建FAT表*/

/*用于初始化文件系统*/
#define MBR_START_SECTOR    ((UINT32)0)         /*MBR开始扇区地址*/
#define PARTITION_ACTIVE    ((UINT8)0X80)       /*活分区标志*/
#define MAX_CLUSTERS12      ((UINT16)4084)      /*小于则是FAT12*/
#define MAX_CLUSTERS16      ((UINT16)65524)     /*大于则是FAT32*/

#define SECTOR_SIZE         ((UINT16)512)       /*支持分区大小*/
#define DIR_SIZE            ((UINT8)32)         /*支持目录名长度*/

/*文件属性定义*/
#define ATTR_FILE           ((UINT8)0X00)       /*通常属性*/
#define ATTR_READ_ONLY      ((UINT8)0X01)       /*只读属性*/
#define ATTR_HIDDEN         ((UINT8)0X02)       /*隐藏属性*/
#define ATTR_SYSTEM         ((UINT8)0X04)       /*系统属性*/
#define ATTR_VOLUME_ID      ((UINT8)0X08)       /*卷标属性*/
#define ATTR_DIRECTORY      ((UINT8)0X10)       /*目录属性*/
#define ATTR_ARCHIVE        ((UINT8)0X20)       /*存档属性*/
#define ATTR_LFN_ENTRY      ((UINT8)0X0F)       /*长文件名属性*/
#define ATTR_ROOT_DIR       ((UINT8)0X90)       /*根目录属性*/

#define FILE_EMPTY          ((UINT8)0X00)       /*文件空*/
#define FILE_DELETED        ((UINT8)0XE5)       /*文件删除标志*/

/*簇相关定义*/
#define EMPTY_CLUSTER       ((UINT32)0X00000000)  /*空的簇(FAT12/16/32)*/
#define LAST_CLUSTER_12     ((UINT32)0X00000FF7)  /*大于等于此簇为最后一簇FAT12*/
#define LAST_CLUSTER_16     ((UINT32)0X0000FFF7)  /*大于等于此簇为最后一个簇FAT16*/
#define LAST_CLUSTER_32     ((UINT32)0X0FFFFFF7)  /*大于等于此簇为最后一簇(FAT32)*/
#define UPDATE_CLUSTER      ((UINT32)0X0FFFFFFF)  /*用于更新FAT簇*/


/*函数宏*/
#define MDATE( y, m, d )    (((y-1980)<<9) + (m<<5) + d )       /*生成文件时间*/
#define MTIME( h, m, s )    ((h<<11) + (m<<5) + (s>>1) )        /*生产文件日期*/
#define LOW( WD )           ((UINT8)(((UINT16)(WD)) & 0X00FF))  /*得到一个字的低位*/
#define HIGH( WD )          ((UINT8)(((UINT16)(WD)) >> 8))      /*得到一个字的高位*/

#define uchar_read_data(i)    fat_disk_buffer[i]                /*从缓冲区里读取一个字节*/
#define uchar_write_data(i,d) fat_disk_buffer[i]=d              /*缓冲区里写入一个字节*/

/*函数返回定义*/
#define F_OK                0X00                /*正确返回*/
#define F_ERROR             0X01                /*错误返回*/

#define PARAMETER_CMD_ERR   0X02                /*参数错误*/
#define READ_DATA_ERR       0X03                /*读数据出错*/
#define WRITE_DATA_ERR      0X04                /*写数据出错*/
#define NO_FREE_ROOM_ERR    0X05                /*磁盘空间不够*/
#define BUFFER_OVERFLOW_ERR 0X06                /*存放簇链的数组缓冲区溢出错误*/
#define NO_FREE_DIR_ERR     0X07                /*在根目录下没有空间来创建文件(FAT12/16)*/
#define CMDBUF_OVERFLOW_ERR 0X08                /*命令缓冲区溢出错误*/
#define NO_DEF_ADD_ERR      0X09                /*没有允许向文件尾部添加数据*/

#define FILE_EXIST_ERR      0X0A                /*文件或文件夹存在错误*/
#define NOT_FIND_FILE_ERR   0X0B                /*没有发现文件*/
#define NOT_FIND_DIR_ERR    0X0C                /*没有发现目录*/
#define FILE_DIR_FAT_ERR    0X0E                /*文件或目录的FAT表破坏*/
#define FILE_NOT_OC_ERR     0X0F                /*文件没有打开或以关闭错误*/

#define NO_DEF_FAT_ERR      0X10                /*此文件系统支持,但没有使用此文件系统错误*/
#define NO_SUPPORT_FS_ERR   0X11                /*不支持此类型的文件系统*/
#define SET_ENDIAN_ERR      0X13                /*大小端设置错误*/
#define PART_ACTIVE_ERR     0x14                /*MBR分区激活标志错误*/
#define SECTOR_SIZE_ERR     0x15                /*只支持扇区大小为512字节的磁盘*/

#define NO_LONG_NAME_ERR    0X20                /*没有发现长文件名*/
#define BAD_LONG_NAME_ERR   0X21                /*坏的长文件名*/
#define LNAME_BUFF_OVER_ERR 0X22                /*长件名缓冲区溢出错误*/

#define ENUM_FILE_OK        0XFF                /*成功枚举到一个文件*/

                                                /*以下防止初始化不成功*/
#define fat_filesys_check()   if(fat_type_sign ==0) return NO_SUPPORT_FS_ERR;
/******************************************************************************/

/*程序使用全局变量*/
/******************************************************************************/
/*定义结构体类型*/
typedef union
{
    struct
    {
        UINT8   buffer[ FAT_CMD_BUF_LEN ];
    } all;

⌨️ 快捷键说明

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