求助: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版块的啊。 奇怪,我的8G SD卡读出来的也是1D9C,3.8G SD_csd.DeviceSize是3B37 所以我遇到高容量卡直接使用SD_csd.DeviceSize的值:(SD_csd.DeviceSize+1)*512来获取容量,单位为KB,也只能这样了。 cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) * 512 * 1024;应该没问题吧, 只不过是算数算错了 , 你再调调 才看到啊,我的也出现了这个问题,自己找了好多天,才找到原因,早看到你就不用费这么多天力气了。 已经解决容量问题。请检查这个语句:
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
32G的卡可以,但是128G的就不对了 SD,SDHC,SDXC{:titter:} wz18th 发表于 2014-6-19 16:31
已经解决容量问题。请检查这个语句:
其中 cardinfo->CardCapacity 楼主已经改为
非常感谢,终于可以了! ibmx311 发表于 2014-6-20 01:02
32G的卡可以,但是128G的就不对了
128G..还没买过那么大的卡。。32G已经足够啦。。
页:
[1]