STM32F103 SDIO Sdcard驱动以及例程的问题

最近在看STM32F103相关的例程及驱动。在网上下载了一些官方的驱动例子来学习。

发现有个问题,卡的容量总是识别不对。具体的表现是:

8G的卡读出来的数值只有3.4G左右,按理来说读出来应该是7.5G以上的。

后来查询了一些资料发现,

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;

上面的定义其实出错了,CardCapacity只能显示到最大4G。
那么把uint32_t 改成 uint64_t 后呢?实测下来也不行…… 还是显示只有3.4G左右。

后来深入研究Cardcapacity的计算。发现其实仅仅是一个数位转换的问题。

  {
    /*!< Byte 7 */
    tmp = (uint8_t)(CSD_Tab[1] & 0x000000FF);
    cardinfo->SD_csd.DeviceSize = (tmp & 0x3F) << 16;

    /*!< Byte 8 */
    tmp = (uint8_t)((CSD_Tab[2] & 0xFF000000) >> 24);

    cardinfo->SD_csd.DeviceSize |= (tmp << 8);

    /*!< Byte 9 */
    tmp = (uint8_t)((CSD_Tab[2] & 0x00FF0000) >> 16);

    cardinfo->SD_csd.DeviceSize |= (tmp);

    /*!< Byte 10 */
    tmp = (uint8_t)((CSD_Tab[2] & 0x0000FF00) >> 8);
    
    cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) * 512 * 1024;
    cardinfo->CardBlockSize = 512;    
  }

(SD_csd.DeviceSize+1)是32位的,“512”,“1024” 也是32位的,所以默认算出来的值也是32位的,尽管CardCapacity已经改成64位了也没有作用。

因此把计算CardCapacity的部分改为如下

cardinfo->CardCapacity = (uint64_t)(cardinfo->SD_csd.DeviceSize + 1) * 512 * 1024;

即可。

你可能感兴趣的:(STM32F103 SDIO Sdcard驱动以及例程的问题)