?? fat.h
字號:
#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 + -