1. 程式人生 > >嵌入式系統學習——STM32之SD卡(下)

嵌入式系統學習——STM32之SD卡(下)

SDIO簡介-SDIO暫存器

SDIO電源控制暫存器(SDIO_POWER)

        該暫存器只有最低2位(PWRCTRL[1:0])有效,其他都是保留位,STM32復位以後,PWRCTRL=00,處於掉電狀態。所以,我們首先要給SDIO上電,設定這兩個位為:11。
SDIO時鐘控制暫存器(SDIO_CLKCR)

SDIO引數暫存器(SDIO_ARG)


該暫存器用於儲存命令引數。注意:引數必須先於命令寫入。


SDIO命令暫存器(SDIO_CMD)

      低6位為命令索引,即要傳送的命令索引號(如傳送CMD1,其值為1,索引就設定為1)。位[7:6],用於設定等待響應位,用於指示CPSM是否需要等待,以及等待型別等。CPSM:即命令通道狀態機,請參考《STM32中文參考手冊》相關章節。命令通道狀態機我們一般都是開啟的,所以位10要設定為1。
SDIO命令響應暫存器(SDIO_RESPCMD)

        該暫存器只有低6位有效,比較簡單,用於儲存最後收到的命令響應中的命令索引。如果傳輸的命令響應不包含命令索引,則該暫存器的內容不可預知。
SDIO命令響應1~4暫存器(SDIO_RESPx,x=1~4)

      命令響應暫存器組,總共包含4個32位暫存器組成,用於存放接收到的卡響應部分的資訊。如果收到短響應,則資料存放在SDIO_RESP1暫存器裡面,其他三個暫存器沒有用到。而如果收到長響應,則依次存放在SDIO_RESP1~ SDIO_RESP4裡面
SDIO資料定時器暫存器(SDIO_DTIMER)

      該暫存器用於儲存以卡匯流排時鐘(SDIO_CK)為週期的資料超時時間,一個計數器將從SDIO_DTIMER暫存器載入數值,並在資料通道狀態機(DPSM)進入Wait_R或繁忙狀態時進行遞減計數,當DPSM處在這些狀態時,如果計數器減為0,則設定超時標誌。DPSM:即資料通道狀態機,類似CPSM,詳見《STM32中文參考手冊》相關章節。
        注意:在寫入資料控制暫存器(SDIO_DCTRL),進行資料傳輸之前,須先寫入該暫存器(SDIO_DTIMER)和資料長度暫存器(SDIO_DLEN)!

SDIO資料長度暫存器(SDIO_DLEN)

      該暫存器低25位有效,用於設定需要傳輸的資料位元組長度。對於塊資料傳輸,該暫存器的數值,必須是資料塊長度(通過SDIO_DCTRL設定)的倍數。
      即:假定資料塊大小為512位元組,那麼SDIO_DLEN的設定,必須是512的整數倍,最大可以設定讀取65535個數據塊。
SDIO資料控制暫存器(SDIO_DCTRL)
      該暫存器,用於控制資料通道狀態機(DPSM),包括資料傳輸使能、傳輸方向、傳輸模式、DMA使能、資料塊長度等資訊的設定。
     我們需要根據自己的實際情況,來配置該暫存器,才可正常實現資料收發。
SDIO狀態暫存器(SDIO_STA)

       狀態暫存器可以用來查詢SDIO控制器的當前狀態,以便處理各種事務。比如SDIO_STA的位2表示命令響應超時,說明SDIO的命令響應出了問題。我們通過設定SDIO_ICR的位2則可以清除這個超時標誌。
SDIO資料FIFO暫存器(SDIO_FIFO)

      資料FIFO暫存器包括接收和傳送FIFO,他們由一組連續的32個地址上的32個暫存器組成,CPU可以使用FIFO讀寫多個運算元。例如我們要從SD卡讀資料,就必須讀SDIO_FIFO暫存器,要寫資料到SD卡,則要寫SDIO_FIFO暫存器。SDIO將這32個地址分為16個一組,傳送接收各佔一半。而我們每次讀寫的時候,最多就是讀取接收FIFO或寫入傳送FIFO的一半大小的資料,也就是8個字(32個位元組)。
注意:操作SDIO_FIFO必須是以4位元組對齊的記憶體操作,否則可能出錯!

SD卡簡介-什麼是SD卡?

       SD卡(Secure Digital Memory Card)即:安全數碼卡,它是在MMC的基礎上發展而來,是一種基於半導體快閃記憶器的新一代記憶裝置,它被廣泛地於行動式裝置上使用,例如數碼相機、個人數碼助理(PDA)和多媒體播放器等。SD卡由日本松下、東芝及美國SanDisk公司於1999年8月共同開發研製。
      SD卡按容量分類,可以分為3類:SD卡、SDHC卡、SDXC卡,如下表所示:

      SD卡由9個引腳與外部通訊,支援SPI和SDIO兩種模式,不同模式下,SD卡引腳功能描述如下表所示:


SD卡簡介-SD卡特點

①高容量,最大可達2TB(目前已有512GB的SD卡)。
②高安全性。 
③高速,目前已有讀取速度近100MB/S的SD卡。
④體積小巧,標準SD卡大小隻有一張郵票大小,重量僅2g。
⑤介面簡單,支援SPI和SDIO兩種訪問模式。
注意:TF卡+卡套,組合起來也可以當SD卡用,不過,很大一部分TF卡,不支援SPI訪問模式。所以,SPI驅動SD卡的時候,儘量選擇大卡(SD卡),而不要選擇TF卡。

SD卡簡介-SD卡暫存器

SD卡一般有5個暫存器,如下表:


SD卡簡介-SD卡初始化

      從SD卡初始化流程可知,不管什麼卡(這裡我們將卡分為4類:SD2.0高容量卡(SDHC,最大32G),SD2.0標準容量卡(SDSC,最大2G),SD1.x卡和MMC卡),首先我們要執行的是卡上電(設定SDIO_POWER
[1:0]=11),上電後傳送CMD0,對卡進行軟復位,之後傳送CMD8命令,用於區分SD卡2.0,只有2.0及以後的卡才支援CMD8命令,MMC卡和V1.x的卡,是不支援該命令的。 CMD8命令格式如下表:

       在傳送CMD8的時候,通過其帶的引數我們可以設定VHS位,以告訴SD卡,主機的供電情況,讓SD卡知道主機的供電範圍。
VHS位定義如下表所示:VHS位定義如下表所示:

      這裡我們使用引數0X1AA,即告訴SD卡,主機供電為2.7~3.6V之間,如果SD卡支援CMD8,且支援該電壓範圍,則會通過CMD8的響應(R7,關於SD卡響應,請參考《SD卡2.0協議.pdf》第4.9節)將引數部分原本返回給主機,如果不支援CMD8,或者不支援這個電壓範圍,則不響應。
      在傳送CMD8後,傳送ACMD41(注意:傳送ACMD41之前,要先發送CMD55),來進一步確認卡的操作電壓範圍,並通過HCS位來告訴SD卡,主機是不是支援高容量卡(SDHC)。
CMD2用於獲取CID暫存器資料,CID暫存器各位定義如下表:

      SD卡在收到CMD2後,將返回R2長響應(136位),其中包含128位有效資料(CID暫存器內容),存放在SDIO_RESP1~4等4個暫存器裡面。通過讀取這四個暫存器,就可以獲得SD卡的CID資訊。
       CMD3,用於設定卡相對地址(RCA,必須為非0),對於SD卡(非MMC卡),在收到CMD3後,將返回一個新的RCA給主機,方便主機定址。RCA的存在允許一個SDIO介面掛多個SD卡,通過RCA來區分主機要操作的是哪個卡。對於MMC卡,則不是由SD卡自動返回RCA,而是主機主動設定MMC卡的RCA,即通過CMD3帶引數(高16位用於RCA設定),實現RCA設定。同樣MMC卡也支援一個SDIO介面掛多個MMC卡,不同於SD卡的是所有的RCA都是由主機主動設定的,而SD卡的RCA則是SD卡發給主機的。
       在獲得卡RCA之後,我們便可以傳送CMD9(帶RCA引數),獲得SD卡的CSD暫存器內容,從CSD暫存器,我們可以得到SD卡的容量和扇區大小等十分重要的資訊。CSD暫存器我們在這裡就不詳細介紹了,關於CSD暫存器的詳細介紹,請參考《SD卡2.0協議.pdf》。
        至此,我們的SD卡初始化基本就結束了,最後通過CMD7命令,選中我們要操作的SD卡,即可開始對SD卡的讀寫操作了。