搜索
bottom↓
回复: 34

立此存照:STM32 + FATFS + SDIO存在4G容量陷阱

  [复制链接]

出0入0汤圆

发表于 2015-1-6 15:17:17 | 显示全部楼层 |阅读模式
一直在用的STM32+FATFS+SDIO读TF卡,很久么发现过问题了,都是用4G卡,前段时间4G卡少了,进了一批8G卡,读以前的内容(约1G)也没什么问题。后来想加一个小功能,从卡上的一个小TXT文件读出配置,结果出问题:读出的内容总是0,但f_read()返回的字节数又是对的!
反复调程序,调得差点自信都没了,后来用以前的4G卡换上去,完全可以!程序没有问题。想到FAT32下4G文件大小这个陷阱,32Bit -->4G,用DiskGenius把8G的卡按64K/Cluster格式化,减小Cluster数,再拷文件过去,在板上读,OK了(原来是32K/Cluster格式化的)。看来32Bit->4G这个容量限制FATFS没处理好,用到的同鞋请注意了。

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。

出0入0汤圆

发表于 2015-1-6 15:19:07 | 显示全部楼层
是你的底层驱动没搞好,4G以上就是大容量卡了,地址长度要增加。

出0入0汤圆

 楼主| 发表于 2015-1-6 15:23:43 | 显示全部楼层
底层选择的卡类型一直是SDIO_HIGH_CAPACITY_SD_CARD,SDIO这一层一直用的是V4.3.0 fireware的,ST的东西,没去改它;FATFS就更复杂,不敢动。

出0入0汤圆

 楼主| 发表于 2015-1-6 15:25:02 | 显示全部楼层
地址都是uint32的,但32bit也就4G,不好换uint64。

出0入0汤圆

发表于 2015-1-6 15:36:57 | 显示全部楼层
好的,谢谢,还没用到那么大的容量,比较感兴趣,LZ都用来存些什么东西~^_^

出0入0汤圆

发表于 2015-1-6 15:51:59 | 显示全部楼层
本帖最后由 styleno1 于 2015-1-6 15:58 编辑

说实话,这有犊子关系呀,电脑还是32位的,硬盘容量呢。
————————————
难道,楼主指的FAT32单文件4G的那个问题?

编辑说明:补充

出0入0汤圆

发表于 2015-1-6 15:56:30 | 显示全部楼层
SDHC卡是以sector為單位定址(512byte per sector)
FAT32單檔不能超過4G
超過4G以上的空間和int64無關,int32一樣可以用的好好的

出0入0汤圆

 楼主| 发表于 2015-1-6 16:12:48 | 显示全部楼层
我其实用4G就够了,但现在4G的卡越来越少了,只能跟着走。
电脑上现在都是NTFS啦,FAT32对单个文件有4G大小的限制,但对磁盘,或者整个分区没有这个限制,也就是文件只有不超过4G,在200G的FAT32分区上读写也没问题。STM32这里是文件没超过4G,卡容量超过4G,读出来(部分)错,应该是地址超出来那部分错。但Cluster地址是文件系统分配的,拷文件的时候没法指定总存在低区的。

出0入0汤圆

发表于 2015-1-6 16:24:47 | 显示全部楼层
SDHC卡扇区寻址,FAT32簇寻址,文件长度表示。都是32位的。
楼主看看是不是簇地址拼接和拆分那里有问题。

出0入54汤圆

发表于 2015-1-6 16:25:01 | 显示全部楼层
可能是在diskio.c做地址转换的时候出错了。我移植过网上有出错的。
fatfs不可能连这样基本的都不能保证的。目前我用的0.09版本,64G卡正常使用。

出0入0汤圆

发表于 2015-1-6 17:32:07 | 显示全部楼层
自己没搞好不要怪人家fatfs没做好

出0入0汤圆

 楼主| 发表于 2015-1-6 17:40:45 | 显示全部楼层
snoopyzz 发表于 2015-1-6 17:32
自己没搞好不要怪人家fatfs没做好

我已经搞好了,不过不告诉你怎么搞的。

出0入0汤圆

发表于 2015-1-6 17:42:19 | 显示全部楼层
是地址转换的时候溢出了,不是FATFS的问题,楼主仔细调试一下代码就可以找到BUG了。

出0入0汤圆

发表于 2015-1-6 17:45:43 来自手机 | 显示全部楼层
sdio驱动有bug 要改一下 就是右移9位的地方
用32g卡也没问题

出0入0汤圆

发表于 2015-1-6 18:48:06 | 显示全部楼层
gongxd 发表于 2015-1-6 17:45
sdio驱动有bug 要改一下 就是右移9位的地方
用32g卡也没问题

谢谢,感觉你说到点子上了

出0入0汤圆

发表于 2015-1-6 18:55:03 | 显示全部楼层
还有这种问题 ,真没注意 。

出0入0汤圆

发表于 2015-1-6 19:00:35 | 显示全部楼层
这确实是一个值得注意的地方

出0入42汤圆

发表于 2015-1-6 19:01:36 来自手机 | 显示全部楼层
以前改过库文件,改成了扇区寻址

出0入0汤圆

发表于 2015-1-18 08:42:04 | 显示全部楼层
本帖最后由 ericdata11 于 2015-1-18 08:47 编辑

之前我有遇過相同問題,解決方法很簡單,因為小容量(4G 以下)SD Card地址為32bit方式搜尋,大容量(4G~32G)SD Card地址為512一個扇區搜尋位置。
FATFS讀取與寫入都是已一個扇區來操作,使用小容量SD卡需要*512,使用大容量SD卡則不須*512。

SDIO底層函數中:
SD_ReadBlock()和SD_ReadMultiBlocks()函數
SD_WriteBlock()和SD_WriteMultiBlocks()函數。
這4個函數,開頭有一段code需要修改,修改如下。在剛開始進入函數後進行位置修正。

ex SD_WriteMultiBlocks()函數

  BlockSize = 512;
  if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)//高容量版本
  {
    // *** 大容量版本 ***
   
    //WriteAddr /= 512;
  }
else
{
// *** 小容量版本 ***
WriteAddr *= 512;
}

出0入0汤圆

发表于 2015-1-18 09:12:57 | 显示全部楼层
这个很纠结的。

出0入0汤圆

发表于 2015-1-18 10:23:25 | 显示全部楼层
上电时检测一下卡的类型就行了,都可以做到128M到32G通吃

出0入0汤圆

发表于 2015-1-18 11:03:43 | 显示全部楼层
本帖最后由 wuzhujian 于 2015-1-18 11:04 编辑

其实,就是卡容量这个参数,由32位,改成64位,就行了。
当然,相关计算的地方,也要改成64位。

出0入0汤圆

发表于 2015-1-18 11:53:06 来自手机 | 显示全部楼层
读是用扇区的。空间应该是4g*512

出0入0汤圆

发表于 2015-1-18 23:27:29 来自手机 | 显示全部楼层
这几天也再弄,值得注意。

出0入0汤圆

发表于 2015-1-19 13:16:17 | 显示全部楼层
我在Mini STM32开发板上用fatfs测试过读写16GSD卡,没有发现问题。

出0入0汤圆

发表于 2015-1-19 14:07:30 来自手机 | 显示全部楼层
原来大容量和小容量存储卡代码处理上还有这个512字节区别,学习了,

出100入101汤圆

发表于 2015-1-19 15:37:59 | 显示全部楼层
chunxx 发表于 2015-1-6 17:40
我已经搞好了,不过不告诉你怎么搞的。


LZ,是楼上几位提到的”卡容量参数“的问题么?

出0入0汤圆

发表于 2015-1-19 16:37:27 | 显示全部楼层
我刚好也测试出了这个问题,卡内使用空间大于4G,读写文件就有问题,有人能详细说说么

出0入0汤圆

 楼主| 发表于 2015-1-22 16:29:50 | 显示全部楼层
fengyunyu 发表于 2015-1-19 15:37
LZ,是楼上几位提到的”卡容量参数“的问题么?

上面几位讲的都对,看你怎么总结到自己的程序中。
简单跟踪过:进f_read(),FATFS ClusterNo不会超出32bit, 转成Secter Address, 到diskio.c,也还在32bit内;调用sdio_readblock, *512转换成byte地址,就超出32bit了;改成uint64地址,或者判断卡类型后对大容量卡直接用Sector寻址,不要*512就可以。

出0入0汤圆

发表于 2015-1-26 09:20:56 | 显示全部楼层
gongxd 发表于 2015-1-6 17:45
sdio驱动有bug 要改一下 就是右移9位的地方
用32g卡也没问题

这个我也是这么想的,这个阿赫FATFS没有啥关系吧

出0入4汤圆

发表于 2016-7-3 21:49:11 | 显示全部楼层
大容量SD卡应该注意的问题

出0入13汤圆

发表于 2016-7-4 08:01:49 来自手机 | 显示全部楼层
这个问题很早就知道了,不过没去弄过

出5入8汤圆

发表于 2016-10-3 15:52:46 | 显示全部楼层
chunxx 发表于 2015-1-22 16:29
上面几位讲的都对,看你怎么总结到自己的程序中。
简单跟踪过:进f_read(),FATFS ClusterNo不会超出32bi ...

谢谢 指点

出0入0汤圆

发表于 2017-10-29 22:36:41 | 显示全部楼层
....记录下来

出0入0汤圆

发表于 2017-10-31 22:31:23 | 显示全部楼层
....问下 sdio 官方例子在哪下载的,给个链接。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-27 07:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表