當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > STM32F407之SD卡讀數(shù)據(jù)介紹
1,SD卡基礎(chǔ)知識
SD卡(Secure Digital Memory Card)即:安全數(shù)字存儲卡,它是在MMC的基礎(chǔ)上發(fā)展而來,作為存儲器件廣泛應(yīng)用于電子產(chǎn)品中。
1.1 SD卡有SDIO和SPI兩種傳輸方式,具體信號定義如下:
其中紅色選中的信號是必需的。
1.2 SD卡的內(nèi)部結(jié)構(gòu)
1.3 SD中的兩個重要概念: Sector與Block
Sector: A number of blocks, basic erase unit (SD擦除單位)
可以設(shè)置為N*block。
Block : A number of bytes, basic data transfer unit (SD中最小的讀寫單位)。
block length 可以被 SET_BLOCKLEN (CMD16)設(shè)置 。
1.4 SD 常用命令
Class0 :(卡的識別、初始化等基本命令集)
CMD0:復(fù)位SD 卡.
CMD1:讀OCR寄存器.
CMD9:讀CSD寄存器.
CMD10:讀CID寄存器.
CMD12:停止讀多塊時的數(shù)據(jù)傳輸
CMD13:讀 Card_Status 寄存器
Class2 (讀卡命令集):
CMD16:設(shè)置塊的長度
CMD17:讀單塊.
CMD18:讀多塊,直至主機發(fā)送CMD12為止 .
Class4(寫卡命令集) :
CMD24:寫單塊.
CMD25:寫多塊.
CMD27:寫CSD寄存器 .
Class5 (擦除卡命令集):
CMD32:設(shè)置擦除塊的起始地址.
CMD33:設(shè)置擦除塊的終止地址.
CMD38: 擦除所選擇的塊.
2,STM32讀取SD流程
STM32的SDIO接口提供 APB2 外設(shè)總線與多媒體卡 (MMC)、SD 卡、SDIO 卡以及 CE-ATA 設(shè)備之間的接口。
2.1 時鐘
三個時鐘信號:卡時鐘SDIO_CK(傳輸速率0-25MHZ)、SDIO適配器時鐘SDIOCLK(用于驅(qū)動適配器來產(chǎn)生卡時鐘,與所掛載的總線時鐘相同)、總線時鐘PCLK2(F1為HCLK2)
SDIO_CK計算公式:SDIO_CK=SDIOCLK/(2+CLKp) CLKp為可配置的分頻系數(shù),在初始化時不可以超過400khz ,初始化完成后可全速運行。
2.2 操作流程
A, 初始化相關(guān) GPIO 及 SDIO 外設(shè);
B, 配置 SDIO 基本通信環(huán)境進入卡識別模式,通過幾個命令處理后得到卡類型;
C, 如果是可用卡就進入數(shù)據(jù)傳輸模式,接下來就可以進行讀、寫、擦除的操作。
2.3 SD 卡初始化
SD 卡初始化過程主要是卡識別和相關(guān) SD 卡狀態(tài)獲取。整個初始化函數(shù)流程如下:
具體執(zhí)行流程如下:
(1) 配置 NVIC,SD 卡通信用到 SDIO 中斷,如果用到 DMA 傳輸還需要配置 DMA 中 斷。注意中斷服務(wù)函數(shù)不是定義在 stm32f4xx_it.c 文件的,是直接定義在 bsp_sdio_sd.c 文件中,中斷服務(wù)函數(shù)定義在個文件問題都不大,只要定義正確就 可以的,編譯器會自動尋找。
(2) 執(zhí)行 SD_LowLevel_Init 函數(shù),其功能是對底層 SDIO 引腳進行初始化以及開啟相 關(guān)時鐘,該函數(shù)在之前已經(jīng)講解。
(3) SDIO_DeInit 函數(shù)用于解除初始化 SDIO 接口,它只是簡單調(diào)用 SD_LowLevel_DeInit 函數(shù)。而 SD_LowLevel_DeInit 函數(shù)是與 SD_LowLevel_Init 函數(shù)相反功能,關(guān)閉相關(guān)時鐘,關(guān)閉 SDIO 電源,讓 SDIO 接近上電復(fù)位狀態(tài)。 恢復(fù)復(fù)位狀態(tài)后再進行相關(guān)配置,可以防止部分沒有配置的參數(shù)采用非默認(rèn)值而 導(dǎo)致錯誤,這是 ST 官方驅(qū)動常用的一種初始化方式。
(4) 調(diào)用 SD_PowerON 函數(shù),它用于查詢卡的工作電壓和時鐘控制配置,并返回 SD_Error 類型錯誤。
2.4 SD卡讀操作
從 SD 卡讀取數(shù)據(jù)可分為單塊讀取和多塊讀取。這里介紹單塊讀操作流程。
SD_ReadBlock 函數(shù)執(zhí)行流程如下:
(1) 將 SDIO 外設(shè)的數(shù)據(jù)控制寄存器 (SDIO_DCTRL)清理,復(fù)位之前的傳輸設(shè)置。
(2) 調(diào)用 SDIO_ITConfig 函數(shù)使能相關(guān)中斷,包括數(shù)據(jù) CRC 失敗中斷、數(shù)據(jù)超時中斷、數(shù) 據(jù)結(jié)束中斷等等。然后調(diào)用 SD_LowLevel_DMA_RxConfig 函數(shù),配置使能 SDIO 從 SD 卡的讀取數(shù)據(jù)的 DMA 請求。為使 SDIO 發(fā)送 DMA 請求,需要調(diào)用 SDIO_DMACmd 函數(shù)使能。對于高容量的 SD 卡要求塊大小必 須為 512 字節(jié),程序員有責(zé)任保證目標(biāo)讀取地址與塊大小的字節(jié)對齊問題。
(3) 對 SD 卡進行數(shù)據(jù)讀寫之前,都必須發(fā)送 CMD16 指定塊的大小,對于標(biāo)準(zhǔn)卡,讀取 BlockSize 長度字節(jié)的塊;對于 SDHC 卡,讀取 512 字節(jié)的塊。
(4) 利用 SDIO_DataInitTypeDef 結(jié)構(gòu)體類型變量配置數(shù)據(jù)傳輸?shù)某瑫r、塊數(shù)量、數(shù)據(jù)塊大 小、數(shù)據(jù)傳輸方向等參數(shù)并使用 SDIO_DataConfig 函數(shù)完成數(shù)據(jù)傳輸環(huán)境配置。
(5) 最后控制器向 SD 卡發(fā)送單塊讀數(shù)據(jù)命令 CMD17,SD 卡在接收到命令后就會通過數(shù)據(jù)線把數(shù)據(jù)傳輸?shù)娇刂破鲾?shù)據(jù) FIFO 內(nèi),并自動生成 DMA 傳輸請求。
(6)SD_WaitReadOperation 函數(shù)用于等待數(shù)據(jù)讀取操作完成,只有在確保數(shù)據(jù)讀取完成了,我們就可以放心使用數(shù)據(jù)。