源代码下载地址:
http://elm-chan.org/fsw/ff/00index_e.html
========== R0.10b ================================
2014-10-13 升级到 R0.10b版本
1. disk_ioctl() 函数,修复获取有效容量的bug. (U盘和NAND)
*(DWORD*)buff = NAND_FormatCapacity() / 512; /* 必须为可用的扇区个数,不是芯片的理论容量 */
...
2. f_mount() 形式参数变化
3. diskio.h 新增:
/* Definitions of physical drive number for each media */
#define FS_SD 0
#define FS_NAND 1
#define FS_USB 2
/* 用于 R0.10b 新版本 */
#define FS_SD_STR "0:"
#define FS_NAND_STR "1:"
#define FS_USB_STR "2:"
4. #define _CODE_PAGE 936
========== R0.09b================================
本移植记录对应的版本为 R0.09b
1. 直接下载 ff9b.zip 文件,然后解压,将其复制到自己的工程中。
本例子是将其存放在: \User\FatFS\src
2. 在工程配置中添加h文件搜索路径 \User\FatFS\src
3. 在工程中添加2个源代码文件:
ff.c
diskio.c
cc936.c
4. 修改 diskio.c 文件
5. 为了支持长文件名,必须包含 cc936.c 文件,其中 static const WCHAR uni2oem[] 常量数组
是一个GB2312码和UNICODE代码的转换表,会占用程序空间约170K字节。
==========================================
【ffconf.h 修改记录】
(1)#define _CODE_PAGE 932 /* 这是日文编码 */
修改为:
#define _CODE_PAGE 936 /* 这是简体中文编码 */
(2)#define _FS_LOCK 0 修改 3, 可以同时打开3个文件,0表示只能打开1个。
(3)#define _USE_LFN 0 /* 0 to 3 */
修改为
#define _USE_LFN 1 使能长文件名,分配静态内存用于存储长文件名
1: Enable LFN with static working buffer on the BSS. Always NOT reentrant.
(4)在末尾增加 #include "diskio.h"。 主要目的是声明多个磁盘系统的ID(FS_SD和FS_NAND)
(5) #define _VOLUMES 3 【为了同时支持SD卡,NAND Flash 和 USB 三种介质,将 1 修改为 3】
【diskio.c 修改记录】
1. 修改 disk_initialize, 添加SD卡初始化
2. 修改 disk_status, 返回SD卡状态
3. 修改 disk_read,实现读SD卡扇区
4. 修改 disk_write,实现写SD卡扇区
5. 修改 disk_ioctl, 暂时未用
6. 添加函数 : DWORD get_fattime (void);
【diskio.h 修改记录】
1. 文件末尾增加物理磁盘代码
/* Definitions of physical drive number for each media */
#define FS_SD 0
#define FS_NAND 1
#define FS_USB 2
【长文件名问题】
1. 部分文件的属性中只有短文件名 FileInf.fname ,长文件名域 FileInf.lfname 为空
2. ff_mkdir 创建目录时,无论文件名长短,均可以正确读取到长文件名FileInf.lfname
3. f_open 创建文件时,如果文件名长度大于 8.3格式名,则会正确填充FileInf.lfname
【SD_WriteMultiBlocks()函数问题】
1. 在 disk_write 中,如果待写入的 block大于1,可以选择 SD_WriteMultiBlocks()函数加速
但是最后一个形参需要是 count + 1 才能正确写入,否则最后1个扇区的数据将不正确。
【原因待查】
/* 此处存在疑问: 扇区个数如果写 count ,将导致最后1个block无法写入 */
Status = SD_WriteMultiBlocks((uint8_t *)buff, sector << 9 ,SECTOR_SIZE, count + 1);