打印

用官方库SDIO方式初始化SDHC卡遇阻,求点拨

[复制链接]
3412|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chyw12|  楼主 | 2012-11-5 21:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
sd, IO, HC, ST, se
本帖最后由 chyw12 于 2012-11-5 21:39 编辑

问题简单总结:

用官方的库写SDIO方式的SD卡读写程序,在卡初始化的过程中SD_PowerON()函数进行上电、识别操作时,始循环地发送ACMD41指令过程中无法检测到OCR寄存器的pwr_up位置1,就是说,卡需求电压不在SDIO 的供电电压范围内,SDHC卡无法上电。这是问什么?怎么解决?求高手指教……


问题详细描述:



    现在在写一个用STM32F407读写SD卡的程序,使用官方的库函数+FATFS文件系统。以前写的,用普通SD卡虽然出了点小问题,但读写功能是没问题的,能够实现功能。
    现在由于需要,换用8G的大容量的SD卡SDHC(Secure Digital High Capacity),问题就来了,初始化不了!!!(SD卡没问题,我手机上用的,可以用读卡器读写)。
    官方的库是支持SDHC的,然后我就单步执行跟踪了一下,发现错误出在SD_PowerON()函数里这个位置:
 
/*!< If errorstatus is Command TimeOut, it is a MMC card */
  /*!< If errorstatus is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch) or SD card 1.x */
  if (errorstatus == SD_OK)
  {
     /*下面开始循环地发送 sdio 支持的电压范围,循环一定次数*/
    /*!< SD CARD */
    /*!< Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
    while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))// SD_MAX_VOLT_TRIAL=0x0000ffff
    {
      /*!< SEND CMD55 APP_CMD with RCA as 0 */
      SDIO_CmdInitStructure.SDIO_Argument = 0x00;
      SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
      SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
      SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
      SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
      SDIO_SendCommand(&SDIO_CmdInitStructure);

      errorstatus = CmdResp1Error(SD_CMD_APP_CMD);

      if (errorstatus != SD_OK)
      {
        return(errorstatus);
      }
      SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType;
      SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_OP_COND;
      SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
      SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
      SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
      SDIO_SendCommand(&SDIO_CmdInitStructure);

      errorstatus = CmdResp3Error();
      if (errorstatus != SD_OK)
      {
        return(errorstatus);
      }

      response = SDIO_GetResponse(SDIO_RESP1);
      validvoltage = (((response >> 31) == 1) ? 1 : 0);
      count++;
    }

    if (count >= SD_MAX_VOLT_TRIAL)
    {
      errorstatus = SD_INVALID_VOLTRANGE;
      return(errorstatus);
    }
在库中SD_PowerON()函数是完成SD卡的上电、识别操作。上面这一段代码是循环地发送ACMD41指令,循环一定次数。SD_SEND_OP_COND(ACMD41)命令的目的是给予SD卡控制器一个识别SD卡是否可以在所给Vdd范围下工作的机制。可是当我用SDHC时,上面的while循环中会无法检测到OCR寄存器的pwr_up位置1,然后循环次数count就超出SD_MAX_VOLT_TRIAL,跳出循环。然后在if里面errorstatus被赋值SD_INVALID_VOLTRANGE,超时跳出。就是说,卡需求电压不在SDIO供电电压范围内,SDHC卡无法上电。这是为什么?要怎么能解决这一问题啊……

香版主,你怎么看?
沙发
chyw12|  楼主 | 2012-11-7 15:04 | 只看该作者
自己顶一下,没有这方面的高人吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

17

帖子

0

粉丝