1. 引言:理解嵌入式系统中的 FATFS 和 SD 卡
随着嵌入式系统在各个领域的日益普及,对高效数据存储解决方案的需求也随之增长。在众多可用的文件系统中,FATFS 因其轻量级特性和对 FAT 文件格式的广泛兼容性而成为嵌入式应用的热门选择 。与此同时,SD 卡已成为嵌入式系统中无处不在的存储介质,其种类繁多,容量各异,满足了各种应用场景的需求 。本报告旨在深入探讨 FATFS 在 SD 卡环境下的应用,涵盖其特性、实现、应用场景、性能、挑战以及与其他文件系统的比较。
FATFS 和 SD 卡在嵌入式系统中的广泛使用表明这两种技术之间存在强大的协同效应。这很可能归因于 FATFS 的设计原则与许多嵌入式应用的资源限制和存储需求高度契合。研究资料始终将 FATFS 描述为专为资源有限的小型嵌入式系统而设计 ,这与通常使用 SD 卡进行扩展存储的设备的典型特征直接相关。此外,SD 卡种类繁多,规格各异,这意味着开发人员需要深入了解这些特性,以便为他们的应用选择合适的卡,并确保与 FATFS 的兼容性。关于 SD 卡类型(SD、SDHC、SDXC、SDUC)及其容量和速度规格的众多资料 强调了选择最佳存储介质所涉及的复杂性。
2.FATFS 文件系统
1、核心架构
FATFS是一个通用的文件系统模块。其核心设计理念是将文件系统层与迪岑的磁盘控制层分离。FATFS 支持 FAT12、FAT16、FAT32 以及可选的 exFAT 文件系统类型 。由于其代码体积小,RAM 使用率低,FATFS 非常适合资源有限的微控制器 。
FATFS 的设计目标是独立于平台和存储介质,通过一个由实现者提供的介质访问接口(磁盘 I/O 层)与物理存储设备进行通信 。
2、主要特性和功能
FATFS提供了全套的API函数,用于文件访问(打开、关闭、读取、写入、定位、截断、同步等);目录访问(打开、关闭、读取目录项、查找第一个/下一个);文件和目录管理(状态、取消链接、重命名、更改属性、更改时间戳、创建目录、更改当前目录、更改当前驱动器、检索当前目录);
上一章的SPI Flash芯片驱动只完成了向物理地址写入数据的工作,而根据文件系统格式的逻辑转换部分则需要额外的代码来完成。 实质上,这个逻辑转换部分可以理解为当我们需要写入一段数据时,由它来求解向什么物理地址写入数据、以什么格式写入及写入一些原始数据以外的信息(如目录)。 这个逻辑转换部分代码我们也习惯称之为文件系统。
所以我们利用前面写好的SPI Flash芯片驱动,把FatFs文件系统代码移植到工程之中, 就可以利用文件系统的各种函数,对SPI Flash芯片以“文件”格式进行读写操作了。
3、FATFS源码
官网:http://elm-chan.org/fsw/ff/00index_e.html
下载后如下:
打开src文件夹,如图:
src文件夹下的源码文件功能简介如下:
- integer.h:文件中包含了一些数值类型定义。
- diskio.c:包含底层存储介质的操作函数,这些函数需要用户自己实现,主要添加底层驱动函数。
- ff.c: FatFs核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的函数,利用这些函数实现文件的读写。
- cc936.c:本文件在option目录下,是简体中文支持所需要添加的文件,包含了简体中文的GBK和Unicode相互转换功能函数。
- ffconf.h: 这个头文件包含了对FatFs功能配置的宏定义,通过修改这些宏定义就可以裁剪FatFs的功能。如需要支持简体中文, 需要把 ffconf.h中的_CODE_PAGE 的宏改成936并把上面的cc936.c文件加入到工程之中。
建议阅读这些源码的顺序为: integer.h –> diskio.c –> ff.c。 阅读文件系统源码ff.c文件需要一定的功底,建议读者先阅读FAT32的文件格式,再去分析ff.c文件。若仅为使用文件系统, 则只需要理解integer.h及diskio.c文件并会调用ff.c文件中的函数就可以了。
4、FATFS结构体图
用户应用程序需要由用户编写,想实现什么功能就编写什么的程序,一般我们只用到f_mount()、f_open()、f_write()、f_read()就可以实现文件的读写操作。
FatFs组件是FatFs的主体,文件都在源码src文件夹中,其中ff.c、ff.h、integer.h以及diskio.h四个文件我们不需要改动,只需要修改ffconf.h和diskio.c两个文件。
3、SDIO - SD卡
1、SDIO简介
微控制器通过两种方式控制SD卡:SPI接口、SDIO接口。
SDIO全称安全数字输入/输出接口,多媒体(MMC)、SD卡、SDI/O都有SDIO接口。STM32F4系列有一个SDIO主机接口。并且一般设计SD I/O卡是可以插入到SD的插槽。
SD卡协会网站 www.sdcard.org 中提供了SD存储卡和SDIO卡系统规范。
2、SD卡物理结构
一张SDka包括:
- 存储单元
- 存储数据的地方。
- 存储单元通过存储单元接口与卡控制单元进行数据传输。
- 存储单元接口
- 电源检测
- 电源检测控制SD卡在一个合适电压环境下。
- 卡及接口控制器
- 控制SD卡的运行状态。
- 包含8个寄存器。
- 接口驱动器。
- 控制引脚的输入输出。
SD卡总共8个寄存器,用于设定和表示SD的信息。这些寄存器只能通过相对因的命令访问。
SD卡的寄存器有些特殊,需要通过命令才能控制,SDIO中设定了64个命令,每个命令都有自己都有的意义。SD卡会根据接收到命令对SD卡进行配置。
3、SDIO总线
SD卡支持SPI和SDIO两种接口。我们治理用到SDIO接口操作方式。
SDIO总线的结构如图,虽然可以共用总线, 但不推荐多卡槽共用总线信号,要求一个单独SD总线应该连接一个单独的SD卡。