打印

用FatFS的朋友们注意了啊,福利来了!

[复制链接]
542|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
冰糖炖雪梨|  楼主 | 2018-7-9 15:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
FATFS, ui, AD, sd, ck
以前用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;

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

430

主题

436

帖子

0

粉丝