fatfs问题集结

以前用FatFS的时候有没有发现在使用大容量卡(4G以上)的时候,卡里存了4G以上的东西,新存的文件就不能被正确读取了呢?!

这是因为大家移植的FatFS都是32位寻址的,只能读到4G以下地址的东西,4G以上的东西虽然文件分配表还有分配,但是却没有这么大的地址去读取。

怎么办呢?让我们来解决这个问题吧!



首先,打开SDIO/SPI总线驱动SD卡的底层文件:



sd.h-------------------

sd.c-------------------



在文件里找到下面的几个函数(类似的也行):

SD_Error SD_ReadBlock(uint8_t readbuff, uint32_t ReadAddr, uint16_t BlockSize);

SD_Error SD_ReadMultiBlocks(uint8_t
readbuff, uint32_t ReadAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);

SD_Error SD_WriteBlock(uint8_t writebuff, uint32_t WriteAddr, uint16_t BlockSize);

SD_Error SD_WriteMultiBlocks(uint8_t
writebuff, uint32_t WriteAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);



看到Addr的参数了吗?这是地址,现在我们把它改成64位的,像这样:



SD_Error SD_ReadBlock(uint8_t readbuff, uint64_t ReadAddr, uint16_t BlockSize);

SD_Error SD_ReadMultiBlocks(uint8_t
readbuff, uint64_t ReadAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);

SD_Error SD_WriteBlock(uint8_t writebuff, uint64_t WriteAddr, uint16_t BlockSize);

SD_Error SD_WriteMultiBlocks(uint8_t
writebuff, uint64_t WriteAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);



现在,SD卡的底层就改造好了,我们接着改造FatFS:

打开FatFS目录下的integer.h



找到下面几行代码:

/ These types must be 32-bit integer /

typedef long  LONG;

typedef unsigned long  ULONG;

typedef unsigned long  DWORD;



现在稍稍修改一下,变成这样:

/ These types must be 64-bit integer /

typedef long long LONG;

typedef unsigned long long ULONG;

typedef unsigned long long DWORD;


就是把unsigned long 无符号长整型变成unsigned long long 无符号64位长整型。
现在整体改造完毕,可以试试往SD卡里先写5~6G数据,然后再写个文本,现在读就不会读出乱码啦!
原先32位寻址时,最大支持4GBytes的寻址,现在的寻址空间扩大了4294967295倍,你的SD卡再怎么大都不会出错啦!

http://www.openedv.com/posts/list/36644.htm

sitemap