【摘 要】隨著電子技術的不斷發(fā)展,嵌入式系統(tǒng)越來越多的在控制類、消費類、通訊類等電子產(chǎn)品廣泛應用,嵌入式技術越來越和人們的生活緊密結合。作為嵌入式系統(tǒng)的核心部分,MCU的更新迭代速度也在摩爾定律下逐漸加快。同時SD卡作為嵌入式系統(tǒng)中重要的存儲器件,使用范圍也越發(fā)廣泛。但是針對不同型號的單片機編寫與SD卡的底層驅動是一件必須但卻繁瑣的工作。因此,本文提出通過一種外圍設備,使得嵌入式系統(tǒng)連接SD卡工作時,能實現(xiàn)即插即用,從而省去重復開發(fā)底層驅動的工作。
【關鍵詞】SD卡 嵌入式 數(shù)據(jù)讀取
嵌入式系統(tǒng)技術具有非常廣闊的應用前景,與此同時對于嵌入式環(huán)境的信息處理需要存儲大量的數(shù)據(jù),配合適當?shù)拇鎯υO備顯得十分的迫切,而利用SD卡進行嵌入式的數(shù)據(jù)儲存已經(jīng)成為一種趨勢。
但是隨著嵌入式領域的快速發(fā)展,每天都會有很多新型的芯片研制出來,但是如果要對每一種芯片都讓它能利用SD卡進行存儲,勢必要對每款芯片單獨開發(fā)其SD讀寫驅動,這實際上是一種資源的浪費和重復工作。
為了解決這個問題,本文提出了一種能集合多種芯片的軟硬件平臺,使得新型芯片不用再去單獨開發(fā)驅動,只要連接該平臺將其作為一個中轉器,就能實現(xiàn)一些主流的功能,比如SD卡的讀寫,USB串口的利用等等。本文的主要工作是在研究SD卡協(xié)議的基礎上,基于該平臺利用SPI接口實現(xiàn)對SD卡的支持。
一、 硬件設計
(一)SD卡電氣特性。SD卡主要包括,9針的電氣接口,8個寄存器,一個SD卡控制芯片和儲存介質。一般標準SD卡容量最高為2G,高速卡的容量一般為2G到32G。 SD工作電壓一般為2.6V-3.3V。 普通模式下時鐘頻率的范圍為0-25MHz,最高的傳輸速率為12.5MB/sec(四數(shù)據(jù)線傳輸模式),高速模式下時鐘頻率范圍為0-50MHz,最高的傳輸速率為25MB/sec。
SD卡有兩個可選的通訊協(xié)議:SD模式和SPI模式。SD模式是SD卡標準的讀寫方式,很多常用單片機沒有集成SD卡控制器接口,同時在SD卡數(shù)據(jù)讀寫時間要求不是很嚴格的情況下,選用SPI模式可以說是一種最佳的解決方案。因為在SPI模式下,通過四條線就可以完成所有的數(shù)據(jù)交換,并且目前常用的單片機都集成有現(xiàn)成的SPI接口電路,雖然采用SPI模式速度沒有優(yōu)勢,但對SD卡進行讀寫操作可大大簡化硬件電路的設計。
(二)SD卡通信模式。本文基于SD卡的SPI通信模式,因此所有的電路設計都是圍繞該協(xié)議進行設計。物理層的SPI是指高速同步串行口。是一種標準的四線同步雙向串行總線。它具有高速的,全雙工,同步的通信的特點,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管
腳,同時為PCB的布局上節(jié)省空間,提供方便。這種模式通常需要至少4根線,事實上3根也可以,它們是SDI(數(shù)據(jù)輸入),SDO(數(shù)據(jù)輸出),SCLK(時鐘),CS(片選)。
(三)嵌入式系統(tǒng)MCU。在嵌入式硬件設計中,一旦確定了系統(tǒng)功能,首先要做的就是主控芯片的選型。在考慮到滿足性能,價格和功耗的基礎上,同時結合本文的研究對象,所以所選芯片應具備SPI模塊的MCU,二是所選MCU要具有較快的運算速度。因此這里初步選用核心芯片為STM32。
二、系統(tǒng)設計
本文研究初衷是使各種芯片通過該平臺直接對SD卡進行操作,具體方式是通過在上位機編寫程序,通過下載直接將SD驅動下載到該應用平臺中,此后不同的單片機只需通過連接該平臺就可以實現(xiàn)SD卡的讀寫操作。設計原理以及目的如圖3所示。
圖3 系統(tǒng)原理
對于SD卡的操作主要是應用到平臺的底層接口庫——interface庫,該庫定義了底層的大部分操作,該庫調定義了很多結構,比如GPIO,SPI,IIC等,用戶在編寫應用或是驅動時,可以直接調用。
如:
struct interface_spi_t
{
RESULT (*init)(uint8_t index);
RESULT (*fini)(uint8_t index);
RESULT (*config)(uint8_t index, uint16_t kHz, uint8_t cpol, uint8_t cpha,
uint8_t first_bit);
RESULT (*io)(uint8_t index, uint8_t *out, uint8_t *in, uint16_t bytelen);
};
以上為SPI的結構示例,第一行是初始化;第二行是完成;第三行是設置參數(shù)分別是端口號,SPI速率,CPOL,CPHA,從高位開始還是低位開始;第四行是輸入輸出設置,參數(shù)分別為端口號,輸出引腳,輸入引腳,數(shù)據(jù)長度)
在調用接口庫時要先調用DAL層和MAL層,DAL層是驅動抽象層,因此所有的驅動都要先在該層編寫。MAL層是儲存器抽象層,所以例如SD卡,TF卡,DataFlash等,都需要調用該層。通過調用該層實現(xiàn)SD卡與MCU的掛載和通信。
配置好MAL層與SPI接口后。可以正式開始對SD卡的操作。第一步是對SD卡進行初始化。由于SD卡具有多樣性,因為版本不同會有操作上的差異,同時因為有SD,MMC,SDHC等一系列卡,如果操作不當,不僅得不到想要的數(shù)據(jù)回復,很可能會因電壓不適用導致卡不能工作。所以在做SD卡的初始化時,需要同時針對不同類型的卡做必要的判斷,根據(jù)不同卡的類型再做初始化操作。
在發(fā)送CMD0初始化SD卡時,一定要先對SD卡上電74個時鐘,這個部分很重要。它的原理可以是因為SD卡的工作電壓是2.7V-3.3V,但并不是SD卡接通電源就能有3.3V的電壓,在發(fā)送命令之前SD卡一直處于不工作狀態(tài)電壓低于2.7V,所以74個時鐘周期的上電,才能保持SD卡能達到其要求的工作電壓。
三、 測試結果與分析
通過利用帶有SD插槽的測試板與平臺相連接,通過邏輯分析儀展示的波形圖,可以將器件連接到上位機后逐步按流程測試SD初始化和讀寫步驟。實驗硬件連接如圖1。
圖1 測試硬件連接圖
命令CMD0測試
按照流程,首先應該對發(fā)送CMD0命令做測試,正確的應答應該為1.VC中的數(shù)據(jù)回復波形圖如圖4.4
圖2 CMD0數(shù)據(jù)波形圖
在圖2中,第一行為使能,可以看到已經(jīng)拉低,第二行為時鐘,第三行為MOSI,可以看到發(fā)給SD卡的CMD為0x40,argument為0,CRC為0x95,后面的高電平為一個字節(jié)的dummy values.第四行為得到的回復,忽略第一個字節(jié)后讀出數(shù)據(jù)為0001.正確應答。
命令CMD8測試
得到CMD0正確應答后,要檢測電壓兼容性來判斷是V1還是V2版本,應此發(fā)送CMD8.VC中返回數(shù)據(jù)如圖3,波形圖如圖8.
圖3 CMD8數(shù)據(jù)返回值
可以看到程序執(zhí)行語句所停處可以看出判斷該卡位SD的V2版本卡。其中resp_r1為發(fā)送CMD8的應答,可以看到為正確的應答1,同時發(fā)送CMD8后從數(shù)組resp_r3to7的16位數(shù)據(jù)也為正確應答0x01AA。因此可以得出結論,該卡為SD第二版本卡,同時使用現(xiàn)在的電壓范圍。
由圖4波形圖可以看出,MOSI的發(fā)送命令為0x48, argument為0,CRC為0x87,由MISO的波形可以看出,得到正確的回復1.
圖4 CMD8數(shù)據(jù)波形圖
命令ACMD41測試
再判斷為V2版本的SD卡后,要發(fā)送ACMD41命令來確定現(xiàn)在電壓范圍。在發(fā)送ACMD41之前發(fā)先發(fā)送CMD55.發(fā)送CMD55的波形圖如圖5.
圖5 CMD55數(shù)據(jù)波形圖
由該波形圖可以看出,MISO得到的數(shù)據(jù)為1,應答時正確的。此后的ACMD41的應答應該為0。
經(jīng)過測試和分析已經(jīng)可以通過該平臺實現(xiàn)SD卡的初始化和讀寫功能。但因為實驗環(huán)境的限制,該平臺目前之支持幾種MCU。但按目前的測試結果,該平臺應當可以用于現(xiàn)有的大部分的MCU。
四、結束語
本文提出的新型的利用USB轉接線的SD卡的設計可以很好的解決嵌入式設備在多種MCU環(huán)境中的數(shù)據(jù)存儲問題,極大的簡化了開發(fā)的成本,提高了工作效率。本文提出的該方法可以做為需要大容量存儲的嵌入式開發(fā)環(huán)境提供有價值的參考。
參考文獻:
[1]SD Group and SD Card Association. SD Specifications-Physical Layer Simplified Specification(Version 2.00)[M],2006.
[2]程克非.嵌入式系統(tǒng)設計[M].北京,機械工業(yè)出版, 2010.
[3]陳衛(wèi)東.嵌入式系統(tǒng)中的數(shù)據(jù)存儲與交換[M]. 北京:北京郵電大學,2005.