stm32-SD卡FatFS文件系统

合集下载

STM32+SDIO+FATFS文件系统直读SD卡

STM32+SDIO+FATFS文件系统直读SD卡

STM32+SDIO+FATFS文件系统直读SD卡STM32+SDIO+FATFS文件系统直读SD卡网上关于小型嵌入式的文件系统有好多~当然要数FATFS 很是出名一来小巧,二来免费。

当然了国产的振南的znFAT 一样开源好用而且极其的省资源~!非常适合51单片。

更重要的是国语的支持,呵呵!这次在STM32上为SD卡移植文件系统还是非常简单顺利的,这多亏了ST 官方提供的驱动,而我自己不用动手编写SD卡的命令省了很多时间而且官方做的驱动虽然效率一般但是极其严谨我很是佩服。

FATFS的官方网站是znFAT的官方网站是SD卡可以用SPI驱动也可以直接用SDIO 驱动STM32 256KB FLASH 以上的片子全部都有SDIO,我们当然要用高速快捷的SDIO 方式了!至于 SDIO 又有 1位 4位 8 位的之分我想不来8位SDIO 是怎么回事?SD卡上最多只能接4位嘛~网上有人说4位的SDIO 不好用多半是固件版本太老的缘故了。

呵呵这里还是要靠库~STM32真适合懒人用。

网上关于的FATFS 的文章很多不过都太老旧,很多东西已经不适用了。

我建议阁下到官方去下载最新的版本目前是最新是R0.08b,使用最新的版本好处是很多网上很多要改来改去的地方只要你使用了新版本那就是完全可以规避的。

另外STM32 的SDIO驱动也一定要用最新的,老版本问题很多不少人的失败就在这。

我这次用的是V3.3的库没有任何改动就可以了,现在最新的好像在3.4以上了。

好了说说移植ffconf.h是配置的头文件简单的修改宏就可以了,英文注释的很完全而且网上也有翻译我不多说了自己看主要在这里进行功能裁剪写写我的配置。

#define _FS_TINY 0 /* 0:Normal or 1:Tiny 完整的FATFS 精简版的是Tiny */#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only 能读能写*/#define _FS_MINIMIZE 1 /* 0 to 3 简单的裁剪f_mkdir, f_chmod..这些功能没法用的*//* The _FS_MINIMIZE option defines minimization level to remove some functions.// 0: Full function./ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename/ are removed./ 2: f_opendir and f_readdir are removed in addition to 1./ 3: f_lseek is removed in addition to 2. */#define _USE_STRFUNC 0 /* 0:Disable or 1/2:Enable是否使用字符串文件接口 *//* To enable string functions, set _USE_STRFUNC to 1 or 2. */#define _USE_MKFS 0 /* 0:Disable or 1:Enable 制作文件系统我在PC上一般已经格式化好了*//* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */#define _USE_FORWARD 0 /* 0:Disable or 1:Enable 发文件流?*//* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable 搜索*//* To enable fast seek feature, set _USE_FASTSEEK to 1. */#define _CODE_PAGE 1 / /1 - ASCII only (Valid for non LFN cfg.)#define _USE_LFN 0 /* 0 to 3 */#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) 这些都是长文件名或是汉字文件支持很费资源所以不开启这些*/#define _FS_SHARE 0 /* 0:Disable or >=1:Enable 不使用相对路径*/#define _FS_SHARE 0 /* 0:Disable or >=1:Enable 文件共享多任务的操作系统会用到的*/#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable 这些是啥用?同步什么呢?默认就好了*/#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */#define _SYNC_t HANDLE /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */integer.h主要定义了文件的类型若是最新的可以不用修改。

STM32F407移植FATFS文件系统(版本R0.09b)到SD卡(硬件SPI总线)

STM32F407移植FATFS文件系统(版本R0.09b)到SD卡(硬件SPI总线)

STM32F407移植FATFS⽂件系统(版本R0.09b)到SD卡(硬件SPI总线)⼀、序⾔经常在⽹上、群⾥看到很多⼈问关于STM32的FATFS⽂件系统移植的问题,刚好⾃⼰最近的⼯程项⽬需要使⽤SD卡,为了让⼤家少⾛弯路,我把我的学习过程和⽅法贡献给⼤家。

⼆、SD卡简介安全数字卡(简称SD卡),最初引进应⽤于⼿持式可携带电⼦产品,在⼀个⼩尺⼨产品上可靠的存储数据,如移动电话,数码相机等。

1、SD卡简介请参考如下博⽂2、SD卡种类请参考如下博⽂3、SD卡简介和种类请参考如下博⽂4、MMC、SD、TF、SDIO、SDMMC简介三、SD卡总线协议简介SD卡⽀持2种总线协议,即SDIO总线协议和SPI总线协议。

SDIO总线协议速度快,SPI总线相对SDIO总线速度要慢很多,但是⽬前市⾯上很多单⽚机不⽀持SDIO总线协议,只有中⾼端单⽚机(例如:STM32F407)才⽀持SDIO总线协议。

1、SDIO总线协议利⽤该总线协议,可以使⽤最多四条数据线实现主机与SD卡之间的数据传输,所以速度相对⽽⾔可以达到最⾼,但是需要主机具有SDIO控制器,才可以使⽤该协议。

2、SPI总线协议如果主机不⽀持SDIO协议,那么可以使⽤SPI协议对SD卡进⾏操作。

虽然速度⽐SDIO慢,但是硬件上更加简单,只需要四根线便可以实现与SD卡进⾏通讯。

3、SDIO协议与SPI协议的⽐较SDIO协议与SPI协议相较⽽⾔,SDIO协议读写SD卡的速度更快,再加上其⽀持4线模式,即利⽤4条数据线,同时发送4Bits数据,数据的传输效率就更⾼了,但是由于使⽤的引脚较多,所以也导致了控制相对⽐较困难。

⽽SPI外设只具有两条数据线MISO和MOSI,分别⽤作数据的输⼊和输出,由于引脚较少,所以控制相对较容易。

但是,数据的传输效率相对⽽⾔就⽐较低了。

但是,两中协议的共同之处在于:均是通过命令实现对SD卡的控制,仍然是结合状态机实现编程。

4、SD卡如何⼯作在SPI模式下当SD卡上电之后,只有第⼀次发送的CMD0命令才可以选择SD卡⼯作在SPI模式下。

stm32sdiofatfs文件系统源码分析

stm32sdiofatfs文件系统源码分析

、概述1、目的在移植之前,先将源代码大概的阅读一遍,主要是了解文件系统的结构、各个函数的功能和接口、与移植相关的代码等等。

2、准备工作在官方网站下载了0.07c 版本的源代码,利用记事本进行阅读。

二、源代码的结构1、源代码组成源代码压缩包解压后,共两个文件夹,doc是说明,src里就是代码。

src文件夹里共五个文件和一个文件夹。

文件夹是option,还有OOreadme.txt、diskio.c、diskio.h、ff.c、ff.h、integer.h。

对比网上的文章,版本已经不同了,已经没有所谓的tff.c 和tff.h 了,估计现在都采用条件编译解决这个问题了,当然文件更少,可能编译选项可能越复杂。

2、00readme.txt 的说明Low level disk I/O module is not included in this archive because the FatFsmodule is only a generic file system layer and not depend on any specificstorage device. You have to provide a low level disk I/O module that writtento control your storage device .主要是说不包含底层10代码,这是个通用文件系统可以在各种介质上使用。

我们移植时针对具体存储设备提供底层代码。

接下来做了版权声明-可以自由使用和传播。

然后对版本的变迁做了说明。

3、源代码阅读次序先读integer.h,了解所用的数据类型,然后是ff.h, 了解文件系统所用的数据结构和各种函数声明,然后是diskio.h,了解与介质相关的数据结构和操作函数。

再把ff.c和diskio.c两个文件所实现的函数大致扫描一遍。

最后根据用户应用层程序调用函数的次序仔细阅读相关代码。

stm32-SD卡FatFS文件系统

stm32-SD卡FatFS文件系统

stm32-SD卡FatFS文件系统STM32平台SD卡的FatFS文件系统开发系统平台:STM32系列的STM32F103ZESPI方式与SD卡通信SD上移植FatFS系统1 FatFS文件系统1.1 FatFS简介FatFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块。

FatFs 的编写遵循ANSI C,并且完全与磁盘I/O 层分开。

因此,它独立(不依赖)于硬件架构,可以被嵌入到低成本的微控制器中,如A VR, 8051, PIC, ARM, Z80, 68K 等等,而不需要做任何修改。

特点:Windows兼容的FAT文件系统不依赖于平台,易于移植代码和工作区占用空间非常小多种配置选项多卷(物理驱动器和分区)多ANSI/OEM代码页,包括DBCS在ANSI/OEM或Unicode中长文件名的支持RTOS的支持多扇区大小的支持只读,最少API,I/O缓冲区等等1.2 FatFS文件系统移植FatFS文件系统移植需要的几个关键文件如下。

●ff.c(不动)文件系统的实现代码,里面主要是FatFS文件系统源码,移植的时候不需要修改;●diskio.h(不动)声明diskio.c文件中需要的一些接口函数和命令格式;●diskio.c(自写)这个文件是文件系统底层和SD驱动的中间接口的实现代码,移植的时候需要改写在diskio.h中声明的那几个函数,代码在ff.c中被调用;●integer.h(微改)这是FatFS用到的数据类型定义,按移植的平台修改;●ff.h(不动)是FatFS的文件系统的函数(在ff.c中)声明,以及一些选项的配置,具体选项及详细说明在文件中都有;●ffconf.h(按需要)这个是在FatFS的0.08a版本中有看到,0.06版本中还没有,是关于FatFS系统模块的一些配置;综上,需要修改的就是diskio.c文件,主要是6个函数,描述如下。

为STM32移植FATFS读取SD卡上FAT121632文件系统

为STM32移植FATFS读取SD卡上FAT121632文件系统

给stm32移植fatfs文件系统,今天终于取得阶段性胜利。

只需要提供这样几个函数即可[plain]view plaincopyprint?1.DSTATUS disk_initialize (BYTE);2.DSTATUS disk_status (BYTE);3.DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE);4.DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE); // 如果实现只读的文件系统就不需要了。

5.DRESULT disk_ioctl (BYTE, BYTE, void*);移植成功后,可以用如下方式读取SD卡了,实在太方便了,和PC机上编程差不了多少。

[csharp]view plaincopyprint?1.unsigned int i;2. BYTE buffer[512]; // file copy buffer3. FATFS fs; // Work area (file system object) for logical drive4. FIL fsrc; // file objects5. FRESULT res; // FatFs function common result code6. UINT br; // File R/W count7. USART1_Puts("Now, I'll read file 'i2c/uart.lst'.\n");8.9.// Register a work area for logical drive 010. f_mount(0, &fs);11.12.// Open source file13. res = f_open(&fsrc, "i2c/uart.lst", FA_OPEN_EXISTING | FA_READ);14.if (res)15. {16. USART1_Puts("Can't open i2c/uart.lst for read. :-(\n");17.goto exit;18. }19.20.for (;;) {21. res = f_read(&fsrc, buffer, sizeof(buffer), &br);22.if (res || br == 0) break; // error or eof23.for( i = 0; i < br; ++i )24. USART1_Putc(buffer[i]);25. }26.27. f_close(&fsrc);28.xit:29.// Unregister a work area before discard it30. f_mount(0, NULL);。

在STM32中移植FATFS文件系统

在STM32中移植FATFS文件系统

STM32的FATFS文件系统移植笔记一、序言经常在网上、群里看到很多人问关于STM32的FATFS文件系统移植的问题,刚好自己最近也在调试这个程序,为了让大家少走弯路,我把我的调试过程和方法也贡献给大家。

二、FATFS简介FatFs Module是一种完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计。

它完全用标准C语言编写,所以具有良好的硬件平台独立性,可以移植到8051、PIC、AVR、SH、Z80、H8、ARM等系列单片机上而只需做简单的修改。

它支持FATl2、FATl6和FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对8位单片机和16位单片机做了优化。

三、移植准备1、FATFS源代码的获取,可以到官网下载:/fsw/ff/00index_e.html最新版本是R0.09版本,我们就移植这个版本的。

2、解压文件会得到两个文件夹,一个是doc文件夹,这里是FATFS的一些使用文档和说明,以后在文件编程的时候可以查看该文档。

另一个是src文件夹,里面就是我们所要的源文件。

3、建立一个STM32的工程,为方便调试,我们应重载printf()底层函数实现串口打印输出。

可以参考已经建立好的printf()打印输出工程:.viewtool./bbs/foru ...d=77&extra=page%3D1四、开始移植1、在已经建立好的工程目录User文件夹下新建两个文件夹,FATFS_V0.09和SPI_SD_Card,FATFS_V0.09用于存放FATFS源文件,SPI_SD_Card用于存放SPI的驱动文件。

2、如图1将ff.c添加到工程文件夹中,并新建diskio.c文件,在diskio.c文件中实现五个函数:1.DSTATUS disk_initialize (BYTE);//SD卡的初始化2. DSTATUS disk_status (BYTE);//获取SD卡的状态,这里可以不用管3. DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE);//从SD卡读取数据4. DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE);//将数据写入SD卡,若该文件系统为只读文件系统则不用实现该函数5. DRESULT disk_ioctl (BYTE, BYTE, void*);//获取SD卡文件系统相关信息6.复制代码<IGNORE_JS_OP>图13、初步实现以上五个函数FATFS初始化函数:1.DSTATUS disk_initialize (2.BYTE drv /* Physical drive nmuber (0..) */3. )4. {5.switch (drv)6.{7. case 0 :8. return RES_OK;9. case 1 :10. return RES_OK;11. case 2 :12. return RES_OK;13. case 3 :14. return RES_OK;15. default:16. return STA_NOINIT;17.}18. }复制代码1.DSTATUS disk_status (2.BYTE drv /* Physical drive nmuber (0..) */3. )4. {5.switch (drv)6.{7. case 0 :8. return RES_OK;9. case 1 :10. return RES_OK;11. case 2 :12. return RES_OK;13. default:14. return STA_NOINIT;15.}16. }复制代码FATFS底层读数据函数:1.DRESULT disk_read (2.BYTE drv, /* Physical drive nmuber (0..) */3.BYTE *buff, /* Data buffer to store read data */4.DWORD sector, /* Sector address (LBA) */5.BYTE count /* Number of sectors to read (1..255) */6. )7. {8.if( !count )9.{10. return RES_PARERR; /* count不能等于0,否则返回参数错误*/11.}12.switch (drv)13.{14. case 0:15.if(count==1) /* 1个sector的读操作*/16.{17.return RES_OK;18.}19.else /* 多个sector的读操作*/20.{21.return RES_OK;22.}23. case 1:24.if(count==1) /* 1个sector的读操作*/25.{26.return RES_OK;27.}28.else /* 多个sector的读操作*/29.{30.return RES_OK;31.}32.33. default:34. return RES_ERROR;35.}36. }复制代码FATFS底层写数据函数:1.DRESULT disk_write (2.BYTE drv, /* Physical drive nmuber (0..) */3.const BYTE *buff, /* Data to be written */4.DWORD sector, /* Sector address (LBA) */5.BYTE count /* Number of sectors to write (1..255) */6. )7. {8.if( !count )9.{10. return RES_PARERR; /* count不能等于0,否则返回参数错误*/11.}12.switch (drv)13.{14. case 0:15.if(count==1) /* 1个sector的写操作*/16.{17.return RES_OK;18.}19.else /* 多个sector的写操作*/20.{21.return RES_OK;22.}23. case 1:24.if(count==1) /* 1个sector的写操作*/25.{26.return RES_OK;27.}28.else /* 多个sector的写操作*/29.{30.return RES_OK;31.}32.33. default:return RES_ERROR;34.}35. }复制代码FATFS磁盘控制函数:1.DRESULT disk_ioctl (2.BYTE drv, /* Physical drive nmuber (0..) */3.BYTE ctrl, /* Control code */4.void *buff /* Buffer to send/receive control data */5. )6. {7.if (drv==0)8.{9. switch (ctrl)10. {11. case CTRL_SYNC :12.return RES_OK;13. case GET_SECTOR_COUNT :14. return RES_OK;15. case GET_BLOCK_SIZE :16. return RES_OK;17. case CTRL_POWER :18.break;19. case CTRL_LOCK :20.break;21. case CTRL_EJECT :22.break;23. /* MMC/SDC command */24. case MMC_GET_TYPE :25.break;26. case MMC_GET_CSD :27.break;28. case MMC_GET_CID :29.break;30. case MMC_GET_OCR :31.break;32. case MMC_GET_SDSTAT :33.break;34. }35. }else if(drv==1){36. switch (ctrl)37. {38. case CTRL_SYNC :39.return RES_OK;40. case GET_SECTOR_COUNT :41. return RES_OK;42. case GET_SECTOR_SIZE :43.return RES_OK;44. case GET_BLOCK_SIZE :45. return RES_OK;46. case CTRL_POWER :47.break;48. case CTRL_LOCK :49.break;50. case CTRL_EJECT :51.break;52. /* MMC/SDC command */53. case MMC_GET_TYPE :54.break;55. case MMC_GET_CSD :56.break;57. case MMC_GET_CID :58.break;59. case MMC_GET_OCR :60.break;61. case MMC_GET_SDSTAT :62.break;63. }64.}65.else{66. return RES_PARERR;67.}68.return RES_PARERR;69. }复制代码以上函数都只是实现一个框架,并没有做实际的事情,下一步就需要把操作SD卡的程序填充在这个框架里面。

stm32 fatfs 中文编码

stm32 fatfs 中文编码

stm32 fatfs 中文编码摘要:1.STM32概述2.FATFS简介3.中文编码概述4.STM32中实现FATFS中文编码的方案5.应用实例及代码分析6.总结与展望正文:一、STM32概述STM32是意法半导体(STMicroelectronics)公司推出的一款基于ARM Cortex-M内核的微控制器(Microcontroller Unit,MCU)。

STM32具有高性能、低功耗、多功能、易扩展等特点,广泛应用于各种嵌入式系统中。

二、FATFS简介FATFS(FAT File System,文件系统)是一种通用的、基于FAT(File Allocation Table,文件分配表)结构的文件系统,主要用于管理存储设备上的文件和目录。

在嵌入式系统中,FATFS常用于闪存、SD卡等存储介质的管理。

三、中文编码概述中文编码是一种将中文文字转换为计算机内部存储和处理的形式。

目前常用的中文编码有GBK、GB18030、UTF-8等。

其中,GBK是我国自主研发的一种编码方式,主要适用于简体中文环境;GB18030是我国规定的另一种汉字编码标准,支持GBK以外的汉字;UTF-8是一种跨平台的编码方式,支持多种语言,包括中文。

四、STM32中实现FATFS中文编码的方案在STM32嵌入式系统中,实现FATFS中文编码主要通过以下几种方式:1.使用GBK编码:在系统初始化时,设置FATFS的相关参数,如文件名编码方式为GBK。

同时在创建、读取、写入等操作中,使用GBK编码进行字符串处理。

2.使用UTF-8编码:与GBK编码类似,在系统初始化时,设置FATFS的相关参数,如文件名编码方式为UTF-8。

同时在创建、读取、写入等操作中,使用UTF-8编码进行字符串处理。

3.自定义中文编码:针对特定应用场景,可以自定义一种适用于中文的编码方式。

在FATFS中,通过编写相应的处理函数,实现对中文文件名的存储和读取。

STM32笔记(六)SD卡的读写和FatFS文件系统

STM32笔记(六)SD卡的读写和FatFS文件系统

STM32笔记(六)SD卡的读写和FatFS文件系统因为要用,学习了一下SPI操作SD卡,同时移植了一个免费开源的FAT文件系统:FatFS。

感觉挺好,在单片机上实现了读写文件的操作,接下来就可以解释我的G代码咯!我的SD卡底层操作参考了网上几种常见的代码,但又对其结构做了一定的优化,至少看起来用起来比较方便。

既可以作为文件系统的diskio使用,也可以直接使用底层函数,把SD卡作为一块flash读写。

FatFs文件系统体积蛮小,6-7K足矣,对于128Kflash的STM32来说很合适,代价不大。

同时可移植性很高,最少只需要4个函数修改既可以实现文件系统的移植。

相关文件系统的介绍请看这里。

这里给一套比较完整的参考资料,包括fatfs文件系统的原版资料、几个重要的手册和网上下载的代码。

/bbs/bbs_content.jsp?bbs_sn=3210864&bbs_page_no=1&bbs_id=3020 下面是我的代码:其中底层的SPI总线对SD卡的操作在SPI_SD_driver.c/h中,而FATFS的移植文件diskio.c中对磁盘的操作函数中将调用底层的操作函数。

下面是一些底层操作函数:u8 SPI_ReadWriteByte(u8 TxData); //SPI总线读写一个字节u8 SD_WaitReady(void); //等待SD卡就绪u8 SD_SendCommand(u8 cmd, u32 arg, u8 crc); //SD卡发送一个命令u8 SD_SendCommand_NoDeassert(u8 cmd, u32 arg, u8 crc); //SD卡发送一个命令,不断线u8 SD_Init(void); //SD卡初始化u8 SD_ReceiveData(u8 *data, u16 len, u8 release); //SD卡读数据u8 SD_GetCID(u8 *cid_data); //读SD卡CIDu8 SD_GetCSD(u8 *csd_data); //读SD卡CSDu32 SD_GetCapacity(void); //取SD卡容量u8 SD_ReadSingleBlock(u32 sector, u8 *buffer); //读一个sectoru8 SD_WriteSingleBlock(u32 sector, const u8 *buffer); //写一个sectoru8 SD_ReadMultiBlock(u32 sector, u8 *buffer, u8 count); //读多个sectoru8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count); //写多个sector这是diskio.c中的一段代码,在disk初始化中,我们调用了SPI_SD_driver.c中的SD卡初始化函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32平台SD卡的FatFS文件系统开发
系统平台:
STM32系列的STM32F103ZE
SPI方式与SD卡通信
SD上移植FatFS系统
1 FatFS文件系统
1.1 FatFS简介
FatFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块。

FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开。

因此,它独立(不依赖)于硬件架构,可以被嵌入到低成本的微控制器中,如A VR, 8051, PIC, ARM, Z80, 68K 等等,而不需要做任何修改。

特点:
∙Windows兼容的FAT文件系统
∙不依赖于平台,易于移植
∙代码和工作区占用空间非常小
∙多种配置选项
∙多卷(物理驱动器和分区)
∙多ANSI/OEM代码页,包括DBCS
∙在ANSI/OEM或Unicode中长文件名的支持
∙RTOS的支持
∙多扇区大小的支持
∙只读,最少API,I/O缓冲区等等
1.2 FatFS文件系统移植
FatFS文件系统移植需要的几个关键文件如下。

●ff.c(不动)文件系统的实现代码,里面主要是FatFS文件系统源码,移植的时候
不需要修改;
●diskio.h(不动)声明diskio.c文件中需要的一些接口函数和命令格式;
●diskio.c(自写)这个文件是文件系统底层和SD驱动的中间接口的实现代码,移
植的时候需要改写在diskio.h中声明的那几个函数,代码在ff.c中被调用;
●integer.h(微改)这是FatFS用到的数据类型定义,按移植的平台修改;
●ff.h(不动)是FatFS的文件系统的函数(在ff.c中)声明,以及一些选项的配
置,具体选项及详细说明在文件中都有;
●ffconf.h(按需要)这个是在FatFS的0.08a版本中有看到,0.06版本中还没有,是
关于FatFS系统模块的一些配置;
综上,需要修改的就是diskio.c文件,主要是6个函数,描述如下。

DSTATUS disk_initialize (BYTE pdrv /* Physical drive nmuber (0..) */) 初始化函数,调用编写的SD卡初始化函数,成功返回0,失败返回其它。

DSTATUS disk_status (BYTE pdrv /* Physical drive nmuber (0..) */) 设备状态函数,只支持一个设备,若pdrv大于0,则返回错误;否则返回SD的状态,若初始化成功,返回0,否则其它。

DRESULT disk_read (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE *buff, /* Data buffer to store read data */
DWORD sector, /* Sector address (LBA) */
BYTE count /* Number of sectors to read (1..128) */
)
读函数,传入的参数是设备名称,用于保存读到的数据的缓存,扇区地址,扇区个数。

分为一个扇区和多个扇区,两者需要给SD卡发送不同的命令。

DRESULT disk_write (
BYTE pdrv, /* Physical drive nmuber (0..) */
const BYTE *buff, /* Data to be written */
DWORD sector, /* Sector address (LBA) */
BYTE count /* Number of sectors to write (1..128) */
)
写函数,传入的参数是设备名称,要写的数据地址,扇区地址,扇区个数。

同样分为一个扇区和多个扇区,两者给SD卡发送的命令也不一样。

DWORD get_fattime (void)
用于获取系统当前的unix时间。

DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
这是个混合功能函数,用于IO口的控制,传入的参数第一个是设备名称,第二个是命令,第三个是命令是读/写时返回的数据缓存。

2 实现文件的读写
2.1 实现读取
在SD中根目录下有一个MyLog文件夹,文件夹内有一个名为123.txt的文件,要去取其中的内容,并通过串口输出,代码如下。

2.2 实现写入
写入时,直接调用f_write函数,需要说明的是,此函数只能完成将数据写入到SD卡的扇区中,实际在Windows下仍然看不到内容。

必须要执行f_sync(&fsrc),将内容同步到文件,这样才能看到文件中的内容,主要代码如下。

相关文档
最新文档