7511|3

13

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

用官方库SDIO方式初始化SDHC卡遇阻 [复制链接]

问题简单总结:
用官方的库写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()函数里这个位置:


  1. /*!< If errorstatus is Command TimeOut, it is a MMC card */
  2.   /*!< If errorstatus is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch) or SD card 1.x */
  3.   if (errorstatus == SD_OK)
  4.   {
  5.      /*下面开始循环地发送 sdio 支持的电压范围,循环一定次数*/
  6.     /*!< SD CARD */
  7.     /*!< Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
  8.     while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))// SD_MAX_VOLT_TRIAL=0x0000ffff
  9.     {
  10.       /*!< SEND CMD55 APP_CMD with RCA as 0 */
  11.       SDIO_CmdInitStructure.SDIO_Argument = 0x00;
  12.       SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
  13.       SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  14.       SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  15.       SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  16.       SDIO_SendCommand(&SDIO_CmdInitStructure);

  17.       errorstatus = CmdResp1Error(SD_CMD_APP_CMD);

  18.       if (errorstatus != SD_OK)
  19.       {
  20.         return(errorstatus);
  21.       }
  22.       SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType;
  23.       SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_OP_COND;
  24.       SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  25.       SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  26.       SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  27.       SDIO_SendCommand(&SDIO_CmdInitStructure);

  28.       errorstatus = CmdResp3Error();
  29.       if (errorstatus != SD_OK)
  30.       {
  31.         return(errorstatus);
  32.       }

  33.       response = SDIO_GetResponse(SDIO_RESP1);
  34.       validvoltage = (((response >> 31) == 1) ? 1 : 0);
  35.       count++;
  36.     }

  37.     if (count >= SD_MAX_VOLT_TRIAL)
  38.     {
  39.       errorstatus = SD_INVALID_VOLTRANGE;
  40.       return(errorstatus);
  41.     }
复制代码
在库中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卡无法上电。这是为什么?要怎么能解决这一问题啊……
此帖出自stm32/stm8论坛

最新回复

同问。。  详情 回复 发表于 2019-4-11 14:48
点赞 关注
 

回复
举报

4008

帖子

0

TA的资源

版主

沙发
 
不要单步,断点能过否?
不能过你截个sdio图来看看
      errorstatus = CmdResp1Error(SD_CMD_APP_CMD);



这里      if (errorstatus != SD_OK)
此帖出自stm32/stm8论坛

点评

非常感谢您的回复 但本人新手愚钝,不太明白您说的什么意思,能否说具体一点啊!谢谢  详情 回复 发表于 2012-11-5 10:47
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 huo_hu 的帖子

非常感谢您的回复
但本人新手愚钝,不太明白您说的什么意思,能否说具体一点啊!谢谢
此帖出自stm32/stm8论坛
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
同问。。
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表