luweixuan 发表于 2013-2-6 22:11:56

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

本帖最后由 luweixuan 于 2013-2-6 22:30 编辑

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

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


分析后得出32位的整型数据无法存储大于4G容量的数值,所以把uint32_t CardCapacity;/*!< Card Capacity */改成uint64_t CardCapacity;/*!< Card Capacity */
最后断点跟踪到这个语句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?

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

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

inurl 发表于 2013-3-7 20:06:27

奇怪,我的8G SD卡读出来的也是1D9C,3.8G

inurl 发表于 2013-3-7 20:07:39

SD_csd.DeviceSize是3B37

luweixuan 发表于 2013-3-8 00:39:00

所以我遇到高容量卡直接使用SD_csd.DeviceSize的值:(SD_csd.DeviceSize+1)*512来获取容量,单位为KB,也只能这样了。

inurl 发表于 2013-3-8 08:46:30

cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) * 512 * 1024;应该没问题吧, 只不过是算数算错了 , 你再调调

bingtuohun 发表于 2014-5-28 15:31:53

才看到啊,我的也出现了这个问题,自己找了好多天,才找到原因,早看到你就不用费这么多天力气了。

wz18th 发表于 2014-6-19 16:31:50

已经解决容量问题。请检查这个语句:
    cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) * 512 * 1024;
其中 cardinfo->CardCapacity 楼主已经改为
uint64_t CardCapacity;/*!< Card Capacity */
但是这里的 cardinfo->SD_csd.DeviceSize 注意到了吗?在运算的时候,数据长度都是由SD_csd.DeviceSize的类型决定的,追踪该参数,看到
__IO uint32_t DeviceSize;         /*!< Device Size */
可见运算都是32位运算,尽管赋值目标是64位,可是计算过程中已经溢出了。
所以只要改Devicesize的类型即可。
__IO uint64_t DeviceSize;         /*!< Device Size */

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

ibmx311 发表于 2014-6-20 01:02:00

32G的卡可以,但是128G的就不对了

linghu2 发表于 2014-6-20 07:07:27

SD,SDHC,SDXC{:titter:}

luweixuan 发表于 2014-6-20 09:31:38

wz18th 发表于 2014-6-19 16:31
已经解决容量问题。请检查这个语句:

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


非常感谢,终于可以了!

wz18th 发表于 2014-6-20 14:38:20

ibmx311 发表于 2014-6-20 01:02
32G的卡可以,但是128G的就不对了

128G..还没买过那么大的卡。。32G已经足够啦。。
页: [1]
查看完整版本: 求助:STM32F4 SDIO读取超过4G的SD卡获取的容量值不对(代码)