[讨论] 决定开个新帖继续SD卡的FAT文件系统讨论,欢迎网友们加入找问题

gh131413   2014-4-18 10:59 楼主
本帖最后由 gh131413 于 2014-4-21 08:45 编辑

回复评论 (75)

本帖最后由 gh131413 于 2014-4-21 11:48 编辑
点赞  2014-4-18 11:15
置顶,等狂人……
点赞  2014-4-18 11:36
这个狂人发给我的ATMEGA的ZNFAT文件系统程序,但是把它运用到上面程序中下手难……
点赞  2014-4-18 11:49
我看到读写扇区了呀,这样也就够了嘛。

FAT的代码,我之前写过,很麻烦的。

如果说没有十分的必要一定要理解具体的各项数据什么含义,就去用通用的FAT库吧。
点赞  2014-4-18 11:50
初始化完后读0扇区,判定是否是分区表,不是分区表就是boot,如果是分区表加偏移确定boot,不支持分区表可跳过.
boot也叫引导扇区,里面有各种信息,就有几个是关键的,计算后得到文件分配表位置,文件分配表里搜索文件名,取出簇号+偏移折算成扇区号,就可以开始文件内容访问了.
点赞  2014-4-18 11:52
目前我只想能够运用现成的FAT能够加入到上面的程序,可是不理解FAT又如何修改和加入到程序中呢?
点赞  2014-4-18 11:53
更简单点的方法,格式化一次写入要读取的文件,用winhex确定起始扇区号,把这个数编到单片机程序里直接读或写. 无标题.png 本帖最后由 huo_hu 于 2014-4-18 12:17 编辑
点赞  2014-4-18 11:56
引用: huo_hu 发表于 2014-4-18 11:52
初始化完后读0扇区,判定是否是分区表,不是分区表就是boot,如果是分区表加偏移确定boot,不支持分区表可跳过. ...

如果时间允许,可否举例说明
点赞  2014-4-18 11:56
引用: gh131413 发表于 2014-4-18 11:56
如果时间允许,可否举例说明

读写扇区成了吗?
点赞  2014-4-18 11:58
程序上的运用有些不大看的明白……
点赞  2014-4-18 12:01
引用: huo_hu 发表于 2014-4-18 11:56 更简单点的方法,格式化一次写入要读取的文件,用winhex确定起始扇区号,把这个数编到单片机程序里直接读或写. ...
huo_hu 有心了,看来应该是介绍直接读取扇区的方法 本帖最后由 gh131413 于 2014-4-18 12:23 编辑
点赞  2014-4-18 12:19
我得好好看看FAT加入到单片机程序中的方法了,大家提的可能只能是建议,不可能加入的方法写好了给你,那就真的成了拿来主义了,真正动手的还得自已……
点赞  2014-4-18 12:26
引用: gh131413 发表于 2014-4-18 11:15
先自已顶一下,光学习SD卡我放弃了又拿起然后又准备放弃,昨天准备再次放弃的时候有同事劝我别放弃,说坚持 ...

如果初始化成功了的话,接下来想干什么活直接调用 znfat.c里面的功能函数就得了,哪有那么麻烦。
UINT32 znFAT_ReadData(struct FileInfo *pFI,UINT32 offset,UINT32 len,UINT8 *app_Buffer); //数据读取
UINT32 znFAT_ReadDataX(struct FileInfo *pfi,UINT32 offset,UINT32 len);//文件数据读取+重定向 此函数会将读取的每个字节送到处理函数
UINT8 znFAT_Seek(struct FileInfo *pFI,UINT32 offset); //文件定位
UINT8 znFAT_Open_File(struct FileInfo *pFI,INT8 *filepath,UINT32 n,UINT8 is_file); //文件打开
UINT8 znFAT_Enter_Dir(INT8 *dirpath,UINT32 *pCluster,UINT32 *pos); //进入目录
UINT8 znFAT_Create_File(struct FileInfo *pfi,INT8 *pfn,struct DateTime *pdt); //创建文件
UINT8 znFAT_Create_Dir(INT8 *pdp,struct DateTime *pdt); //创建目录
UINT8 znFAT_Delete_Dir(INT8 *dirpath); //删除目录
UINT8 znFAT_Delete_File(INT8 *filepath); //删除文件
UINT8 znFAT_Make_FS(UINT32 tt_sec,UINT16 clu_sz); //格式化
UINT32 znFAT_WriteData(struct FileInfo *pfi,UINT32 len,UINT8 *pbuf); //写入数据
UINT8 znFAT_Dump_Data(struct FileInfo *pfi,UINT32 offset); //截断文件数据
UINT8 znFAT_Close_File(struct FileInfo *pfi); //关闭文件,如果程序中没有打开实时文件大小更新,则文件操作完后,尤其是写入和更改操作,必须调用此函数
UINT8 znFAT_Flush_FS(void); //刷新文件系统相关信息,如果程序中没有打开实时文件系统信息更新,则在程序中一定要调用此函数,否则将导致文件系统相关参数错误


如果你想进行数据读取操作,比如读取sd卡里某个文档的一句话,则:
       znFAT_Open_File(&fileinfo,"/znmcu.txt",0,1);//先打开文件
       打开成功后:
       znFAT_ReadData(&fileinfo,10,20,buf); //从文件偏移量10位置开始读取20个字节
       数据读取成功后保存在 buf 缓冲区,其实就是保存在数组里;然后该干嘛干嘛,你用串口、12864、还是TFT显示这句话都得。
ZNFAT32已经把很多功能函数都做好了的,使用者直接调用就是了,没必要去折腾什么扇区(如果你不是搞这方面的话)。
接口函数都在定义在 ZNFAT.h 里,函数体在 znfat.c文件
点赞  2014-4-18 12:52
建议先把那个工程都看一遍,特别是那个 config.h 文件
点赞  2014-4-18 13:03
以前我也是一个C文件的玩,后面久了觉得多个C文件方便模块化,找问题的时候不容易晕,不然程序做大之后自己都绕不过来,哈哈
点赞  2014-4-18 13:09
引用: dj狂人 发表于 2014-4-18 13:09
以前我也是一个C文件的玩,后面久了觉得多个C文件方便模块化,找问题的时候不容易晕,不然程序做大之后自己 ...

狂人就是狂人啊,牛
点赞  2014-4-18 14:01
引用: dj狂人 发表于 2014-4-18 13:03
建议先把那个工程都看一遍,特别是那个 config.h 文件

我看到这9个文件,都不知道怎么用,按你说的试一下先,谢过……
点赞  2014-4-18 14:04
本帖最后由 gh131413 于 2014-4-21 08:46 编辑
点赞  2014-4-18 14:18
而且编译后提示几个地方出现了问题,看来是不能直接用的,但是FAT文件很多地方不懂也不知道如何修改,硬伤, 比如ICCAVR下提示deviceio.c中的#include "../device0.h" //存储设备驱动头文件有问题,确实"../device0.h"这个h文件在那9个文件中根本没有呢!! 本帖最后由 gh131413 于 2014-4-18 14:38 编辑
点赞  2014-4-18 14:23
1234下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复