日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【STM32】STM32 SDIO SD卡读写测试(二)-- SD_Init之Power On阶段

發(fā)布時間:2024/3/26 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【STM32】STM32 SDIO SD卡读写测试(二)-- SD_Init之Power On阶段 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

相關文章

《【SDIO】SDIO、SD卡、FatFs文件系統(tǒng)相關文章索引》

1. 前言

本篇文章主要是介紹stm324x9i_eval_sdio_sd.c里面SD_Init()函數完整的過程。它主要是實現了SDIO的初始化、SD卡的Power UP、SD卡的初始化獲取SD卡的相關信息等,下面會詳細介紹SDIO的初始化SD卡的Power UP的分析。

2. SD_LowLevel_Init()

SD_LowLevel_Init()主要功能是初始化使用的IO相關的Clock,具體如下:

  • PC.08, PC.09, PC.10, PC.11配置為SDIO模式的DATA0, DATA1, DATA2, DATA3功能。
  • PD.02, PC.12配置為SDIO模式的SDIO_CMD, SDIO_CLK功能。
  • 配置SDIO接口的Clock使能。
  • 配置SDIO傳輸時使用DMA2,并且使能DMA2的Clock。
  • void SD_LowLevel_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;/* GPIOC and GPIOD Periph clock enable */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE);GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_SDIO);GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_SDIO);GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SDIO);GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SDIO);GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SDIO);GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_SDIO);/* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOC, &GPIO_InitStructure);/* Configure PD.02 CMD line */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_Init(GPIOD, &GPIO_InitStructure);/* Configure PC.12 pin: CLK pin */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOC, &GPIO_InitStructure);/* Enable the SDIO APB2 Clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE);/* Enable the DMA2 Clock */RCC_AHB1PeriphClockCmd(SD_SDIO_DMA_CLK, ENABLE); }

    3. SD_PowerON()

    SD_PowerON()主要功能是詢問SD卡的工作電壓和配置工作時鐘。主要涉及到的函數如下:

    • SDIO_Init()
    • SDIO_SetPowerState()
    • SDIO_ClockCmd()
    • CMD0: GO_IDLE_STATE
    • CMD8: SEND_IF_COND
    • CMD55: SD_CMD_APP_CMD
    • ACMD41: SD_CMD_SD_APP_OP_COND

    3.1 SDIO_Init()

    SDIO_Init()主要是配置SDIO時鐘控制寄存器(SDIO_CLKCR)。下面通過Code、Register Map和Table來介紹對SDIO_CLKCR寄存器的設置如下:

    /** * @brief SDIO Intialization Frequency (400KHz max)*/ #define SDIO_INIT_CLK_DIV ((uint8_t)0x76)/*!< Power ON Sequence -----------------------------------------------------*/ /*!< Configure the SDIO peripheral */ /*!< SDIO_CK = SDIOCLK / (SDIO_INIT_CLK_DIV + 2) */ /*!< on STM32F4xx devices, SDIOCLK is fixed to 48MHz */ /*!< SDIO_CK for initialization should not exceed 400 KHz */ SDIO_InitStructure.SDIO_ClockDiv = SDIO_INIT_CLK_DIV; SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising; SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable; SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable; SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b; SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; SDIO_Init(&SDIO_InitStructure);

    名稱描述Value備注
    HWFC_EN硬件流控制使能 (HW Flow Control enable)
    0:禁止硬件流控制
    1:使能硬件流控制
    0SDIO_HardwareFlowControl_Disable
    NEGEDGESDIO_CK 移相選擇位 (SDIO_CK dephasing selection bit)
    0:在主時鐘 SDIOCLK 的上升沿產生 SDIO_CK
    1:在主時鐘 SDIOCLK 的下降沿產生 SDIO_CK
    0SDIO_ClockEdge_Rising
    WIDBUS寬總線模式使能位 (Wide bus mode enable bit)
    00:默認總線模式:使用 SDIO_D0
    01:4 位寬總線模式:使用 SDIO_D[3:0]
    10:8 位寬總線模式:使用 SDIO_D[7:0]
    0SDIO_BusWide_1b
    //在SD卡初始化階段只用到CLK和CMD,
    SDIO_D0作為指示SD卡的繁忙狀態(tài),所以這里被設置0。
    BYPASS時鐘分頻器旁路使能位 (Clock divider bypass enable bit)
    0:禁止旁路:在驅動 SDIO_CK 輸出信號前,根據 CLKDIV 值對 SDIOCLK 進行分頻。
    1:使能旁路:SDIOCLK 直接驅動 SDIO_CK 輸出信號。
    0SDIO_ClockBypass_Disable
    PWRSAV節(jié)能模式配置位 (Power saving configuration bit)
    0:始終使能 SDIO_CK 時鐘
    1:僅在總線激活時使能 SDIO_CK
    0SDIO_ClockPowerSave_Disable
    CLKEN時鐘使能位 (Clock enable bit)
    0:禁止 SDIO_CK
    1:使能 SDIO_CK
    0
    CLKDIV時鐘分頻系數 (Clock divide factor)
    該字段定義輸入時鐘 (SDIOCLK) 與輸出時鐘 (SDIO_CK) 之間的分頻系數:
    SDIO_CK 頻率 = SDIOCLK / [CLKDIV + 2]
    0x76SDIO_CK 頻率 = SDIOCLK / [CLKDIV + 2]
    400K = 48M / [0x76 + 2]

    3.2 SDIO_SetPowerState()

    SDIO_SetPowerState()主要是配置SDIO電源控制寄存器 (SDIO_POWER)為ON。下面通過Code、Register Map和Table來介紹對SDIO_POWER寄存器的設置如下:

    /** @defgroup SDIO_Power_State * @{*/ #define SDIO_PowerState_ON ((uint32_t)0x00000003)/*!< Set Power State to ON */ SDIO_SetPowerState(SDIO_PowerState_ON);

    名稱描述Value備注
    PWRCTRL電源控制位 (Power supply control bits)。
    00:掉電:停止為卡提供時鐘
    01:保留
    10:保留,上電
    11:通電:為卡提供時鐘。
    3SDIO_PowerState_ON

    3.3 SDIO_ClockCmd()

    SDIO_ClockCmd()主要是配置SDIO時鐘控制寄存器(SDIO_CLKCR)的CLKEN為使能 SDIO_CK。下面通過Code、Register Map和Table來介紹對SDIO_POWER寄存器的設置如下:

    /*!< Enable SDIO Clock */ SDIO_ClockCmd(ENABLE);-------------------------------------------->void SDIO_ClockCmd(FunctionalState NewState) {*(__IO uint32_t *) CLKCR_CLKEN_BB = (uint32_t)NewState; }-------------------------------------------->/* ------------ SDIO registers bit address in the alias region ----------- */ #define SDIO_OFFSET (SDIO_BASE - PERIPH_BASE) // (0x40012C00 - 0x40000000) = 0x12C00/* --- CLKCR Register ---*/ /* Alias word address of CLKEN bit */ #define CLKCR_OFFSET (SDIO_OFFSET + 0x04) // (0x12C00 + 0x04) = 0x12C04 #define CLKEN_BitNumber 0x08 #define CLKCR_CLKEN_BB (PERIPH_BB_BASE + (CLKCR_OFFSET * 32) + (CLKEN_BitNumber * 4))//(0x42000000 + ( 0x12C04 * 32) + (0x08 * 4)) = 0x422580A0

    這里會有一個疑問:為什么CLKCR_CLKEN_BB(0x422580A0)這個地址可以操作到SDIO_CLKCR(0x40012C04)寄存器的CLKEN時鐘使能位?

    解釋這個問題我們需要了解一下Cortex-M4內核的Memory Map(如下圖),Cortex-M4的存儲器系統(tǒng)支持所謂的“位帶”(bit-band)操作。通過它,實現了對單一Bit的原子操作。

    下面的公式顯示別名區(qū)域( the alias region)如何映射到位帶區(qū)域(the bit-band region):
    bit_word_offset = (byte_offset x 32) + (bit_number x 4)
    bit_word_addr = bit_band_base + bit_word_offset

    • bit_word_offset:目標Bit在位帶區(qū)域(the bit-band region)中的位置。
    • bit_word_addr:目標Bit 映射到 別名區(qū)域( the alias region)中 字的地址 (就是32Bit地址)。
    • bit_band_base:別名區(qū)域( the alias region)的起始地址。// Peripheral: 0x42000000 SRAM: 0x22000000
    • byte_offset:目標Bit在位帶區(qū)域(the bit-band region)中的字節(jié)數。
    • bit_number:目標Bit的位置,0-7。

    例如:SRAM的寄存器地址0x200FFFFF的bit[7]映射到別名區(qū)域( the alias region)的0x23FFFFFC,計算公式如下:
    0x23FFFFFC = 0x22000000 + (0xFFFFF*32) + (7*4).

    3.4 CMD0: GO_IDLE_STATE

    在上電的階段,發(fā)送的第一個命令是CMD0,使SD卡進入到IDLE狀態(tài)。如下圖所示:

    /*!< CMD0: GO_IDLE_STATE ---------------------------------------------------*//*!< No CMD response required */SDIO_CmdInitStructure.SDIO_Argument = 0x0;SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_GO_IDLE_STATE;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_No;SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);

    使用SDIO_SendCommand發(fā)送CMD,涉及到2個寄存器:SDIO 參數寄存器 (SDIO_ARG)SDIO 命令寄存器 (SDIO_CMD) 。

    名稱描述Value備注
    CMDARG命令參數 (Command argument)
    作為命令消息的一部分發(fā)送給卡的命令參數。如果命令包含參數,則在將命令寫入到命令寄存器之前,必須將參數加載到此寄存器中。
    0

    名稱描述Value備注
    ATACMDCE-ATA 命令 (CE-ATA command)
    如果 ATACMD 置 1,則 CPSM 將傳輸 CMD61。
    0
    nIEN 非中斷使能 (not Interrupt Enable)
    如果該位為 0,則使能 CE-ATA 設備中的中斷。
    0
    ENCMDcompl使能 CMD 完成 (Enable CMD completion)
    如果此位置 1,則使能命令完成信號。
    0
    SDIOSuspendSD I/O 掛起命令 (SD I/O suspend command)
    如果此位置 1,則要發(fā)送的命令為掛起命令(僅用于 SDIO 卡)。
    0
    CPSMEN命令路徑狀態(tài)機 (CPSM) 使能位 (Command path state machine (CPSM) Enable bit)
    如果此位置 1,則使能 CPSM。
    1SDIO_CPSM_Enable
    WAITPENDCPSM 等待數據傳輸結束(CmdPend 內部信號)
    (CPSM Waits for ends of data transfer (CmdPend internal signal))。
    如果此位置 1,則 CPSM 將等到數據傳輸結束后才開始發(fā)送命令。
    0SDIO_Wait_No
    WAITINTCPSM 等待中斷請求 (CPSM waits for interrupt request)
    如果此位置 1,則 CPSM 禁止命令超時并等待中斷請求。
    0SDIO_Wait_No
    WAITRESP等待響應位 (Wait for response bits)
    00:無響應,但 CMDSENT 標志除外
    01:短響應,但 CMDREND 或 CCRCFAIL 標志除外
    10:無響應,但 CMDSENT 標志除外
    11:長響應,但 CMDREND 或 CCRCFAIL 標志除外
    0x00000000SDIO_Response_No
    CMDINDEX命令索引 (Command index)
    命令索引作為命令消息的一部分發(fā)送給卡。
    0SD_CMD_GO_IDLE_STATE

    使用邏輯分析儀抓取實際發(fā)送出來的波形如下:

    發(fā)送CMD0后,還需要判斷是否發(fā)送成功。由于CMD0是無需響應的CMD,所以這里只需要判斷SDIO 狀態(tài)寄存器 (SDIO_STA)是否發(fā)送完成。

    #define SDIO_FLAG_CMDSENT ((uint32_t)0x00000080)static SD_Error CmdError(void) {SD_Error errorstatus = SD_OK;uint32_t timeout;timeout = SDIO_CMD0TIMEOUT; /*!< 10000 */while ((timeout > 0) && (SDIO_GetFlagStatus(SDIO_FLAG_CMDSENT) == RESET)){timeout--;}if (timeout == 0){errorstatus = SD_CMD_RSP_TIMEOUT;return(errorstatus);}/*!< Clear all the static flags */SDIO_ClearFlag(SDIO_STATIC_FLAGS);return(errorstatus); }

    名稱描述Value備注
    CEATAEND針對 CMD61 收到了 CE-ATA 命令完成信號
    (CE-ATA command completion signal received for CMD61)
    SDIOIT 收到了 SDIO 中斷 (SDIO interrupt received)
    RXDAVL接收 FIFO 中有數據可用 (Data available in receive FIFO)
    TXDAVL傳輸 FIFO 中有數據可用 (Data available in transmit FIFO)
    RXFIFOE接收 FIFO 為空 (Receive FIFO empty)
    TXFIFOE發(fā)送 FIFO 為空 (Transmit FIFO empty)
    如果使能了硬件流控制,則 TXFIFOE 信號在 FIFO 包含 2 個字時激活。
    RXFIFOF接收 FIFO 已滿 (Receive FIFO full)
    如果使能了硬件流控制,則 RXFIFOF 信號在 FIFO 差 2 個字便變滿之前激活。
    TXFIFOF傳輸 FIFO 已滿 (Transmit FIFO full)
    RXFIFOHF接收 FIFO 半滿:FIFO 中至少有 8 個字
    (Receive FIFO half full: there are at least 8 words in the FIFO)
    TXFIFOHE傳輸 FIFO 半空:至少可以寫入 8 個字到 FIFO
    (Transmit FIFO half empty: at least 8 words can be written into the FIFO)
    RXACT數據接收正在進行中 (Data receive in progress)
    TXACT數據傳輸正在進行中 (Data transmit in progress)
    CMDACT命令傳輸正在進行中 (Command transfer in progress)
    DBCKEND已發(fā)送/ 接收數據塊(CRC 校驗通過)
    (Data block sent/received (CRC check passed))
    STBITERR在寬總線模式下,并非在所有數據信號上都檢測到了起始位
    (Start bit not detected on all data signals in wide bus mode)
    DATAEND數據結束(數據計數器 SDIDCOUNT 為零)
    (Data end (data counter, SDIDCOUNT, is zero))
    CMDSENT命令已發(fā)送(不需要響應)(Command sent (no response required))0x00000080SDIO_FLAG_CMDSENT
    CMDREND已接收命令響應(CRC 校驗通過)(Command response received (CRC check passed))
    RXOVERR收到了 FIFO 上溢錯誤 (Received FIFO overrun error)
    TXUNDERR傳輸 FIFO 下溢錯誤 (Transmit FIFO underrun error)
    DTIMEOUT數據超時 (Data timeout)
    CTIMEOUT命令響應超時 (Command response timeout)
    命令超時周期為固定值 64 個 SDIO_CK 時鐘周期。
    DCRCFAIL已發(fā)送/ 接收數據塊(CRC 校驗失敗)
    (Data block sent/received (CRC check failed))
    CCRCFAIL已接收命令響應(CRC 校驗失敗)
    (Command response received (CRC check failed))

    3.5 CMD8: SEND_IF_COND

    CMD8: SEND_IF_COND這個命令定義在《Physical Specification Version 2.00》以上版本,它有2個作用:

    • 電壓檢測:檢查卡是否能在主機供電電壓下工作。
    • 擴展現有命令:啟用CMD8可以擴展一些現有命令保留位的新功能。ACMD41被擴展以支持高容量SD存儲卡。
    #define SD_CHECK_PATTERN ((uint32_t)0x000001AA) #define SDIO_SEND_IF_COND ((uint32_t)0x00000008)/*!< CMD8: SEND_IF_COND ----------------------------------------------------*/ /*!< Send CMD8 to verify SD card interface operating condition */ /*!< Argument: - [31:12]: Reserved (shall be set to '0')- [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V)- [7:0]: Check Pattern (recommended 0xAA) */ /*!< CMD Response: R7 */ SDIO_CmdInitStructure.SDIO_Argument = SD_CHECK_PATTERN; SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_IF_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);

    通過下面CMD8命令格式和SD_CHECK_PATTERN(0x000001AA)可以了解到這里選擇的操作電壓是2.7~3.6V。


    實際使用邏輯分析儀抓取主機發(fā)送CMD8時的波形如下:

    CMD8命令發(fā)送成功后,我們需要檢測SD卡是否有響應。通過它來判斷SD卡是否支持SD2.0版本以上的協(xié)議。所以,從代碼上來看這里只是判斷了SDIO 狀態(tài)寄存器 (SDIO_STA)是否已接收命令響應(CMDREND)。因為STM32F429支持SD2.0,所以只能支持大容量SD存儲卡(32GB)。

    static SD_Error CmdResp7Error(void) {SD_Error errorstatus = SD_OK;uint32_t status;uint32_t timeout = SDIO_CMD0TIMEOUT;status = SDIO->STA;while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) && (timeout > 0)){timeout--;status = SDIO->STA;}if ((timeout == 0) || (status & SDIO_FLAG_CTIMEOUT)){/*!< Card is not V2.0 complient or card does not support the set voltage range */errorstatus = SD_CMD_RSP_TIMEOUT;SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT);return(errorstatus);}if (status & SDIO_FLAG_CMDREND){/*!< Card is SD V2.0 compliant */errorstatus = SD_OK;SDIO_ClearFlag(SDIO_FLAG_CMDREND);return(errorstatus);}return(errorstatus); }

    為什么判斷的是Response7?因為在SD2.0協(xié)議是已經定義好的,無論是host還是SD卡都必須按照這個協(xié)議來。



    從邏輯分析儀抓取的波形來看,SD卡有回復,說明它支持SD2.0以上協(xié)議,并且支持主機提供的電壓2.7~3.6V。波形如下:

    3.6 CMD55: SD_CMD_APP_CMD

    CMD55: SD_CMD_APP_CMD指定下個命令為特定應用命令,不是標準命令。SD卡主機模塊系統(tǒng)旨在為各種應用程序類型提供一個標準接口。在此環(huán)境中,需要有特定的客戶/應用程序功能。為實現這些功能,在標準中定義了種類型的通用命令特定應用命令(ACMD)常規(guī)命令(GEN_CMD)。要使用 SD卡制造商特定的 ACMD命令如ACMD41,需要在發(fā)送該命令之前發(fā)送 CMD55 命令,告知 SD卡接下來的命令為特定應用命令。CMD55 命令只對緊接的第一個命令有效,SD卡如果檢測到 CMD55 之后的第一條命令為 ACMD 則執(zhí)行其特定應用功能,如果檢測發(fā)現不是 ACMD 命令,則執(zhí)行標準命令。

    #define SD_CMD_APP_CMD ((uint8_t)55)/*!< CMD55 */ 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);

    發(fā)送出去的波形如下:

    發(fā)送CMD55命令后,通過SDIO 狀態(tài)寄存器 (SDIO_STA)來判斷命令響應是否已經正確被接收。然后,通過函數SDIO_GetCommandResponse獲取SDIO 命令響應寄存器 (SDIO_RESPCMD) Value來判斷Host接收到的響應命令是否是剛剛發(fā)送的命令。最后,通過函數SDIO_GetResponse獲取SDIO 響應 1寄存器 (SDIO_RESP1) SD卡的狀態(tài)。

    static SD_Error CmdResp1Error(uint8_t cmd) {SD_Error errorstatus = SD_OK;uint32_t status;uint32_t response_r1;status = SDIO->STA;while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))){status = SDIO->STA;}.../*!< Check response received is of desired command */if (SDIO_GetCommandResponse() != cmd){errorstatus = SD_ILLEGAL_CMD;return(errorstatus);}/*!< Clear all the static flags */SDIO_ClearFlag(SDIO_STATIC_FLAGS);/*!< We have received response, retrieve it for analysis */response_r1 = SDIO_GetResponse(SDIO_RESP1);if ((response_r1 & SD_OCR_ERRORBITS) == SD_ALLZERO){return(errorstatus);}if (response_r1 & SD_OCR_ADDR_OUT_OF_RANGE){return(SD_ADDR_OUT_OF_RANGE);}...return(errorstatus); }

    從SD2.0協(xié)議里面可以了解到CMD55的response是R1,R1的主要獲取的Card Status。


    這里只是展示了一部分的Card Status,需要找參考完整的可以參考《Physical Specification Version 2.00》,我在下面的參考資料里面有發(fā)相關的鏈接。

    通過邏輯分析儀抓取的波形,Card Status為SD卡已經準備好接收ACMD命令。如下:

    3.7 ACMD41: SD_CMD_SD_APP_OP_COND

    ACMD41: SD_CMD_SD_APP_OP_COND 被設計為為主機提供一種機制來識別拒絕與主機所提供的VDD范圍不匹配的卡。不能在指定范圍內進行數據傳輸的SD卡,應放棄總線操作,進入Inactive 狀態(tài)。OCR寄存器定義了相關的電壓等級。

    #define SD_VOLTAGE_WINDOW_SD ((uint32_t)0x80100000) #define SD_HIGH_CAPACITY ((uint32_t)0x40000000) #define SD_CMD_SD_APP_OP_COND ((uint8_t)41) /*!< For SD Card only */while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL)) {...SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SD_HIGH_CAPACITY;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++; }

    ACMD41主要設置的是OCR寄存器,希望設置的電壓范圍在3.2-3.3和高容量的SD卡(參考OCR寄存器),實際發(fā)送的波形如下:

    發(fā)送ACMD41后,主要是通過Response R3來獲取OCR寄存器的狀態(tài),判斷Card power up status bit (31bit)是否為高電平,如果為低電平那么SD卡還在power up階段未完成。



    重復發(fā)送ACMD41獲取OCR寄存器Power up status bit的狀態(tài),一直發(fā)送到該bit為高電平為止,此時說明power on這個過程已經完成。

    4. 參考資料

    SDIO參考的資料如下:

    下載地址如下:
    https://download.csdn.net/download/ZHONGCAI0901/14975835

    移植成功的完整代碼下載地址如下:
    https://download.csdn.net/download/ZHONGCAI0901/15265756

    總結

    以上是生活随笔為你收集整理的【STM32】STM32 SDIO SD卡读写测试(二)-- SD_Init之Power On阶段的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 99riav国产精品 | 国产精品熟女久久久久久 | 国产人与zoxxxx另类 | 欧美阿v | 亚洲大尺度视频 | 日韩在线观看视频网站 | 久久精品三级 | 激情网五月天 | 亚洲美女高潮久久久 | 国产视频精品在线 | 久久久丁香| 天天色天天操天天射 | 黄色日批 | 免费91视频 | 欧美做爰xxxⅹ性欧美大片 | 欧美一区二区三区成人久久片 | 欧美精品一区二区三区久久久 | 亚洲第一区在线观看 | 嫩草影院中文字幕 | 97精品视频 | 一级片久久久久 | 伊人中文网 | 亚洲最新在线 | 三级a级片 | 新狠狠干 | 天天干天天看 | 精品福利在线观看 | 天堂av2020 | bl无遮挡高h动漫 | 麻豆精品91 | av一本二本 | 无遮挡aaaaa大片免费看 | 日韩在线一区视频 | 91av在线网站| 婷婷在线视频观看 | 欧美tickle狂笑裸体vk | 国产日韩欧美另类 | 亚洲狼人在线 | 草草影院在线 | 中文字幕综合网 | 美女一二三区 | 农夫色综合 | 久久久久久9999 | 三级性生活片 | 性欧美最猛 | 中文字幕欧美一区 | 夜夜操夜夜爱 | 久久精品视频一区 | 久久久国产精 | 中国国产bdsm紧缚捆绑 | 少妇肥臀大白屁股高清 | 精品一区二区三区免费观看 | 一区二区三区黄色 | 人人草人人插 | 久久免费播放视频 | 九九热最新视频 | 在线99热| 动漫涩涩免费网站在线看 | 萌白酱在线观看 | 全黄一级播放 | 亚洲美女一区二区三区 | 免费av软件 | 黄色片视频网站 | 一级伦理农村妇女愉情 | 亚洲小说网 | 福利片一区二区 | 三级理论电影 | 免费国产区 | 青青草视频免费 | 四虎4hu| 公侵犯人妻中文字慕一区二区 | 中文一区二区在线播放 | 怎么可能高潮了就结束漫画 | 偷拍一区二区 | 捆绑无遮挡打光屁股调教女仆 | 69xx国产 | 成人极品视频 | 日本黄色中文字幕 | 国产又粗又长又黄 | 亚洲制服丝袜一区 | 午夜激情男女 | 成人在线国产精品 | 97精品视频在线观看 | 蜜臀久久99静品久久久久久 | 亚洲精品一二三四区 | 美女少妇毛片 | 国产精品视频一区二区三区 | 欧美一区网站 | 91春色| 黄色激情av | 五月婷婷基地 | www.污视频 | 蜜臀在线观看 | 野花中文免费观看6 | 精品国产一区二区三区四区 | 男人操女人的软件 | 亚洲一区二区国产 | 国产一区免费在线观看 | 好邻居韩国剧在线观看 |