xuzhenglim 发表于 2010-5-25 20:12:45

关于SD卡的初始化问题

前天刚刚画了60大洋买了个4G的金士顿sd卡, 但是在用stm32初始化的时候, 卡在这些代码里面了
while ((!validvoltage) &&(count < SD_MAX_VOLT_TRIAL))
    {
      /* SEND CMD55 APP_CMD with RCA as 0 */
      SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_MMC;
      SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_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)
      {
                  rt_kprintf("CmdResp3Error.\n");
      return(errorstatus);
      }

      response = SDIO_GetResponse(SDIO_RESP1);
      validvoltage = (bool) (((response >> 31) == 1) ? 1 : 0);
      count++;
    }
    if (count >= SD_MAX_VOLT_TRIAL)
    {
      errorstatus = SD_INVALID_VOLTRANGE;
      return(errorstatus);                                                                                                                                  
    }
经过追踪, 到这一步初始化的时候,会出错, 原因是count>= SD_MAX_VOLT_TRIAL,
请问下, 这段代码到底是干嘛的, (power_ON函数里面的);
另外, SD_MAX_VOLT_TRIAL是什么意思。。看得一头雾水。

xuzhenglim 发表于 2010-5-25 20:13:29

注明下, 这个是基于rt_thread的fliesystem历程修改的- -

xuzhenglim 发表于 2010-5-25 22:50:02

输出为:SD INVAKUD_VOLTRANGE,count = ffff.

ffxz 发表于 2010-5-25 23:01:10

是否是硬件有问题?或卡的兼容性不太好

程序里默认是1bit模式,并且时钟也调低了的,对大多数卡应该能够识别。

xuzhenglim 发表于 2010-5-26 10:13:46

硬件应该是没问题的,因为可以发命令。另外, 听说要在发送命令前发送74个时钟, 请问是怎么发送呢。。。都没看到源代码有这个。

xuzhenglim 发表于 2010-5-26 11:17:23

问题解决了, 原因很简单, 因为没有在使用前给它74个初始化时钟周期。
可以参考下我这个sdcar.c,我在里面加了这句:
for(;i < 74; i++)
{
                SDIO_SendCommand(&SDIO_CmdInitStructure);
                CmdError();
        }
        SDIO_SendCommand(&SDIO_CmdInitStructure);
errorstatus = CmdError();

wandersky0822 发表于 2012-2-15 14:15:54

回复【5楼】xuzhenglim
-----------------------------------------------------------------------

强烈要求楼主上传sdcard.c
页: [1]
查看完整版本: 关于SD卡的初始化问题