SD卡的初始化及基本應用

SD卡的初始化

上一篇文章我分享了一些關於SDIO接口的理解,通過SDIO接口,我們現在已經可以通過stm32與SD卡通信了。在通信之前,我們需要對SD卡進行初始化操作,對SD卡初始化需要通過我們前面說的CMD命令,SD卡接收到相應的CMD命令後,反饋相應的數據,我們便是通過這些反饋的數據對我們SD卡的類型,大小等進行判斷,從而完成初始化。

這裏上一張與SD卡參數有關的5個會反饋的寄存器:
在這裏插入圖片描述
其初始化的流程爲:
①、發送CMD0命令,使SD卡進入Idle狀態。
②、發送CMD8命令,改變VHS位,告訴SD卡主機供電範圍。若響應正常,在發送CMD55命令,若響應正常,則可以區分出我們的卡是SD卡還是MMC卡。
③、若以上都響應正常,發送CMD55命令,響應正常後發送ACMD41命令,攜帶參數爲供電電壓範圍和HCS位。也就是說我們對HCS位寫1,然後判斷返回的R3類型的響應(對應的位,第30位)是否也爲1,若爲1,則爲大容量卡 SDHC 卡。
④、至此,我們已經區分好了卡的類型(MMC,SDHC,SDSC),然後根據響應數據判斷SDIO->RESP1寄存器的上電位是否置1。若置1則表示上電完成。接下來發送指令獲取SD卡對應的信息。
⑤、發送CMD2,反饋長響應,獲取CID。
⑥、發送CMD3,用於設置卡的相對地址(RCA,必須爲非0),對於SD卡,在收到CMD3後,將返回一個新的RCA給主機(卡發送RCA到主機),主機記錄了新的RCA即爲此時這張SD卡的相對地址。通過CMD3帶參數(高16位用於RCA設置),實現RCA設置
⑦、發送CMD9和RCA,反饋長反應,獲取CSD。從CSD寄存器,我們便可以直到SD卡的容量,扇區大小等十分重要的信息。
⑧、發送CMD7,帶參數rca,使能SD卡。
⑨、SDIO_Clock_Set(clkdiv);//clkdiv = 0x00
通過這個語句設置頻率爲24MHz。公式看之前的SDIO接口文章。因爲之前初始化過程,頻率不得高於400KHz,所以現在調高速度。
⑩、SDIO->CLKCR|=WideMode;
#define SDIO_BusWide_4b ((uint32_t)0x00000800)
WideMode = SDIO_BusWide_4b;
通過CLKCR寄存器設置總線寬度爲4bit。
也可以通過CMD55+ACMD6配置爲4bit數據傳輸模式來設置。

最後設置SD卡的工作模式爲查詢模式即可,初始化就到這裏!

SD卡讀取數據流程

SD卡讀取一個塊流程

在這裏插入圖片描述
①、發送CMD16+設置數據長度爲blksize,短響應。
②、發送CMD17+從addr地址出讀取數據,短響應。
③、關閉總中斷,判斷當前SD卡工作模式。
④、如果是輪詢模式,就等待SD卡的FIFO寄存器半滿(8個字),然後把數據存進數組中,數組地址++,一次讀8個字。直到SD卡的STA寄存器完成標誌置位,結束讀取。也就相當於從SD卡的一個地址,讀取了blksize(一般我們設置512字節)大小的數據,把這些數據寫進了我們自己定義的數組中。

SD卡讀取多個塊流程

在這裏插入圖片描述
①、開始流程都差不多,發送CMD16設置數據塊大小,注意這裏我們設置了數據長度,上面我們說了可以判斷SD卡的STA寄存器完成標誌是否置位,來判斷傳輸是否完成,那麼這裏的置位與否,就是看數據長度(塊大小 * 塊數)。
②、發送CMD18+addr,addr指示我們要從什麼地址開始讀。
③、接收數據的流程和單塊一樣,我們只是改變了數據長度,從而改變了讀取大小。數據長度可以通過這個函數來設置SDIO_DataConfig()。
④、接收完成後我們發送CMD12來結束數據塊讀取。

SD卡寫入一個塊流程

在這裏插入圖片描述
①、和讀取有一點區別,我們設置好CMD16+數據塊大小命令後,要先對SD卡進行查忙操作,也就是發送CMD13+RCA,根據反饋的數據我們判斷卡是否繁忙,若繁忙則一直查詢,直到一定時間(超時了就return唄)。
②、寫入CMD24+addr,就可以往addr這個地址裏面寫入數據了。
③、原子的程序在這裏做了很複雜的判斷,簡單說就是當剩餘數據長度大於32字節,就很普通的往地址裏寫數據,寫完8個字addr+32。若剩餘數據長度小於32字節,則根據當前的SD卡的寫入地址判斷還剩幾個字節,這樣可以防止在循環寫入數據時,超過數據長度導致報錯。

SD卡寫入多個塊流程

我們直接上圖吧,不多囉嗦了
在這裏插入圖片描述
預擦除是爲了提高SD卡寫入速度,(ACMD23+數據塊個數)

至此,SD卡的讀取我們算是介紹完了。需要注意的是,對SD卡進行讀寫操作時一定不能用局部數組來做,有很大概率導致內存疊加。所以我們最好使用一定的內存管理方法,去更好地來使用我們的SD卡。具體可以看我內存管理的博客,有很詳細的介紹。
stm32內存管理及堆棧管理

我們還是感覺SD卡的操作過於麻煩,很多的文件又不好轉換成純16進制文件來供我們使用,所以我下面打算給大家介紹一下FATfs文件管理。

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