关于FATFS的使用记录
一、提前说明
-
FatFs 应用范围:
支持FAT12、FAT16 和FAT32; 可打开的文件:无限制,依赖于有效的存储器; 支持最多 10 个卷; 文件大小:与FAT 类型有关(upto 4G-1 bytes); 卷大小:与FAT 类型有关(upto 2T bytes on 512 bytes/sector); 簇大小:与FAT 类型有关(upto 64K bytes on 512bytes/sector); 扇区大小:与FAT 类型有关(upto 4K bytes)。
-
FAT文件系统依次为:引导扇区、两个文件分配表、根目录区和数据区。
-
重要的结构体:
- 文件对象结构体(FIL类型):存放文件的相关信息,打开关闭读写文件等操作时需要使用其指针 ;
- 目录对象结构体(DIR类型):存放目录的相关信息,对目录操作时需要其指针 ;
- 文件状态结构体(FILINFO类型):存放文件的大小属性文件名等信息;
- 文件系统对象结构体(FATFS类型):文件系统对象的参数。
-
移植步骤:
- 数据类型:在integer.h 里面去定义好数据的类型。这里需要了解你用的编译器的数 据类型,并根据编译器定义好数据类型;
- 配置:打开 ffconf.h (我用的FatFs,不是Tiny,可以在此头文件中进行定义),文 件系统的配置裁剪等均在此头文件中进行定义配置;
- 函数编写:打开diskio.c,进行底层驱动编写,实际上需要编写6 个接口函数(见下方函数具体说明)。
二、各文件说明
文件名 | 功能 | 操作说明 |
---|---|---|
ffconf.h | FATFS模块配置文件 | 需要根据需求来配置参数 |
ff.h | FATFS和应用模块公用的包含文件 | 不需要修改 |
ff.c | FATFS模块源码 | 不需要修改 |
diskio.h | FATFS和disk I/O模块公用的包含文件 | 不需要修改 |
diskio.c | FATFS和disk I/O模块接口层文件 | 与平台相关的代码,需要用户根据平台和存储介质来编写函数 |
interger.h | 数据类型定义 | 与编译器有关 |
三、使用说明
3.1 diskio.c函数的编写
1、disk_initialize初始化磁盘驱动器
2、disk_status返回当前磁盘驱动器的状态
3、disk_read 从磁盘驱动器上读取扇区
4、disk_write 向磁盘写入一个或多个扇区
5、disk_ioctl 控制设备指定特性和除了读/写外的杂项功能
6、get_fattime 获取当前时间
3.2 f_open读写性质说明
f_open:创建/打开一个用于访问文件的文件对象
3.3 ff的API函数
FATFS给用户提供了大量的API函数:
函数名称 | 函数作用 |
---|---|
f_mount | 注册/注销一个工作区域(Work Area) |
f_open | 打开/创建一个文件 |
f_close | 关闭一个文件 |
f_read | 读文件 |
f_write | 写文件 |
f_lseek | 移动文件读/写指针 |
f_truncate | 截断文件 |
f_sync | 冲洗缓冲数据Flush Cached Data |
f_forward | 直接转移文件数据到一个数据流 |
f_stat | 获取文件状态 |
f_opendir | 打开一个目录 |
f_closdir | 关闭一个已经打开的目录 |
f_readdir | 读取目录条目 |
f_mkdir | 创建一个目录 |
f_unlink | 删除一个文件或目录 |
f_chmod | 改变属性(Attribute) |
f_utime | 改变时间戳(Timestamp) |
f_rename | 重命名/移动一个文件或文件夹 |
f_chdir | 改变当前目录 |
f_chdrive | 改变当前驱动器 |
f_getcwd | 获取当前工作目录 |
f_getfree | 获取空闲簇Get Free Clusters |
f_getlabel | 获取卷标签 |
f_setlabel | 设置卷标签 |
f_mks | 在驱动器上创建一个文件系统 |
f_fdisk | 分割物理卷 |
f_gets | 读一个字符串 |
f_putc | 写一个字符 |
f_puts | 写一个字符串 |
f_printf | 写一个格式化的字符串 |
f_tell | 获取当前读/写指针 |
f_eof | 测试文件结束 |
f_size | 获取文件大小 |
f_error | 测试文件上的错误 |
四、关于SD卡协议与FatFs系统的单位解释
如果使用SD卡,那么在SD2.0协议中明明说block为512字节(bytes)。
那为什么在FatFs中,sector size才是512字节呢?这不是错了吗?
其实文件系统的sector和block 与 SD协议的sector和block含义正好相反。
- 在SD协议中,大小包含关系是:block ⊆ sector;
- 而在FatFs中相反:sector ⊆ blockr。
由此可知,在disk_ioctl中GET_SECTOR_SIZE和GET_BLOCK_SIZE,可以有以下关系:
- 最大:8192 (4096kb / 512bytes)data blocks(SD) == 8192 sector(FatFs) == 1 block(FatFs)
- 最小:1 data blocks(SD) == 1 sector(FatFs) == 1 block(FatFs)
– | block | section |
---|---|---|
SD | a number of bytes, basic data transfer unit | a number of blocks, basic erase unit |
FATFS | A “block”, a contiguous number of bytes, is the minimum unit of memory that is read from and written to a disk by a disk driver | The sector is the minimum storage unit of a hard drive |