久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > STM32學習筆記——SDIO(1)

STM32學習筆記——SDIO(1)

作者: 時間:2016-11-21 來源:網絡 收藏
STM32SDIO——SD卡輸入/輸出模塊摸索了一下,今天只看了POWER UP這個函數的實現。對SDIO編寫驅動,需要參考SD卡的協議,我手上的SD卡協議是ver2.00的物理層簡化協議。協議主要規定了主機(這里就是STM32)向SD卡寫入的各種控制指令,以及SD卡的初始化過程狀態轉移圖。了解SD卡從初始化狀態轉移圖開始。


這個圖看起來有點復雜,感覺無從下手,其實仔細瞧瞧就跟我們數電學的狀態轉移圖差不多,框框里面是各種操作,箭頭指向下一步操作,直線引出去的部分就是狀態發生跳轉的條件。首先上電(power-on),然后發出CMD0,再接著發送CMD8,有應答(response)判斷為Ver2.00或更新的SDMC,無應答(no response)判斷為ver2.00或者更新版SDMC(電壓不匹配(voltage mismatch) )或ver1.X SDMC或不是SDMC。若判斷為前一種情況,則問詢是否為有效應答(valid response),如果不是,判斷為無效卡,否則判斷為有效卡且開始循環發送ACMD41指令直至SD卡發出power up應答。然后判斷CCS(card capacity status——卡容量狀態)位,為1則判斷為ver2.00或者更新的大容量卡(high capacity SD memory card),否則判斷為ver2.00或者更新的標準卡(sandard capacity SD memory card)。至此,power on工作結束。
上文只是對狀態圖進行了一個解讀,真正要控制還是需要知道各個CMD如何發送。SD卡協議提供了幾個CMD的格式以及其響應值的格式(如果有相應的話)。下面就對函數的具體編寫進行下總結。
(1)初始化SDIO
利用SDIO_Init中的結構體初始化SDIO接口。該結構體有以下幾個成員函數:SDIO_ClockDiv、SDIO_ClockEdge、SDIO_ClockBypass、SDIO_ClockPowerSave、SDIO_BusWide、SDIO_HardwareFlowControl。其中比較重要的是SDIO_ClockDiv成員,它確定了SDIO的分頻系數,在不使用旁路時鐘(ByPass)的時候SDIO_CLK=HCLK/(SDIO_ClockDiv+2),我們在這里將SDIO_CLK設置為400kHZ,就是通過設置分頻系數實現的。初始化完成后,就進行第一步,也就是power on,調用SDIO_SetPowerState函數即可。最后別忘記使能SDIO的時鐘。
(2)發送CMD0
由STM32向SD卡發送指令可以直接調用SDIO_SendCommand函數,該函數包含一個結構體,該結構體有以下幾個成員:SDIO_Argument、SDIO_CmdIndex、SDIO_Response、SDIO_Wait、SDIO_CPSM。跟我們編程密切相關的一個是SDIO_Argument——參數,許多帶有響應的命令都需要通過設置參數來實現,由于CMD0沒有響應,所以此處設為0x00即可。SDIO_CmdIndex成員是該結構體核心——指令指數。也就是說,如果我要發送CMD0,SDIO_CmdIndex=0,如果發送ACMD41,SDIO_CmdIndex=41,但是注意此處SDIO_CmdIndex的值是等于指令,而且是指令的十進制形式,但是我們在給SDIO_CmdIndex賦值時必須轉換成十六進制。SDIO_Wait設置等待中斷。填寫好結構體后檢測是否正確受到CMD0,然后才能進行下一步。為了保證程序正確,這樣的檢測在每一個指令發送周期都是必須的。
(3)發送CMD8
用同樣類似的方式發送CMD8。注意此時CMD8是帶有響應的指令,接收到指令后sd返回該SDIO_Argument的值,所以對SDIO_Argument要進行特殊設置,設置后SDIO->ARG寄存器便有了該值。SDIO_Response——把應答模式設置成短應答,這是根據參考指南設置的。同樣地,在填寫完結構體后檢查是否接收到命令。根據SD協議初始化流程圖,此時如果有響應則SD遵循2.00協議,否則說明是1.x 或者mmc。無論是哪一種情況,都發送CMD55來檢測。
(4)發送CMD55
CMD55是一個特殊的指令,該指令告訴主機下一個command將會是一個應用指令(application command),比如要發送ACMD41之前必須先發送CMD55。此處發送CMD55是為了檢測卡的類型。不過暫時沒沒看懂為什么是發送CMD55,因為關于CMD55的解釋中并沒有提到它能夠檢測卡類型,只說了它的應答類型是R1。判斷是SD卡或者是不支持的卡。
(5)進入循環,再次發送CMD55
這次發送CMD55就是為發送ACMD41做準備了。為什么要在循環里發送呢?因為SD協議初始化狀態圖中發送ACMD的過程是一個反復地,指導檢測出power up為1為止,所以該處的循環條件設置成!validvoltage,validvoltage為OCR的power up位。需要注意的是例程中的循環條件是(!validvoltage) && (count < SD_MAX_VOLT_TRIAL),也就是說它設置了一個最大檢測次數,當超過該檢測次數仍然沒有power up時就可以跳出,反饋檢測失敗的信息,這樣程序不會死在此處。
(6)發送ACMD41
發送了CMD55后檢測到收到指令,緊接著發送ACMD41指令。ACMD41響應類型是R3,該響應返回OCR寄存器的值,稍后我們需要這個寄存器來判斷卡容量以及power up狀態。注意此處參數格式規定的是HCS和Voltage Window共同確定的。填寫完結構體后檢查是否正確接收指令,然后檢測power up位是不是1,不是的話再次循環,是則根據條件跳出循環。如果達到最大循環次數power up仍然沒置位,則返回卡不可用的信息。
(7)檢測卡的最終類型
正常上電好后,檢測OCR的CCS為,一次來判斷卡是SDHC還是SDSC。至此,power on函數功能到此結束。


關鍵詞: STM32學習筆記SDI

評論


技術專區

關閉