(1条消息) FatFs模块系统应用指南_朱工的专栏-CSDN博客
https://blog.csdn.net/zhzht19861011/article/details/52893131?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
FatFs模块功能配置选项
https://blog.csdn.net/carlsun80/article/details/77017733/
https://blog.csdn.net/carlsun80/category_7089164.html
http://www.openedv.com/forum.php?mod=viewthread&tid=291154&extra=page=1
以前用FatFS的时候有没有发现在使用大容量卡(4G以上)的时候,卡里存了4G以上的东西,新存的文件就不能被正确读取了呢?! 这是因为大家移植的FatFS都是32位寻址的,只能读到4G以下地址的东西,4G以上的东西虽然文件分配表还有分配,但是却没有这么大的地址去读取。 怎么办呢?让我们来解决这个问题吧! |
我试了一下
这个方法可以,但是有个地方不好:“就是把unsigned long 无符号长整型变成unsigned long long 无符号64位长整型。”这种操作其实已经改变了FATFS的库函数的变量类型,我觉得最好别改库文件。
我用另一个方法做了测试,不需要修改这个变量类型的定义:
DRESULT disk_write (
BYTE pdrv, /* Physical drive nmuber to identify the drive */
const BYTE *buff, /* Data to be written */
DWORD sector, /* Start sector in LBA */
UINT count /* Number of sectors to write */
){}
这个函数传递的是一个sector值,在调用SD_WriteMultiBlocks(uint8_t *writebuff, uint64_t WriteAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);这个函数的时候,我这里找到的例程是直接用这样的方式:
SD_WriteMultiBlocks(buff, BLOCK_SIZE*sector, BLOCK_SIZE, count);
因为sector本身是一个DWORD类型,是不是因为BLOCK_SIZE*sector的值在计算之后仍然默认是DWORD类型(这时候已经地址溢出了),然后在参数传递的时候才强制转换为uint64_t,其实等于是先发生了溢出,然后再传递?
所以我改成了这种方式:
SD_WriteMultiBlocks(buff, BLOCK_SIZE*(uint64_t)sector, BLOCK_SIZE, count);
这样处理并不需要更改integer文件里面DWORD的类型定义,测试后反正8G的SD卡读写到6G多的时候是没什么问题的。按这样处理的话,在BLOCK_SIZE为512的情况下,理论上应该能支持512*4G 大小的SD卡,不知道我理解的对不对?
结果还是diskio.c的问题。
disk_write()函数里调用了SD_WriteMultiBlocks()函数,其中有一个参数是WriteAddr,这个地址是字节寻址的,是64位整数。如下:
SD_state=SD_WriteMultiBlocks((uint8_t *)buff,sector*SD_BLOCKSIZE,SD_BLOCKSIZE,count);
可以看到调用时的实参表达式是sector*SD_BLOCKSIZE,这个sector是扇区寻址的,是一个32位整数,所以这个表达式的计算结果仍然是32位的,导致地址的高位被抹掉,所以错误地寻址到前面的扇区,破坏了文件系统。
解决方法也很简单,定义一个64位的临时变量,把sector的值赋进去再做乘法就好了。
在移植fatfs文件系统后,可以读写文件系统,但是在读写过程中一直出现FR_DISK_ERR错误,以为是底层函数编写有问题,一直无法解决问题,后经过多方查阅资料,怀疑是SDIO访问时钟频率过高导致,将SDIO时钟频率调低后经测试读写正确,未出现FR_DISK_ERR错误,特留此文以备后用,如果有同样问题的朋友看到此文很高兴能为你提供一个解决方案
fatfs文件系统写成功,打开文件成功读取失败或者打开文件失败
分类专栏: 四旋翼 文章标签: fatfs文件系统文件读取失败
格式化flash重新挂载
具体方法:
步骤1:挂载文件系统
FRESULT result;
result = f_mount(&fs, "0:", 1); /* Mount a logical drive */
步骤2:格式化文件系统
result = f_mkfs("0:",0,0);