你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

为什么无法初始化SD卡?用的都是库文件,为什么?为什么?

[复制链接]
yygy3748 提问时间:2017-3-22 16:42 /
阅读主题, 点击返回1楼
收藏 1 评论27 发布时间:2017-3-22 16:42
27个回答
回答时间:2017-3-23 16:15:03
有这么一段代码,楼主你看一下:
//如果不是SDHC,给定的是sector地址,将其转换成byte地址
    if(SD_Type!=SD_TYPE_V2HC)
    {
        sector = sector<<9;
    }
yygy3748 回答时间:2017-3-23 16:40:33
安 发表于 2017-3-23 16:15
有这么一段代码,楼主你看一下:
//如果不是SDHC,给定的是sector地址,将其转换成byte地址
    if(SD_Type ...

这是初始化中的代码吗?
yygy3748 回答时间:2017-3-23 16:42:59
安 发表于 2017-3-23 16:15
有这么一段代码,楼主你看一下:
//如果不是SDHC,给定的是sector地址,将其转换成byte地址
    if(SD_Type ...

能上传一下你的代码给我看一下吗?
原子的代码就有  if(CardType!=SDIO_STD_CAPACITY_SD_CARD_V1_1)lsector<<=9;  
回答时间:2017-3-23 16:59:30
楼主,你仿真进入这里,看一下CardType的值是多少。
yygy3748 回答时间:2017-3-23 17:01:07
安 发表于 2017-3-23 16:59
楼主,你仿真进入这里,看一下CardType的值是多少。

值为  SDIO_STD_CAPACITY_SD_CARD_V2_0
回答时间:2017-3-23 17:03:12
你把if(CardType!=SDIO_STD_CAPACITY_SD_CARD_V1_1)lsector<<=9;  这里改成SDIO_STD_CAPACITY_SD_CARD_V2_0再试一下,好久了,大概是1.0的才用地址左移。2.0的不用。你看一下SD卡的地址操作说明。
yygy3748 回答时间:2017-3-23 17:04:22
嗯,好的
yygy3748 回答时间:2017-3-23 17:06:38
安 发表于 2017-3-23 17:03
你把if(CardType!=SDIO_STD_CAPACITY_SD_CARD_V1_1)lsector

if(CardType!=SDIO_STD_CAPACITY_SD_CARD_V1_1)lsector<<=9;这个是在读写里面的了

现在是发送ACMD41命令就出问题了
yygy3748 回答时间:2017-3-23 17:12:25
安 发表于 2017-3-23 17:03
你把if(CardType!=SDIO_STD_CAPACITY_SD_CARD_V1_1)lsector

执行到下面的代码即返回


        if(errorstatus==SD_OK)//SD2.0/SD 1.1,否则为MMC卡
        {                                                                                                                                  
                //SD卡,发送ACMD41 SD_APP_OP_COND,参数为:0x80100000
                while((!validvoltage)&&(count<SD_MAX_VOLT_TRIAL))
                {                                                                                             
                  SDIO_CmdInitStructure.SDIO_Argument = 0x00;//发送CMD55,短响应
                  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;          //CMD55
                  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);                        //发送CMD55,短响应         

                        errorstatus=CmdResp1Error(SD_CMD_APP_CMD);                  //等待R1响应  
                       
                        if(errorstatus!=SD_OK)
                                return errorstatus;           //响应错误

                  //acmd41,命令参数由支持的电压范围及HCS位组成,HCS位置一来区分卡是SDSc还是sdhc
                  SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SD_HIGH_CAPACITY | SDType;        //发送ACMD41,短响应       
                  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_OP_COND;
                  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;  //r3
                  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
                  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
                  SDIO_SendCommand(&SDIO_CmdInitStructure);

                        errorstatus=CmdResp3Error();                                         //等待R3响应   
                       
                        if(errorstatus!=SD_OK)
                                return errorstatus;           //响应错误
                        response=SDIO->RESP1;;                                                           //得到响应
                        validvoltage=(((response>>31)==1)?1:0);                        //判断SD卡上电是否完成
                        count++;
                }


yygy3748 回答时间:2017-3-23 17:15:50
安 发表于 2017-3-23 17:03
你把if(CardType!=SDIO_STD_CAPACITY_SD_CARD_V1_1)lsector

到了确认卡是否是HC卡及上电是否完成时,出错,发送CMD55->发送ACMD41,如此循环八九点后,最终在响应CMD55命令时出错,Resp1返回 SD_CMD_CRC_FAIL

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版