概念先行:
FATFS是面向小型嵌入式系统的一种通用的FAT文件系统,
它由ANSI C语言编写且完全独立于底层的I/O介质,
因此它可以很容易的不加修改的移植到其他处理器当中,
就可以利用文件系统的各种函数,对已格式化的SD卡的文件进行读写。
源码官网下载:网址 源码理解:
解压文件会得到两个文件夹,一个是doc文件夹,这里是FATFS的一些使用文档和说明,以后在文件编程的时候可以查看该文档。另一个是src文件夹,里面就是我们所要的源文件。
src文件夹下的源码文件功能简介如下:
integer.h:文件中包含了一些数值类型定义。
diskio.c:包含底层驱动介质的操作函数,这些函数需要用户自己去实现,主要添加底层驱动函数。
ff.c:独立于底层介质操作文件的函数,利用这些函数实现文件的读写。
cc936.c:本文件在option目录下,是简体中文支持所需要添加的文件,包含了简体中文的GBK和转换函数。
ffconf.h:这个头文件包含了对文件系统的各种配置,类似stm32f10x_conf.h在STM32库中的功能。
如需要支持简体中文, 修改#define _USE_LFN 2 和需要把ffconf.h中的_CODE_PAGE的宏改成936,并把上面的cc936.c文件加入到工程之中。
若仅为使用文件系统,则只需要理解integer.h及diskio.c文件,并会调用ff.c中的函数就可以了。
挂载文件系统时需要了解的sd卡初始化步骤:
disk_initialize():该函数在挂载文件系统的时候会被调用,主要是实现读写SD卡前对SD卡进行初始化,根据SD卡的传输协议,我们按照如下步骤初始化SD卡:
a、判断SD卡是否插入,可以通过检查SD卡卡座的CD脚电平进行判断,一般插入卡后该引脚会变成低电平。
b、稍微延时一段时间后发送至少74个时钟给SD卡。
c、发送CMD0命令给SD卡,直到SD卡返回0x01为止,这里可以循环多次发送。
d、发送CMD8获取卡的类型,不同类型的卡其初始化方式有所不同。
e、根据卡的类型对卡进行初始化。
注:
在初始化SD卡之前应该初始化SPI接口和相关的管脚。
成功打开文件后一定要调用f_close()函数,否则数据无法写入SD卡中。
移植步骤:
为移植 FatFs 方便,我们直接拷贝一份 SPI Flash芯片驱动程序 工程,我们在工程基础上添加 FatFs 组件,并修改 main 函数的用户程序即可
1–先拷贝一份 SPI Flash 芯片测试的工程文件(整个文件夹),并修改文件夹名为“SPI—FatFs 文件系统”。将 FatFs 源码中的 src 文件夹整个文件夹拷贝一份至“SPI—FatFs 文件系统\USER\”文件夹下并修改名为“FATFS”。
2–使用 KEIL 软件打开工程文件(…\SPI—FatFs 文件系统\Project\RVMDK(uv5)\ BHF103.uvprojx),并将 FatFs 组件文件添加到工程中,需要添加有 ff.c、 diskio.c 和cc936.c 三个文件。
3–添加 FATFS 文件夹到工程的 include 选项中。打开工程选项对话框,选择“ C/C++”选项下的“ Include Paths”项目,在弹出路径设置对话框中选择添加“FATFS”文件夹。
4–如果现在编译工程,可以发现有两个错误,一个是来自 diskio.c 文件,提示有一些头文件没找到, diskio.c 文件内容是与底层设备输入输出接口函数文件,
不同硬件设计驱动就不同,需要的文件也不同;另外一个错误来自 cc936.c 文件,提示该文件不是工程所必需的,这是因为 FatFs 默认使用日语,
我们想要支持简体中文需要修改 FatFs 的配置,即修改 ffconf.h 文件。
至此,将 FatFs 添加到工程的框架已经操作完成,接下来要做的就是修改 diskio.c 文件和 ffconf.h 文件。
5-底层设备驱动函数是存放在 diskio.c 文件,我们的目的就是把 diskio.c 中的函数接口与SPI Flash 芯片驱动连接起来。
总共有五个函数,分别为设备状态获取(disk_status)、设备初始化(disk_initialize)、扇区读取(disk_read)、扇区写入(disk_write)、其他控制(disk_ioctl)。
PS:移植中我们需要注意修改:
a:对于SD卡等储存介质,我们需要了解,它一般有两个地址,意识物理地址,另外一个是逻辑地址,逻辑地址就是在物理地址的基础上加上偏移量,
b:我们在移植中只需要修改diskio.c和ffconf.h文件
c:支持简体中文需要把ffconf.h中的_CODE_PAGE的宏修改为936
并把cc936.c加入工程中
|