1. 程式人生 > 其它 >RISC-V MCU開發實戰 (二):SD初應用

RISC-V MCU開發實戰 (二):SD初應用

軟體平臺 MounRiver Studio(MRS),硬體平臺CH32V103開發板,以及一張小於32G SD卡。

1、SD卡簡介

SD儲存卡( Secure Digital Memory Card)是一種基於半導體快快閃記憶體儲器的新一代高速儲存裝置。SD儲存卡的技術是從MMC卡( MultiMedia Card格式上發展而來,在相容SD儲存卡基礎上發展了SDIO( SD Input/ Output)卡,此相容性包括機械,電子,電力,訊號和軟體,通常將SD、SDIO卡俗稱SD儲存卡。

SD卡具有高記憶容量、快速資料傳輸率、極大的移動靈活性以及很好的安全性,它被廣泛地應用於行動式裝置上,例如數碼相機、平板電腦和多媒體播放器等。根據SD卡容量大小不同,可將SD卡分為以下幾類:

0~2G:SD卡;2~32G:SDHC卡;32~2T:SDXC卡;

其中,SD卡協議和SDHC卡版本協議基本相容,但SDXC卡與SD卡和SDHC卡相差較大,本文主要介紹使用SD卡和SDHC卡。

控制器對SD卡進行讀寫通訊操作一般有兩種通訊介面可選,一種是SPI介面,另外一種是SDIO介面。 SPI協議驅動SD卡方式相較於SDIO驅動SD卡方式,使用引腳資源少,控制程式相對較為簡單,但傳輸速度不如使用SDIO介面的快。由於CH32V103開發板上SD卡槽與晶片引腳的連線方式為SPI驅動方式,因此本文采用SPI協議驅動SD卡方式。

使用SPI方式驅動SD卡需要用到以下幾個暫存器:

① CID:卡識別號(Card identification number),用來識別卡的唯一的個體號碼;

② CSD:卡的特定資料(Card Specific Data),指卡的操作條件資訊;

③ SCR:SD配置暫存器(SD Configuration Register),SD卡特殊性資訊;

④ OCR:操作條件暫存器(Operation conditions register)

關於SD卡其他暫存器資訊,可參考SD 簡易規格檔案《 Physical Layer Simplified Specification V2.0》。

關於SD命令格式,固定為48bit,通過命令線(CMD)連續傳輸,其具體命令格式以及命令解釋如下:

起始位和終止位:命令的主體包含在起始位與終止位之間,它們都只包含一個數據位,起始位為0,終止位為1。

傳輸標誌:用於區分傳輸方向,該位為1時表示命令,方向為主機傳輸到SD卡,該位為0時表示響應,方向為SD卡傳輸到主機。

命令主體內容包括命令、地址資訊/引數和CRC校驗三個部分。

1.命令號:它固定佔用6bit,所以總共有64個命令(代號: CMD0~CMD63),每個命令都有特定的用途,部分命令不適用於SPI匯流排,或不適用於SD卡操作,只是專門用於MMC卡或者SDI/O卡。

2.地址/引數:每個命令有32bit地址資訊/引數用於命令附加內容,例如,廣播命令沒有地址資訊,這32bit用於指定引數,而定址命令這32bit用於指定目標SD卡的地址,使用SPI匯流排驅動時,通過片選引腳來選擇不同的卡,所以使用這些命令時地址可填充任意值。

3.CRC7校驗:長度為7bit的校驗位用於驗證命令傳輸內容正確性,如果發生外部干擾導致傳輸資料個別位狀態改變將導致校準失敗,也意味著命令傳輸失敗,SD卡不執行命令。使用SPI驅動時,命令中的CRC7校驗預設是關閉的,即這CRC7校驗位中可以寫入任意值而不影響通訊,僅在傳送CMD0命令時需要強制帶標準的CRC7校驗。

SPI模式下有以下幾個重要的操作指令:

SD卡R1響應格式如下:

關於SD卡具體資訊,可參考《 Physical Layer Simplified Specification V2.0》。

2、MRS中開發流程

1)首先新建一個CH32V103C8T6 的工程,這個要與對應晶片對應

上圖最下方紅框中是對選中晶片的資源的簡單介紹,方便查詢

2) 新建完工程之後,我們開啟main.c檔案,可以看到主函式只是一些初始化和串列埠列印,我們自己的主函式邏輯可以新增在列印下面就可以了;

3) 新建一個hardware的資料夾,右鍵工程new->folder,填寫檔名,點選finish即可,我們可以以同樣的方式在hardware目錄下再新建SD目錄,SPI目錄,條理清晰。

4) 在SPI目錄下,New>Source File,填寫檔名spi.c,內容是SPI初始化函式以及讀寫函式,在新建個spi.h檔案用來宣告函式,這個新的標頭檔案需要新增到標頭檔案定址路徑中,點選選單欄,在彈出的頁面中,如下圖,點選綠色加號新增路徑即可

部分程式碼截圖如下,有詳細註釋,不再贅述

5) 在 SD目錄下新建sd.c ,sd.h,新增標頭檔案路徑方式與上條一致,sd.h檔案主要包括各種巨集定義及函式宣告,包括SD卡型別定義、SD卡指令定義等以及函式宣告;

sd.c檔案主要進行SD初始化等操作,關於SD卡初始化函式SD_Initialize,其具體操作流程如下:

(1)呼叫SD_SPI_Init函式初始化GPIO口及SPI工作模式,同時控制片選引腳使之輸出高電平;

(2)利用for迴圈並呼叫SD_SPI_ReadWriteByte函式進行10讀寫操作,同時產生80個時鐘訊號,滿足SD卡初始化至少需要74個時鐘的要求;

(3)呼叫SD_SendCmd函式傳送CMD0命令,復位SD卡同時進入空閒狀態;

(4)呼叫SD_SendCmd函式傳送相關命令對SD卡版本型別進行判斷,同時返回響應資訊。

關於sd.c檔案中其他函式,程式中都有相應註釋,可結合註釋以及《 Physical Layer Simplified Specification V2.0》手冊進行理解。

部分程式碼如下:

6) main.c檔案主要進行相關函式初始化以及SD卡插入檢測、初始化檢測以及讀取SD卡容量大小

7) 在工具欄中點選編譯按鈕,進行編譯,生成二進位制檔案,開發環節結束

3、驗證

點選選單欄下載按鈕,進行下載,插入SD卡,從串列埠助手可以看到輸出正常