OpenEdv-开源电子网

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

SDIO驱动SD卡POWER ON时,在CMD8后为什么要发2个CMD55才发ACMD41?谢谢大家了!!!

[复制链接]

42

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2017-10-30
在线时间
51 小时
发表于 2018-5-16 10:51:25 | 显示全部楼层 |阅读模式
10金钱
(1)在CMD8后面的第一个CMD55解释的是:为了检测卡的类型,响应了cmd55,是sd卡;没响应的是mmc或不支持的卡  。
这个解释不甚理解,CMD55还有检测卡类型的功能呢?仅仅知道在发送ACMD命令之前一定要先发送CMD55。希望大家能解释下,谢谢。
        (2)在程序的最后出现这句:validvoltage=(((response>>31)==1)?1:0);                        //判断SD卡上电是否完成,
                                                希望大家解释下这样写的含义是什么?为什么response要右移31位呢?
                    谢谢大家了!!!

(1)                                                //                此处发送CMD55是为了检测卡的类型
          SDIO_CmdInitStructure.SDIO_Argument = 0x00;//发送CMD55,短响应        
    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);                //发送CMD55,短响应         
        
         errorstatus=CmdResp1Error(SD_CMD_APP_CMD);                          //等待R1响应 ,看是否响应,没响应的是mmc或不支持的卡  
        
        if(errorstatus==SD_OK)//SD2.0/SD 1.1,否则为MMC卡
        {                //响应了cmd55,是sd卡,可能为1.x,可能为2.0                                                                                                                  
                //SD卡,发送ACMD41 SD_APP_OP_COND,参数为:0x80100000
                while((!validvoltage)&&(count<SD_MAX_VOLT_TRIAL))
                {                                                                                             
(2)          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 | 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卡上电是否完成,
                                                                                                                                //读取卡的ocr寄存器的pwr_up位,看是否已工作在正常电压
                        count++;//计算循环次数
                }

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10571
金钱
10571
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-5-16 18:20:07 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 11:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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