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