SD卡初始化

初始化工作分爲兩大步:第一步:進行電壓適配工作。第二部:進行相對地址設定工作。

發送指令時可能會有狀態轉換,尤其是初始化時。

指令分爲兩類:一類爲通用指令,另一類爲針對某種卡的特定指令,但特定指令的實際數可以通用指令相同,所以CMD55+特定指令來發送特定指令,

電壓適配工作

1、發送CMD0指令(GO_IDLE_STATE) 卡進入idle狀態

2、發送指令CMD8(SEND_IF_COND),如果卡設備有response,說明此卡爲SD2.0以上

3、發送指令CMD55(SDIO_APP_CMD),若響應爲sd2.0/sd1.1,否則爲mmc

4、發送指令CMD55+ACMD41,該指令是用來探測卡設備的工作電壓是否符合host端的要求

第四步具體代碼如下:

while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))
    {
      SDIO_CmdInitStructure.SDIO_Argument = 0x00;
      SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_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(SDIO_APP_CMD);
      if (errorstatus != SD_OK)
      {
        return(errorstatus);
      }
      SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType;
      SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_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 = (bool) (((response >> 31) == 1) ? 1 : 0);
      count++;
    }

至此完成電壓適配階段,以上就是俗稱的上電部分。

相對地址設定

1、發送CMD2(ALL_SEND_CID),獲取CID,狀態從Ready狀態到Identification 狀態

2、發送CMD3(SET_REL_ADDR),卡自動重置相對地址,並將相對地址發送過來;狀態從Identification狀態到 Stand-by狀態,對以後的CMD2和CMD3不迴應

完成第二部分。

另外附上以參考博客網址:http://blog.csdn.net/bingqingsuimeng/article/details/7958710

http://blog.163.com/huang_minjian/blog/static/182076549201123155822420/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章