[原创] 【M4开发板Hanker试用狂-Shower.Xu】7、有规有据有系统-Fatfs读写flash

shower.xu   2012-6-1 14:25 楼主
FatFs is a generic FAT file system module for small embedded systems.
FatFs的作者写了两个,一个是正宗的FatFs,比较适合大的RAM的设备,另一个是FatFs/Tiny,比较适合小RAM的系统,比如单片机,FatFs/Tiny占用较小的RAM,代价是更慢的读写速度和更少的API函数。不过两个都支持FAT12,FAT16,FAT32文件系统。
我们把源代码下载下来,最新的版本应该是0.09.下载下来的ff9.zip有两个文件夹,一个是 doc ,FatFs的说明,包括特性,系统函数,以及可能的一些问题,另一个就是源代码文件夹src了,diskio.c和diskio.h是硬件层,ff.c和ff.h是FatFs的文件系统层和文件系统的API层,integer.h是文件系统所用到的数据类型的定义,还有一个00readme.txt简要的介绍了FatFSHE FatFs/Tiny,包括他们所支持的API,怎么配置等等。

写底层的驱动函数,包括:

disk_initialize - Initialize disk drive

disk_status - Get disk status

disk_read - Read sector(s)

disk_write - Write sector(s)

disk_ioctl - Control device dependent features

get_fattime - Get current time

所有的函数都牵涉到了选择第几个磁盘的问题,如果仅仅用一个,可以不必理会这个drv 参数。

简单移植的话以下三个函数是必须的

disk_initialize 

disk_read - Read sector(s)

disk_write - Write sector(s)

即初始化和读写扇区函数,其它可以简单返回0即可

读写扇区,注意参数哦!





部分说明来自网络,写文苦手啊。


程序说明:
运行会先判断是否存在test.txt文件?
如果存在,读出并显示。
如果不存在,询问是否要格式化?
是,会先格式化flash,再创建文件,写入文字。
读出文件内容并显示

计算空间占用。(没调好,不准确)


运行图片
运行图片


视频在这里
[media]http://www.tudou.com/v/Gtx26hc-c20/&rpid=100900070&resourceId=100900070_04_05_99/v.swf[/media]


源代码在这里
3.16 SPI_Fatfs ok.rar (92.67 KB)
(下载次数: 42, 2012-6-1 14:25 上传)

[ 本帖最后由 shower.xu 于 2012-6-2 10:01 编辑 ]

回复评论 (6)

不错哦。但是这个好像这支持写txt
点赞  2012-6-1 17:21
引用: 原帖由 zca123 于 2012-6-1 17:21 发表 不错哦。但是这个好像这支持写txt
没明白什么意思?
点赞  2012-6-1 19:16
羡慕啊~~
水平所限,进度有点慢~~
点赞  2012-6-1 20:09

回复 板凳 shower.xu 的帖子

fatfs能写JPEG或者其他格式的文件吗?
点赞  2012-6-1 22:23
引用: 原帖由 zca123 于 2012-6-1 22:23 发表 fatfs能写JPEG或者其他格式的文件吗?

FatFs is a generic FAT file system module for small embedded systems.
我不知道怎样去描述我的意思,我认为单就Fatfs而言,它只是一个介于 底层硬件驱动和上层操作系统或应用之间的一个封装好的模块,而支持或操作什么格式的文件和程序是它更上一层的事,所以说能不能读写jpeg或其它格式的文件不在于它....

layers.jpg
自己的一点看法,不知道对不对,欢迎拍砖
[ 本帖最后由 shower.xu 于 2012-6-1 23:14 编辑 ]
点赞  2012-6-1 22:52
搜集的一些函数说明:   
#define    ENTER_FF(fs)      { if (!lock_fs(fs)) return FR_TIMEOUT; } //获取文件系统同步对象,不成功返回超时,成功,继续执行。
#define    LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } //释放文件系统同步对象。

Static  FATFS *FatFs[_DRIVES]; //定义一个文件系统对象指针数组,当然一般我们也就用到一个元素。
Static WORD LfnBuf[_MAX_LFN + 1];  //这个是与长文件名支持相关的。
#define    NAMEBUF(sp,lp)    BYTE sp[12]; WCHAR *lp = LfnBuf
#define INITBUF(dj,sp,lp)   dj.fn = sp; dj.lfn = lp

下面都是函数的定义,很多只在内部使用。
Static  void mem_cpy (void* dst, const void* src, int cnt) {
    char *d = (char*)dst;
    const char *s = (const char *)src;
    while (cnt--) *d++ = *s++;
} //接下来还定义了几个内存操作的函数,这个函数实现了从一块内存到另一块的复制,下面还有mem_set()对一块内存进行清0或设置操作;mem_cmp()比较内存的多个字节是否相同,相同返回0;chk_chr()检测字符串中是否存在某个字符,存在则返回该字符。

FRESULT move_window (
    FATFS *fs,   
    DWORD sector
)//简单阅读了一下源代码,应该是改变文件系统的当前工作扇区,如果想要操作的扇区就是当前扇区,什么事不做;如果不是,则将原扇区写回;如果是FAT表,还得写入备份区。
这个函数内部使用,外部无法引用。

FRESULT sync (   
    FATFS *fs
)//这个函数用于更新FAT32文件系统的FSI_Sector。什么含义还不太清楚。

DWORD get_fat (  
    FATFS *fs,
    DWORD clst
)
    if (move_window(fs, fsect + (clst / (SS(fs) / 4)))) break; 获取簇号码对应的FAT扇区
    return LD_DWORD(&fs->win[((WORD)clst * 4) & (SS(fs) - 1)]) & 0x0FFFFFFF; //这个函数应该是获取簇的下一个连接簇。
综合起来,这个函数应该是获取下一簇,感觉这个函数名起得不太好。get_nextcluster感觉更好一点。

FRESULT put_fat (
    FATFS *fs,
    DWORD clst,  
    DWORD val
)//上个函数是获取连接簇,这个是写入新的连接信息。

FRESULT remove_chain (
    FATFS *fs,      
    DWORD clst      
)//将下一簇号写为0,也就是该文件的簇到此为止,同时系统的自由簇增加1.
DWORD create_chain (
    FATFS *fs,      
    DWORD clst      
)//跟上一个相反,在该簇的位置写入新的下一簇簇号。



DWORD clust2sect (  
    FATFS *fs,   
    DWORD clst   
) //这个函数是将簇号转变为对应的扇区号。
clst * fs->csize + fs->database; //这个是算法

FRESULT dir_seek (
    DIR *dj,     
    WORD idx     
)//这个函数的最终目的是根据索引号找到目录项所在簇、所在扇区、并是目录对象的对象指针指向文件系统对象窗口扇区的对应位置。

FRESULT dir_next (  
    DIR *dj,     
    BOOL streach
)//

FRESULT dir_read (
    DIR *dj         
)

FRESULT dir_register (  
    DIR *dj            
)

FRESULT dir_remove (
    DIR *dj            
)
//以上这些函数都是对目录项的操作函数。

FRESULT create_name (
    DIR *dj,         
    const XCHAR **path  )
//这个函数太长了,具体用到的时候再说吧。

void get_fileinfo (     
    DIR *dj,         
    FILINFO *fno      )
该函数用于获取文件状态信息。主要是从文件的目录项中获取信息。

FRESULT follow_path (   
    DIR *dj,         
    const XCHAR *path
)
该函数给定一个全路径,得到相应的目录对象。

BYTE check_fs (  
    FATFS *fs,
    DWORD sect )
该函数用于读取BOOT扇区,检查是否FAT文件系统。


FRESULT validate (  
    FATFS *fs,   
    WORD id         
)//检查是否合法的文件系统。

FRESULT f_mount (
    BYTE vol,   
    FATFS *fs     )
这是一个很重要的函数,装载文件系统。也是从这个函数开始,对外输出供用户调用。
if (vol >= _DRIVES)现在只支持卷号0.
FatFs[vol] = fs;将参数文件系统对象指针赋给全局文件对象指针。
点赞  2012-6-2 10:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复