第37章 基于SD卡的FatFs文件系统
全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn
野火视频教程优酷观看网址:http://i.youku.com/firege
上一章我们已经全面介绍了SD卡的识别和简单的数据读写,也进行了简单的读写测试,不过像这样直接操作SD卡存储单元,在实际应用中是不现实的。SD卡一般用来存放文件,所以都需要加载文件系统到里面。类似于串行Flash芯片,我们移植FatFs文件系统到SD卡内。
对于FatFs文件系统的介绍和具体移植过程参考"基于串行Flash的FatFs文件系统",这里就不做过多介绍,重点放在SD卡与FatFs接口函数编写上。与串行Flash的FatFs文件系统移植例程相比,FatFs文件系统部分的代码只有diskio.c文件有所不同,其他的不用修改,所以一个简易的移植方法是利用原来工程进行修改。下面讲解利用原来工程实现SD卡的FatFs文件系统。
37.1 FatFs移植步骤
上一章我们已经完成了SD卡驱动程序以及进行了简单的读写测试。该工程有很多东西是现在可以使用的,所以我们先把上一章的工程文件完整的拷贝一份,并修改文件夹名为"SDIO-FatFs移植与读写测试",如果此时使用KEIL软件打开该工程,应该是编译无错误并实现上一章的测试功能。
接下来,我们到串行Flash文件系统移植工程文件的"\SPI—FatFs移植与读写测试\User"文件夹下拷贝"FATFS"整个文件夹到现在工程文件的"\SDIO—FatFs移植与读写测试\User"文件夹下,如图 371。该文件夹是FatFs文件系统的所有代码文件,在串行Flash移植FatFs文件系统时我们对部分文件做了修改,这里主要是想要保留之前的配置,而不是使用FatFs官方源码还需要重新配置。

图 371 拷贝FatFs文件夹
现在就可以使用KEIL软件打开"SDIO-FatFs移植与读写测试"工程文件,并把FatFs相关文件添加到工程内,同时把sdio_test.c文件移除,参考图 372。

图 372 FatFs工程文件结构
添加文件之后还必须打开工程选项对话框添加相关路径,参考图 373。

图 373 添加FatFs路径到工程
操作到这来,工程文件结构就算完整了,接下来就是修改文件代码了。这来有两个文件需要修改,为diskio.c文件和main.c文件。main.c文件内容可以参考"SPI—FatFs移植与读写测试"工程中的main.c文件,只有做小细节修改而已。这来重点讲解diskio.c文件,也是整个移植的重点。
37.2 FatFs接口函数
FatFs文件系统与存储设备的连接函数在diskio.c文件中,主要有5个函数需要我们编写的。
宏定义和存储设备状态获取函数
代码清单 371 宏定义和disk_status函数
1 //宏定义
2 #define ATA 0 // SD卡
3 #define SPI_FLASH 1 // 预留外部SPI Flash使用
4 // SD卡块大小
5 #define SD_BLOCKSIZE 512
6
7 //存储设备状态获取
8 DSTATUS disk_status (
9 BYTE pdrv /* 物理编号 */
10 )
11 {
12 DSTATUS status = STA_NOINIT;
13 switch (pdrv) {
14 case ATA: /* SD CARD */
15 status &= ~STA_NOINIT;
16 break;
17
18 case SPI_FLASH: /* SPI Flash */
19 break;
20
21 default:
22 status = STA_NOINIT;
23 }
24 return status;
25 }
FatFs支持同时挂载多个存储设备,通过定义为不同编号以区别。SD卡一般定义为编号0,编号1预留给串行Flash芯片使用。使用宏定义方式给出SD卡块大小,方便修改。实际上,SD卡块大小一般都是设置为512字节的,不管是标准SD卡还是高容量SD卡。
disk_status函数要求返回存储设备的当前状态,对于SD卡一般返回SD卡插入状态,这里直接返回正常状态。
存储设备初始化函数
代码清单 372 disk_initialize函数
1 DSTATUS disk_initialize (
2 BYTE pdrv /* 物理编号 */
3 )
4 {
5 DSTATUS status = STA_NOINIT;
6 switch (pdrv) {
7 case ATA: /* SD CARD */
8 if (SD_Init()==SD_OK) {
9 status &= ~STA_NOINIT;
10 } else {
11 status = STA_NOINIT;
12 }
13
14 break;
15
16 case SPI_FLASH: /* SPI Flash */
17 break;
18
19 default:
20 status = STA_NOINIT;
21 }

2615

被折叠的 条评论
为什么被折叠?



