基于STM32 DIO接口驅動SD卡的設計(上)
引言
隨著鐵路貨運速度的提高,時速160km/h的快速貨車運 行安全智能監測系統已成為研究的重要課題。由于貨車具有 運行周期長的特點,監測系統采集到的各種實時的數據, 包括防滑控制、軸溫預警、列車定位、轉向架失穩等信息, 需要大量的存儲空間。主控制器采集到這些數據后,需要通 過存儲卡將數據保存下來,然后通過GPRS無線模塊讀取卡 數據信息發送到通用計算機上,以作進一步的分析和處理。 目前常用的存儲器有 U 盤、FLASH 芯片、SD 卡等。SD卡是 一種容量大(最大可達32GB)、性價比高、體積小、訪問 接口簡單、易于集成的存儲卡,采用SD卡可解決上述采集 數據的存儲和傳輸問題;采用ARM Cortex ?-M3內核的32位 微控制器STM32F103作為主控制器,STM32F103 自帶標準 的SD卡接口,使用其自帶的SDIO接口驅動,在4位SD模式 下,最高通信速度可達 24MHz,最高每秒可傳輸12M字節數 據,可快速地實現對SD卡的訪問。
1 硬件功能原理與設計
1.1 SD卡簡介
S D 卡 ( S e c u r e D i g i t a l Memor y Card) 是一種基于半 導體閃存工藝的存儲卡,它的 外形和接口如圖1 所示。 S D 卡 有 9 個 引 腳 與 外 部 通 信 , 支 持 SPI和SDIO兩種模式, 不同模 式下,SD卡引腳功能描述如表1所示。在具體的通信過程中,主機只能選擇一種通信模式。
圖1 SD卡的外形和接口
主控制器STM32F103可支持SDIO模式,在該模式下,CS為主控制器向SD卡發送的片選信號,CMD為主控制器向SD卡 發送的命令/響應信號,CLK為主控制器向SD卡發送的時鐘 信號,DAT0、DAT1和DAT2分別為SD卡的3個數據線。
SD卡的內部結構如圖2所示,SD卡內部不僅有大量的 存儲單元,還具有卡接口控制器、寄存器以及SDIO和SPI兩 種模式的對外接口等。外部主控制器并不直接訪問卡內存儲 單元,而是通過卡的接口控制器與存儲器單元接口相連來訪 問卡的外部信號線。卡內存儲單元的讀、寫、擦除等操作由 卡接口控制器根據主控器發出的命令自動處理完成,而主控 制器無需知道卡內如何操作、管理存儲單元,這將大大降低 主控制器對存儲器操作的負擔。SD卡內部有6個寄存器,其 中四個信息寄存器用來設置和保存卡的關鍵信息,另外兩個 狀 態 寄 存 器 用 來配 置 和 操 作 卡 當 前的狀態。
1.2 SDIO接口
原理
S D I O( S e c u r e D i g i t a l I n p u t a n d O u t p u t ) , 即 安全 數 字 輸 入 輸 出接口。 它由SD存 儲 卡 的 規 范 發 展 而 來 , 在 機 械 、 電 路 、 功 耗 、 信 號 與 軟 件 上 與 多
圖2 SD卡的內部結構
表1 SD卡在不同模式下的引腳定義
種存儲卡完全兼容,可支持多媒體卡(MMC卡)、SD存儲卡、SDIO卡;并且可擴展性較強,可以連接多種SDIO接口 設備,如藍牙、WIFI、GPRS、照相機等。SDIO與SD卡規范 的一個重要區別是增加了低速標準,以最小的硬件開支支持 低速I/O數據傳輸能力。
STM32F1的 SDIO控制器包含2個部分:SDIO 適配器模 塊和 AHB 總線接口,其功能框圖如圖3所示。SDIO_D[7:0] 為SDIO數據總線,如果一個 SD卡接到了總線上,可以通過 主機配置數據傳輸方式使用SDIO_D0或SDIO_D[3:0],所有 的數據線都工作在推挽模式。復位后默認情況下,SDIO_ D 0 用 于 數 據 傳 輸 , 初 始 化 后 主 機 可 以 改 變 數 據 總 線 的 寬 度,采用4位總線SDIO_D[3:0]傳輸數據。
SDIO_CMD為命令/響應接口。SDIO的命令分為應用 相關命令(ACMD)和通用命令(CMD)兩部分,發送應 用相關命令之前必須先發送通用 命令。每發送一個命令, SD卡都會給出一個應答,以告知主機該命令的執行情況或 返回主機所需的數據,這個應答我們稱之為響應,響應也在 SDIO_CMD線上串行傳輸。STM32F1的 SDIO 控制器支持 2 種響應類型,即:短響應(48位)和長響應(136位),這 兩種響應類型都帶 CRC 錯誤檢測。
SDIO_CK為卡時鐘輸出接口。根據卡類型的不同,可 能有好幾個區間,這就涉及到時鐘頻率的設置,SDIO_CK 與 SDIO適配器時鐘(SDIOCLK)的關系為:
SDIO_CK=SDIOCLK/(2+CLKDIV)
上式中,SDIOCLK 為SDIO掛接在AHB總線上的接口時 鐘(對于STM32F1系列是72MHz);CLKDIV 則是時鐘分頻 系數,可以通過SDIO的 SDIO_CLKCR 寄存器進行設置(要 確保SDIO_CK不超過卡的最大操作頻率)。
1.3 硬件連接
主 控 制 器 選 用 大 容 量 、 增 強 型 的 芯 片 STM32F103ZET6,其與SD卡座的電路連接圖如圖4所示。 SDIO_D0(PC8)、SDIO_D1(PC9)、SDIO_D2(PC10) 和SDIO_D3(PC11)這4個引腳接上拉電阻,通過3.3V的電
源給SD卡端提供灌電流,從而提高STM32F103ZET6芯片的
圖3 STM32F1的SDIO控制器功能框圖
圖4 STM32F103ZET6與SD卡座的電路連接圖 驅動能力;
SDIO_CK(PC12)直接與卡的CLK端相連,用 于向SD卡發送時鐘信號。除了SDIO接口的連接外,還有兩根控制線:SD_CD(PD5)用于檢測SD卡接口與卡座是否接好,若完全接好則該引腳為低電平,否則為高電平;SD_ WP(PD6)用于檢測SD卡當期是否設置寫保護,寫保護時 該引腳為高電平,否則為低電平。
2 軟件設計
軟件設計主要包括硬件層配置以及驅動層配置。硬件 層配置主要包括配置SD I O 相關寄存器、 識別卡類型、 獲 取卡信息,實現對SD卡的初始化;驅動層配置主要是利用 SDIO接口驅動SD卡進行讀、寫操作。利用ST官方提供的固 件庫函數可大大提高軟件設計的效率,STM32F1 的 SDIO 相 關操作的函數分布在源文件 stm32f10x_sdio.c 以及對應的頭 文件 stm32f10x_sdio.h 中。(未完待續)
評論