搜索
bottom↓
回复: 10

求助:STM32F4 SDIO读取超过4G的SD卡获取的容量值不对(代码)

[复制链接]

出65入0汤圆

发表于 2013-2-6 22:11:56 | 显示全部楼层 |阅读模式
本帖最后由 luweixuan 于 2013-2-6 22:30 编辑

背景:
     硬件平台:STM32F407 DISCOVERY
       编译器:  IAR 6.30.1
原来的代码有结构体:
  1. /**
  2.   * @brief SD Card information
  3.   */
  4. typedef struct
  5. {
  6.   SD_CSD SD_csd;
  7.   SD_CID SD_cid;
  8.   uint32_t CardCapacity;  /*!< Card Capacity */
  9.   uint32_t CardBlockSize; /*!< Card Block Size */
  10.   uint16_t RCA;
  11.   uint8_t CardType;
  12. } SD_CardInfo;  
复制代码
其中uint32_t CardCapacity存储有SD卡的容量值,单位为字节

在使用少于4G的容量的SD卡时,读取的容量值是对的,今天换上一个8G的SD卡,发现得到的只有3484 MB,但是真实的是7580 MB。


分析后得出32位的整型数据无法存储大于4G容量的数值,所以把
  1. uint32_t CardCapacity;  /*!< Card Capacity */
复制代码
改成
  1. uint64_t CardCapacity;  /*!< Card Capacity */
复制代码
最后断点跟踪到这个语句
  1. cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) * 512 * 1024;
复制代码
此语句在.c文件的SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo函数里
发现SD_csd.DeviceSize 的值是对的,SD_csd.DeviceSize = 15159
那么最后获取的容量应该是7580 MB,可是调试出来还是3484 MB??????????WHY?

注:通过语句
  1.   USARTx_Printf(USER_NO,"Capacity:%d MB\r\n", SDCardInfo.CardCapacity>>20);
复制代码
输出容量信息。

PS:哎呀,怎么发到AVR32版块了,请版主帮忙移动一下,刚才明明点了stm32版块的啊。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-3-7 20:06:27 | 显示全部楼层
  奇怪,我的8G SD卡读出来的也是1D9C,3.8G

出0入0汤圆

发表于 2013-3-7 20:07:39 | 显示全部楼层
SD_csd.DeviceSize是3B37

出65入0汤圆

 楼主| 发表于 2013-3-8 00:39:00 | 显示全部楼层
所以我遇到高容量卡直接使用SD_csd.DeviceSize的值:(SD_csd.DeviceSize+1)*512来获取容量,单位为KB,也只能这样了。

出0入0汤圆

发表于 2013-3-8 08:46:30 | 显示全部楼层
  1. cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) * 512 * 1024;
复制代码
应该没问题吧, 只不过是算数算错了 , 你再调调

出0入0汤圆

发表于 2014-5-28 15:31:53 | 显示全部楼层
才看到啊,我的也出现了这个问题,自己找了好多天,才找到原因,早看到你就不用费这么多天力气了。

出0入0汤圆

发表于 2014-6-19 16:31:50 | 显示全部楼层
已经解决容量问题。请检查这个语句:
  1.     cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) * 512 * 1024;
复制代码

其中 cardinfo->CardCapacity 楼主已经改为
  1. uint64_t CardCapacity;  /*!< Card Capacity */
复制代码

但是这里的 cardinfo->SD_csd.DeviceSize 注意到了吗?在运算的时候,数据长度都是由SD_csd.DeviceSize的类型决定的,追踪该参数,看到
  1.   __IO uint32_t DeviceSize;           /*!< Device Size */
复制代码

可见运算都是32位运算,尽管赋值目标是64位,可是计算过程中已经溢出了。
所以只要改Devicesize的类型即可。
  1.   __IO uint64_t DeviceSize;           /*!< Device Size */
复制代码


测试8G卡的结果:
Card Type: SDHC V2.0
Card Capacity: 8068792320 Byte

出0入300汤圆

发表于 2014-6-20 01:02:00 | 显示全部楼层
32G的卡可以,但是128G的就不对了

出0入0汤圆

发表于 2014-6-20 07:07:27 | 显示全部楼层
SD,SDHC,SDXC

出65入0汤圆

 楼主| 发表于 2014-6-20 09:31:38 | 显示全部楼层
wz18th 发表于 2014-6-19 16:31
已经解决容量问题。请检查这个语句:

其中 cardinfo->CardCapacity 楼主已经改为

非常感谢,终于可以了!

出0入0汤圆

发表于 2014-6-20 14:38:20 | 显示全部楼层
ibmx311 发表于 2014-6-20 01:02
32G的卡可以,但是128G的就不对了

128G..还没买过那么大的卡。。32G已经足够啦。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 23:52

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

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