趙華峰
(渭南師范學院 物理與電氣工程學院,陜西 渭南 714099)
隨著電子技術的不斷發(fā)展,相應的電子設備也在不斷小型化,有著優(yōu)良的便攜性。以閃存為存儲體的非易失SD卡(Secure Digital Memory Card)因具有體積小、造價低、功耗較低、可擦寫以及良好的可靠性等特點而被廣泛應用于日常生活與工作中。近年來,隨著SD卡價格的不斷下降和存儲容量的不斷提高,使得其應用范圍更加廣泛。實現(xiàn)讀寫物理扇區(qū),記錄大容量數(shù)據(jù)時,SD卡作為存儲媒介是一個很好的選擇。其是一種基于半導體快閃記憶器的新一代記憶器件,由日本松下、東芝以及美國SanDisk公司在1999年8月共同開發(fā)研制[1]。它作為設計存儲介質進行讀寫,大小猶如一張郵票,具備高容量、快速數(shù)據(jù)傳輸率、便于攜帶以及較好的數(shù)據(jù)安全性等特點,已成為較為通用的數(shù)據(jù)存儲卡。
基于51單片機的SD卡讀寫系統(tǒng)整體結構包括電源電路、控制電路、中央處理器以及數(shù)據(jù)存儲模塊等。通過各部分的協(xié)調工作,完成SD卡的讀寫,以實現(xiàn)對數(shù)據(jù)讀寫的實時處理。為滿足正常的工作需求,單片機應具有輔助電路。其包括復位電路(可手動)、時鐘電路和串口通信電路等基本電路。
該系統(tǒng)硬件原理圖在Altium Designer軟件下繪制,具體如圖1所示。系統(tǒng)在開機后即可通過上位機(數(shù)據(jù)發(fā)送終端)接收并保存數(shù)據(jù),完成對SD卡的讀寫。系統(tǒng)硬件的構成包括主控制器、通信端口、存儲媒介以及電源設計4個部分。
主控制器使用STC89C52單片機最小系統(tǒng)實現(xiàn)軟件部分的功能。通信端口中串口通信是較為通用的設備通信協(xié)議。很多計算機可以利用自帶的RS-232串口實現(xiàn)上位機數(shù)據(jù)的發(fā)送與接收。存儲媒介為SD 1G閃存卡。目前,部分SD卡容量可達128 GB,且便攜性強,成為小型系統(tǒng)中存儲介質的首要之選。電源設計中單片機需要的電壓為5 V直流電源,在此采用USB取電。存儲介質模塊SD卡需要的工作電壓為3.3 V,接口需要一個電平轉換,如果不進行轉換則會燒毀SD卡。

圖1 系統(tǒng)硬件電路原理圖
控制模塊采用的STC89C52單片機是一種CMOS型的低功耗單片機,具有高速和強抗干擾的特點,有8 KB的可編程Flash,為5 V單片機。它的指令代碼完全兼容經(jīng)典的8051,同時也做了較多的改進,在功能上超越了8051,可以使用ISP下載功能直接下載程序。因此許多微型嵌入式應用系統(tǒng)都可以用STC89C52有效解決[2]。此外, 該單片機的標準功能還包括512字節(jié)RAM和32位I/O口線等,最高運作頻率為35 MHz,6T/12T可選[3]。此款單片機能夠保證滿足設計中的要求,能夠穩(wěn)定可靠的工作,并且是目前市場上最便宜的芯片,能夠控制開發(fā)成本。
SD卡讀寫系統(tǒng)需要串行通信接口輸入數(shù)據(jù),串口均按位發(fā)送和接收字節(jié)。串口的一端可以使用一條線發(fā)送數(shù)據(jù),另一端用一條線接收數(shù)據(jù)。與并行傳輸相比,它只使用兩條傳輸數(shù)據(jù)線,能夠實現(xiàn)較遠距離的通信,并且造價相對較低。目前,最為常用的串行通信總線接口標準為RS-232,由美國電子工業(yè)聯(lián)盟與bell公司一同開發(fā),其原本編號為EIA-RS-232,通常簡稱為RS232。RS232接口任何一條信號線的電壓均為負邏輯關系,即“-3~-15 V”是邏輯“1”,“+3~+15 V”是邏輯“0”。要求接收器同時能夠區(qū)分高于+3 V的信號作為邏輯“0”,也能區(qū)分低于-3 V的信號作為邏輯“1”。單片機TTL的電平為5 V作為邏輯正,0 V為邏輯負,與要求的TTL邏輯電平不相匹配,因此要設計一個轉換電路與TTL電路相連接,進行正常工作。MAX232是現(xiàn)在最為常用的轉換芯片。
SD記憶卡支持的數(shù)據(jù)傳輸總線方式有SPI模式和SD模式。其中,SPI模式使用4線制,進行數(shù)據(jù)通信時要用CLK、CS、DataOut以及DataIn;SD模式使用6線制,進行數(shù)據(jù)通信時要用CMD、CLK以及DAT0-DAT3。
在單片機對SD卡進行讀寫時通常應用SPI模式[4]。設計中使用STC89C52的工作電壓為5 V,而SD卡的供電電壓為3.3 V。為了系統(tǒng)運行的正常穩(wěn)定,必須解決單片機與SD卡之間的電平匹配問題。因此,在設計中采用整體模塊化的SD卡部分,電壓轉化模塊的AMS1117-3.3 V電壓轉化裝置便于SD卡的正常工作。
SD卡具有完備的整體模塊,在設計中使用彈出式SD卡座,可大大減少設計工作量。引腳用雙排針引出,方便與主機接線,并且同時兼容5 V與3.3 V兩種電平的主控器,適用性相對較廣,可以非常方便地被系統(tǒng)中的51單片機讀寫。
在設計SD卡讀寫系統(tǒng)的軟件程序時,采用模塊化結構,包括主程序、串口通信子程序、SPI讀寫子程序、SD卡復位初始化以及SD卡讀寫子程序等模塊。使用Keil 5軟件在C51語言環(huán)境下進行。
主程序需要完成系統(tǒng)的初始化,調用各個功能函數(shù),處理中斷標志位,以保證數(shù)據(jù)的正常傳輸。系統(tǒng)需要先設置串口,進入SPI模式。SD卡在進行復位初始化后開始傳輸數(shù)據(jù),能夠實時存儲上位機發(fā)送的數(shù)據(jù)。主程序流程如圖2所示。

圖2 主程序流程圖
只有在進行正常的初始化后才能對SD卡進行讀寫操作。SD卡上電后,要求控制機對SD卡發(fā)送延時,持續(xù)至少達到74個時鐘周期才能完成上電,隨后寫入復位命令CMD0和初始化CMD1。拉低片選信號為低電平狀態(tài),才能使得SD卡進入SPI模式[4]。不然SD卡會自動工作在SD總線模式,單片機不能讀寫SD卡。SD卡在進入SPI總線模式后做出應答,應答信號為01,表明SD卡進入到了SPI模式,此時主機能向SD卡發(fā)CMD1命令,然后讀應答信號。當收到應答信號為00,則表明SD卡完成復位初始化,準備接收下一條指令。需要說明的是,當主機向SD卡發(fā)CMD0命令的時候,SD卡還處于SD模式,每條命令必須帶有正確的CRC校驗位,當發(fā)CMD1命令字時,SD處在SPI模式,而SPI模式默認不要CRC校驗位,因此CRC校驗位寫入0即可[5]。
SPI總線支持單塊的讀操作,先向SD卡發(fā)CMD17命令,在當SD接收到相應的響應信號后,接收512個字節(jié)的數(shù)據(jù)并傳輸2個字節(jié)的CRC校驗碼,等待SD卡接收響應,當SD卡回應響應的標志時,說明SD卡能夠正確讀取數(shù)據(jù)。當SD卡的輸入接口變成為低電平,標志著正在讀SD卡,當SD卡的輸入接口變成為高電平,標志著讀取數(shù)據(jù)的操作已經(jīng)完成。
SD卡復位初始化成功后,單片機向SD卡發(fā)送寫入命令CMD24,然后接收SD卡響應。收到響應后,向SD卡發(fā)送一個數(shù)據(jù)啟動標志0xfe,然后發(fā)送512字節(jié)的數(shù)據(jù)并傳輸2個字節(jié)CRC校驗碼[6]。此時,SD卡數(shù)據(jù)模塊確認要使用1個應答命令,即為1個字節(jié)。當字節(jié)的低五位是00101時,說明SD卡扇區(qū)寫入的數(shù)據(jù)塊是完整正確的。若CMD24寫入命令在操作時被發(fā)送到SD卡,則接收SD卡超時,需繼續(xù)將該寫入命令發(fā)送至SD卡。
使用串口調試助手輸入上位機數(shù)據(jù)時,經(jīng)過單片機預先讀到數(shù)據(jù)緩沖區(qū),等達到一個扇區(qū)的數(shù)據(jù)后經(jīng)單片機將其寫入SD卡的指定扇區(qū)。數(shù)據(jù)的寫入順序應嚴格遵循上位機發(fā)送數(shù)據(jù)順序。通過使用WINHEX軟件查驗SD卡80扇區(qū),其數(shù)據(jù)與發(fā)送的數(shù)據(jù)保持一致說明讀寫系統(tǒng)成功,具體如圖3所示。實際通過指定的扇區(qū)就可以寫入數(shù)據(jù)。

圖3 使用WINHEX軟件對SD卡80扇區(qū)的數(shù)據(jù)查看
SD卡讀寫系統(tǒng)以STC89C52單片機為控制核心,能夠讀取SD卡中的數(shù)據(jù)并在SD卡扇區(qū)寫入數(shù)據(jù),還能夠傳輸大容量數(shù)據(jù)。為使SD卡電子系統(tǒng)的應用更加方便,可以針對實際的應用情況添加新的功能,使得整個系統(tǒng)更加完善。