OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10050|回复: 9

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

[复制链接]

10

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-8-13
在线时间
0 小时
发表于 2012-11-5 11:05:50 | 显示全部楼层 |阅读模式

问题简单总结:

        用官方的库写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卡无法上电。这是为什么?要怎么能解决这一问题啊……(怀疑是不是官方的库出问题了)

求高人指点!


官方的库大家应该都有,多余代码我就不传了,可以到stm324xg_eval_sdio_sd.c文件中查看。


奋斗的小鸟,不是愤怒的小鸟
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-5 12:45:33 | 显示全部楼层
参考下骤雨龙元的代码吧。
http://www.openedv.com/posts/list/5143.htm
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-8-13
在线时间
0 小时
 楼主| 发表于 2012-11-7 14:58:21 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子哥的建议!!
    我已经参考过了,这一块的程序好像是一样的。为什么他的能走通我就老撞墙呢?
    我在网上找了一篇博客,他里面对于这个问题是这么解释的:

    “在配置的时候, 一开始的时候sd卡需要有至少发74个时钟使它自己初始话,这是2.0规范要求的,但是你们自己看看官方的,完全没有这个,我一直追踪,发先在电源初始化那里就已经卡住了- -|||。于是我在那里面加入了一个发送74个时钟的小代码。”链接《基于STM32的SDIO用4位总线24MHZDMA模式操作SHDC卡

    我找了一下手册确实有这个要求(不知龙元哥没有延时是怎么做到的?),它是加在了发送 CMD0这个地方,就是重复发送CMD0命令74次(??)
for(;i < 74; i++)
{
    SDIO_SendCommand(&SDIO_CmdInitStructure);
  CmdError();
 }
    手册好像要求在发CMD0前延时74个时钟,我两种方法都试过了,都没用!!!
纠结啊!!!
奋斗的小鸟,不是愤怒的小鸟
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-7 18:53:24 | 显示全部楼层
回复【3楼】chyw12:
---------------------------------
是不是你的卡不被支持?换个卡试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-11-27
在线时间
0 小时
发表于 2012-11-30 15:01:08 | 显示全部楼层
我也碰到相同情况,求知道
回复 支持 反对

使用道具 举报

10

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-8-13
在线时间
0 小时
 楼主| 发表于 2012-12-4 09:32:22 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
回复【5楼】zhangzhongyuan:
---------------------------------
谢谢原子哥,这个蛋疼的问题也算是解决了,方法很简单,如原子哥所说,就是换张卡。之前我只用sandick的卡调的(现在怀疑是卡有问题),最近这个问题一直放着,调其他程序。前两天才买了另外两张8G的sd卡,一个samsung一个kingston,插上试了一下都没问题……问题就解决了……脑子进了水,早为什么不想换卡试试呢!!!
奋斗的小鸟,不是愤怒的小鸟
回复 支持 反对

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-7-25
在线时间
0 小时
发表于 2013-7-29 22:43:55 | 显示全部楼层
MARK一下
回复 支持 反对

使用道具 举报

6

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-7-25
在线时间
0 小时
发表于 2013-7-30 07:31:58 | 显示全部楼层
虽然时间比较久了,但可以提醒下以后的同志,关键是有关SDIO的所有口都要设为SDIO复用的,这样启动就会很顺利了,我也是调了一天才发现,被坑打大了
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2012-4-17
在线时间
0 小时
发表于 2014-9-6 22:45:21 | 显示全部楼层
[mw_shl_code=c,true]CMD0:S3C2440SDI_CSTA=0x800, S3C2440SDI_RSP0=0x0,S3C2440SDI_RSP1=0x0,S3C2440SDI_RSP2=0x0,S3C2440SDIRSP3=0x0 In idle CMD8 in while:S3C2440SDI_CSTA=0x100 CMD8 in while:S3C2440SDI_CSTA=0xa08 CMD8:S3C2440SDI_CSTA=0xa08, S3C2440SDI_RSP0=0x1aa, S3C2440SDI_RSP1=0x13000000, S3C2440SDI_RSP2=0x0,S3C2440DI_RSP3=0x0 CMD8: Card return response CMD55 in while:S3C2440SDI_CSTA=0x108 CMD55 in while:S3C2440SDI_CSTA=0xa37 CD55:S3C2440SDI_CSTA=0xa37, S3C2440SDI_RSP0=0x120, S3C2440SDI_RSP1=0x83000000, S3C2440SDI_RSP2=0x0,S3C2440SDI_RSP3=0x0 CMD41 in while:S3C2440SDI_CSTA=0x137 CMD41 in while:S3C2440SDI_CSTA=0x1a3f CMD41:S3C2440SDI_CSTA=0x1a3f, S3C2440SDI_RSP0=0xff8000,S3C2440SDI_RSP1=0xff000000,S3C2440SDI_RSP2=0x0,S3C2440SDI_RSP3=0x0 CSDI_RSP1=0xff000000, S3C2440SDI_RSP2=0x0,S3C2440SDI_RSP3=0x0 使用mini2440的SDIO模式测试2G的2.0卡读写一切正常,换个4G的SDHC卡,就卡在了CMD41,回复数据S3C2440SDI_RSP0=0xff8000,最高位即上电完成位始终是0,其他cmd8都可以正常响应。这两张卡应该都好的,在原子的stm32 mini板上都可以正常使用。求支招。[/mw_shl_code]

回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2015-7-13 14:04:46 | 显示全部楼层
回复【9楼】stream_lee:
---------------------------------
我是能上电,但是response = SDIO_GetResponse(SDIO_RESP1);后response = 0.为什么会是0,4G SDHC闪迪卡啊,三张闪迪4G卡都试过了,为什么response = 0也就是
#define SDIO_STD_CAPACITY_SD_CARD_V1_1             ((unsigned int)0x00000000)
#define SDIO_STD_CAPACITY_SD_CARD_V2_0             ((unsigned int)0x00000001)
#define SDIO_HIGH_CAPACITY_SD_CARD                 ((unsigned int)0x00000002)
#define SDIO_MULTIMEDIA_CARD                       ((unsigned int)0x00000003)
#define SDIO_SECURE_DIGITAL_IO_CARD                ((unsigned int)0x00000004)
#define SDIO_HIGH_SPEED_MULTIMEDIA_CARD            ((unsigned int)0x00000005)
#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD          ((unsigned int)0x00000006)
#define SDIO_HIGH_CAPACITY_MMC_CARD                ((unsigned int)0x00000007)

说是SDIO_STD_CAPACITY_SD_CARD_V1_1  类型卡,可是我是4G的啊
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 05:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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