野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15293|回复: 6

SD卡测试不成功,返回值27

[复制链接]
发表于 2014-12-20 10:29:49 | 显示全部楼层 |阅读模式

SD卡测试不成功,我用的是书带的程序。串口信息如下
SD_Init 初始化失败
返回的Status的值为: 27

CardType is :0  
CardCapacity is :0  
CardBlockSize is :0  
RCA is :0  
ManufacturerID is :0
擦除测试失败!
单块读写测试失败!
多块读写测试失败!

我查了一下,对应27的是SD_INVALID_VOLTRANGE  
另外,我发现红牛板子SD卡接口除了CD与DATA3引脚复用之外,还有一个CD低电平有效的引脚,不知何故。

回复

使用道具 举报

 楼主| 发表于 2014-12-20 10:34:55 | 显示全部楼层
网上搜了一下,有类似问题,但没有答案。高手都在哪里呢?http://bbs.21ic.com/icview-391169-1-389.html
我复制那里的内容如下:
问题简单总结:



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


01.

02./*!< If errorstatus is Command TimeOut, it is a MMC card */

03.  /*!< If errorstatus is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch) or SD card 1.x */

04.  if (errorstatus == SD_OK)

05.  {

06.     /*下面开始循环地发送 sdio 支持的电压范围,循环一定次数*/

07.    /*!< SD CARD */

08.    /*!< Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */

09.    while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))// SD_MAX_VOLT_TRIAL=0x0000ffff

10.    {

11.      /*!< SEND CMD55 APP_CMD with RCA as 0 */

12.      SDIO_CmdInitStructure.SDIO_Argument = 0x00;

13.      SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;

14.      SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;

15.      SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;

16.      SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;

17.      SDIO_SendCommand(&SDIO_CmdInitStructure);

18.

19.      errorstatus = CmdResp1Error(SD_CMD_APP_CMD);

20.

21.      if (errorstatus != SD_OK)

22.      {

23.        return(errorstatus);

24.      }

25.      SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType;

26.      SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_OP_COND;

27.      SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;

28.      SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;

29.      SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;

30.      SDIO_SendCommand(&SDIO_CmdInitStructure);

31.

32.      errorstatus = CmdResp3Error();

33.      if (errorstatus != SD_OK)

34.      {

35.        return(errorstatus);

36.      }

37.

38.      response = SDIO_GetResponse(SDIO_RESP1);

39.      validvoltage = (((response >> 31) == 1) ? 1 : 0);

40.      count++;

41.    }

42.

43.    if (count >= SD_MAX_VOLT_TRIAL)

44.    {

45.      errorstatus = SD_INVALID_VOLTRANGE;

46.      return(errorstatus);

47.    }
复制代码
在库中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卡无法上电。这是为什么?要怎么能解决这一问题啊……


回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-20 10:36:11 | 显示全部楼层
我用的是16G卡,2片都是,也是手机上用的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-20 10:37:21 | 显示全部楼层
如果电压不在范围之内,那么,你们用的什么卡呢?求助
回复 支持 反对

使用道具 举报

发表于 2014-12-20 14:52:09 | 显示全部楼层
野火板子配套有sd卡,那个程序也支持32g以下的sd卡
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-21 09:36:21 | 显示全部楼层
谢谢flyleaf,问题已经解决。
我换了板子之后,成功了。再弄原来的板子,估计是接触不良,压了压SD卡座,好了。
也谢谢火哥,程序是可靠的。
回复 支持 反对

使用道具 举报

发表于 2015-1-5 19:41:58 | 显示全部楼层
micro SD卡数据线及CMD信号不加上拉电阻会errorstatus返回SD_INVALID_VOLTRANGE 值,即status返回值为27,
micro SD卡数据线及CMD信号接下拉电阻errorstatus返回SD_ILLEGAL_CMD 值,即status返回值为16。

回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-27 21:24 , Processed in 0.055767 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表