摘要:基于HCSl2X單片機SPI模塊讀取Micro SD卡與SD卡,并解析SD卡上FAT文件系統(tǒng)以實現(xiàn)文件的讀取與寫入。測試證明,系統(tǒng)對FAT文件系統(tǒng)的讀取穩(wěn)定,誤差小,速度較快。使用HCSl2X類單片機對SD卡進行讀取,在汽車智能設計和單片機調試方面有較高的應用價值。
關鍵詞:HCSl2X單片機;SPI模塊;SD卡;Micro SD卡;FAT文件系統(tǒng)
隨著信息技術的飛速發(fā)展,高容量存儲芯片日益向大容量小體積發(fā)展,其中以SD卡、Micro SD卡為突出代表。SD卡由日本松下、東芝及美國SanDisk公司于1999年8月共同開發(fā)研制。大小猶如一張郵票的SD卡,重量只有2 g,卻擁有高記憶容量、快速數(shù)據(jù)傳輸率、極大的移動靈
活性以及很好的安全性。通過單片機處理SD卡信息,可以將信息化嵌入式產業(yè)向更小體積發(fā)展。考慮到穩(wěn)定性與讀取速度,研究中采用了Freescale公司的16位單片機MC9S12XSl28MAA。為了進一步滿足嵌入式研究的實時調試與應用需要,把SD卡的讀取以及FATl6文件系統(tǒng)的讀取寫入移植到此單片機中,使開發(fā)應用有更好的擴展性。本文首次把FATl6文件系統(tǒng)的讀取移植到HCSl2X單片機上,并通過HCSl2X單片機的SPI模塊進行SD卡的讀寫,取得了良好的效果。
1 研究平臺和設計思想
1.1 平臺介紹
①MCS9S12XSl28MAA:Freescale公司16位單片機HCSl2X家族中的一員,相比于其他HCSl2X單片機,去除了XGATE協(xié)處理器,大大降低了成本。此單片機內嵌了許多資源,包括128KB Flash、4 KB EEPROM、16 KBROM以及多種通信接口。
②Micro SD卡:采用SD架構設計而成,尺寸幾乎只有一片指甲蓋大小,由摩托羅拉公司與SanDisk公司共同研發(fā),是一種超小型卡(11 mm×15 mm×1 ram),約為SD卡的1/4。它支持3種傳輸模式,SPI模式(獨立序列輸入和序列輸出),1位SD模式(獨立指令和數(shù)據(jù)通道,獨有的
傳輸格式),以及4位SD模式(使用額外的引腳以及某些重新設置的引腳,支持4位寬的并行傳輸)。
③CodeWarrior:Freescale公司開發(fā)的編程環(huán)境。本文使用的CodeWarrior Special 5.0 For S12(X)是專門針對HCSl2X單片機開發(fā)的,可以進行程序的編輯、編譯、鏈接和在線調試等多項功能,支持在C語言中嵌入?yún)R編語言。
④移植條件:對于本文中的SD卡讀取與寫入,用戶的單片機推薦使用HCSl2X系列,也可使用HCSl2系列,但總線超頻會不穩(wěn)定,從而影響SD卡讀寫速率以及穩(wěn)定性。
1.2 設計思想
圖1顯示了本文中所使用的SD卡FAT文件系統(tǒng)通過MC9S12XSl28MAA進行解析的軟硬件結構體系。編譯鏈接軟件使用CodeWarrior 5.O,硬件采用MC9S12XSl28MAA單片機與Kingston公司的Micro SD卡。代碼由4部分組成:用戶應用部分(由用戶編寫控制,本文使用MC9S12XS128MAA SCI串口模塊進行信息調試),F(xiàn)AT文件系統(tǒng)讀取解析部分,硬件控制部分(通過單片機SPI模塊與SD卡連接),以及單片機CPU的初始化部分。其中,SPI模塊與SD卡連接的硬件控制部分,以及FAT文件系統(tǒng)的讀取解析部分是本文的重點。
其中,Sd_SPI.h是關于SD卡讀取寫入部分的一些宏定義、常量和函數(shù)的聲明;Sd_SPI.c包括了通過SPI模塊讀寫SD卡的代碼;Fat.h是關于Fat文件系統(tǒng)解析的全局變量、宏定義以及函數(shù)聲明;Fat.c包括了Fat文件系統(tǒng)解析的代碼;SimpleFat.c是簡易讀取Fat文件系統(tǒng)信息的代碼;SimpleFat.h是其全局變量以及函數(shù)的聲明。
2 硬件設計
SD卡有2種操作模式:SD卡模式、SPI模式。SD卡模式允許通過4線高速總線傳輸,但由于大部分單片機無此接口模塊,故選擇SPI模式。HCSl2X系列單片機內部都帶有此同步串行外部設備接口(Serial Peripheral Interface,SPI)。單片機可以通過SPI系統(tǒng)組成一個通信速率比SCI高的同步網絡,故使用SPI模式可以把外設減少到最低。SPI模式相對于SD卡模式的缺點是損失了傳輸速度;但是目前的微處理器的處理速度越來越高,利用SPI模式大都能滿足工程需要。
HCSl2X單片機的全雙工8位SPI模塊有4個引腳,分別為主入從出引腳MISO、主入從出引腳MOSI、串行時鐘引腳SCK以及從機片選引腳SS。當CS信號線為低電平時,主機開始所有的總線傳輸。數(shù)據(jù)從單片機的MOSI引腳同步輸入Micro SD卡的DA引腳,Micro SD卡返回數(shù)據(jù)由DO線同步輸入單片機的MISO引腳,數(shù)據(jù)在CLK信號的上升沿同步輸入和輸出。
3 軟件設計
3.1 HCSl2X總線時鐘超頻
MC9S12XSl28MAA默認總線時鐘默認同外接晶振相關,但可以通過配置PLL鎖相環(huán)實現(xiàn)單片機總線超頻,從而加快SD卡讀取速率。實驗中可通過下列代碼將單片機總線頻率超頻到80MHz:
3.2 HCSl2XSPl模塊初始化
MC9S12XSl28MAA單片機包含2個串行外設接口SPI,可以很方便地實現(xiàn)對Micro SD卡接口的數(shù)據(jù)傳輸。為了配置時鐘和數(shù)據(jù)長度,需要對SPI控制寄存器(SPCRl和SPICR2)、SPI波特率寄存器SPIBR和SPI數(shù)據(jù)寄存器SPIDR進行設置:使能SPI模塊,將SPICRl中的MSTR位置1使單片機工作在主機模式,產生串行時鐘來同步主從雙方的移位寄存器,配置SPI時鐘極性位與SPI時鐘相位控制位,使能從機輸出選擇;初始化SPI波特率寄存器。
3.3 SD卡初始化
SD卡初始數(shù)據(jù)傳輸需工作在低于400 kb/s的頻率,因此配置SPI波特率寄存器,以工作在低速模式下。片選信號后應延時至少74個時鐘周期。SD卡默認缺省使用SD總線傳輸協(xié)議,主機需要發(fā)出命令CMDO(CMD_GO_IDLE_STATE)才能使SD卡工作在SPI傳輸模式下,當單片機返回0x 01時說明已經進入了IDLE狀態(tài)。此時應循環(huán)發(fā)送CMD55+ACMD41以確認是否為SD卡,如果回應超時則發(fā)送CMDl(CMD_SEND_OP_COND)以確認是否為MMC卡。經實驗發(fā)現(xiàn),Kingston公司的Micro SD卡使用CMD55+ACMD41或者CMDl都可以進行激活。激活SD卡的SPI模式后SD卡進入準備狀態(tài),此時發(fā)送CMDl6(CMD_SET_BLOCKLEN)設置SD卡的讀寫塊大小,然后重新配置SPI波特率寄存器SPIBR使單片機SPI工作在高速頻率下,延時8個時鐘周期后返回,完成SD卡初始化。圖2為SD卡SPI高速模式初始化流程。
3.4讀寫單塊數(shù)據(jù)
SD卡單塊數(shù)據(jù)的讀取是先通過單片機發(fā)送CMDl7(CMD_READ_SINGLE_BLOCK)命令,以SD卡指定數(shù)據(jù)塊起始位地址作為參數(shù),如果讀取成功SD卡會返回1個R1命令作為響應。然后發(fā)送1個起始數(shù)據(jù)命令,接著發(fā)送單塊字節(jié)數(shù)量的數(shù)據(jù)并接收SPI數(shù)據(jù)寄存器SPIDR中的數(shù)據(jù),最后是2字節(jié)CRC校驗。
SD卡單塊數(shù)據(jù)的寫入與讀取相似,通過單片機發(fā)送CMD24(CMD_WRITE_SINGLE_BLOCK)命令,以SD卡指定數(shù)據(jù)塊起始位地址作為參數(shù),如果讀取成功SD卡會返回1個R1命令作為響應。然后發(fā)送1個起始數(shù)據(jù)命令,接著發(fā)送單塊字節(jié)數(shù)量的需寫入數(shù)據(jù),最后是2字節(jié)CRC校驗。
3.5 FAT文件系統(tǒng)信息讀取
為了SD卡文件數(shù)據(jù)管理方便并且與PC機之間兼容得更好,同時考慮到SD卡自身容量的限制,選擇FATl6文件系統(tǒng)對SD卡信息進行管理。
為了方便管理和擴展性開發(fā),對SD卡進行了分區(qū)。模擬硬盤模式創(chuàng)建出了MBR區(qū)(主引導扇區(qū))與DBR區(qū)(操作系統(tǒng)引導記錄區(qū)),在向下兼容的同時實現(xiàn)了對分區(qū)過的SD卡FAT文件系統(tǒng)的讀寫。
SD卡數(shù)據(jù)可分為5部分:MBR區(qū)、DBR區(qū)、FAT區(qū)、DIR區(qū)和DATA區(qū)。MBR區(qū)是主引導區(qū),位于整個SD卡的第1單塊上。在總共512字節(jié)的主引導扇區(qū)中,MBR只占用了其中的446個字節(jié),另外的64個字節(jié)是DPT(Disk Partition Table,分區(qū)表),最后2個字節(jié)“55 AA”是分區(qū)的結束標志。這整體構成了SD卡的主引導扇區(qū)。DBR是操作系統(tǒng)引導記錄區(qū),是操作系統(tǒng)可以直接訪問的第1個扇區(qū),它包括1個引導程序和1個被稱為BPB(Bios Parameter Block)的本分區(qū)參數(shù)記錄表。BPB參數(shù)塊記錄著本分區(qū)的起始扇區(qū)、結束扇區(qū)、文件存儲格式、硬盤介質描述符、根目錄大小、FAT、個數(shù),分配單元的大小等重要參數(shù)。
FAT文件系統(tǒng)的分區(qū)有如下幾個部分:保留區(qū),存放FAT文件系統(tǒng)的重要參數(shù)和引導程序;FAT表,記錄簇使用情況;根目錄區(qū),記錄根目錄信息。
本文中單片機對FAT系統(tǒng)的讀寫利用的是MBR區(qū)上的DPT分區(qū)表信息,用于找到FAT分區(qū)。然后通過FAT分區(qū)的DBR區(qū)上的BPB分區(qū)參數(shù)記錄表信息找到根目錄,讀取根目錄信息并通過FAT表中的文件簇信息實現(xiàn)文件的管理。
研究中為方便代碼的移植和優(yōu)化,在FAT初始化的時候將讀寫扇區(qū)函數(shù)指針指向Micro SD卡的讀寫函數(shù),并使用了2個結構體來存儲SD卡的MBR與DBR信息。但鑒于單片機自身的內存容量,又建立了1個SimpleFat.c程序文件,只存儲程序所需的幾個地址常量:StartMbrAddress(MBR起始地址)、StartDbrAddress(DBR起始地址)、StartFatlAddress(FATl表起始地址)以及SeePerClu(簇扇區(qū)數(shù)量),大大減小了單片機內存的開銷。
3.6 應用層函數(shù)接口
FAT文件系統(tǒng)向應用層設計了如下幾個初級程序接口:Get Filelnfo(UINT8*F Info,F(xiàn)ileInfo*TempFilelnfo)(獲取文件信息),OutPut _RootFileinfo(void)(輸出根目錄文件信息),DirOr(UINT8 FileAttrib)(判斷目錄),Get Next Cluster(UINTl6 TempCluster)(獲取下一文件簇信息),OutPutFileCluster(UINTl6 TempStart Cluster)(輸出文件簇地址),OutPutFile(UINTl6 Temp StartCluster)(輸出文件內容),ShowClusterContent(UINTl6 TempCluster)(輸出簇內容)。通過這些初級程序接口實現(xiàn)了OpenDir(UINTl6 TempStartCluster)(目錄打開),F(xiàn)ileDelete(文件刪除),F(xiàn)ileDataRead(文件數(shù)據(jù)讀取),F(xiàn)ileCreate(UINTl6 TempStartCluster,UINT32TempFileLength)(文件創(chuàng)建)等功能。
3.6.1 目錄讀取及文件信息獲取
FAT文件系統(tǒng)的具體文件和目錄項都是通過讀取ROOT目錄來進行查找的,所以FAT的文件排布是以樹形的結構排布。對于FAT來說,目錄項與文件項在同一目錄中是同樣占32個字節(jié)的屬性項。研究中使用了1個數(shù)據(jù)結構Filelnfo來存儲文件信息,并通過if(Temp_F_Info[0x0b]&0x l0)來分辨文件與目錄。
在FAT文件系統(tǒng)中,文件是以簇的形式保存在SD卡中的,簇的排布是不連續(xù)的,1個文件如果大于1個簇的話,則要通過FAT表來查找該文件所有簇所在的位置,從而找到整個文件。目錄一般只占有1個簇的大小,在FAT表中等同于小于1個簇的小文件,值顯示為FF。
目錄是以文件的形式存儲在父目錄中的,目錄中的文件信息記錄了該文件的起始簇以及文件的大小,知道了文件的起始簇,通過FAT表中的信息可以很方便地找到文件的下一個簇的位置,并由文件的大小判斷出文件的結束位置。
3.6.2 文件的讀寫
在FAT文件系統(tǒng)中,讀取文件只需要知道該文件的起始簇以及大小便可以很方便地得到整個文件的信息。讀取步驟是:獲取根目錄信息,通過根目錄信息找到下一層目錄所在簇位置,通過下一層目錄信息遞歸找到文件所在目錄,讀取文件信息屬性,得到文件的起始簇位置和文件大小,通過FAT表遞歸查找到文件的全部簇地址,最終以FF結尾;根據(jù)文件大小判斷文件的結束位置,最后輸出整個文件。
文件的創(chuàng)建和寫入則是通過FAT表查找未被使用的空簇(值為00),寫滿1簇之后再查找下一未被使用的空簇,并同時更新FAT1表和FAT2表。然后在文件所被創(chuàng)建的目錄信息中添加文件信息,最終實現(xiàn)文件的創(chuàng)建。
3.6.3 文件的刪除
在FAT文件系統(tǒng)中,對文件的刪除不需要把整個文件信息全部清除,只需要清除FAT表中的文件簇信息以及目錄中的文件信息,避免了對SD卡的頻繁讀寫,同時也節(jié)省了時間。
結語
本設計將SD卡的存儲方式應用到單片機系統(tǒng)中,簡化了復雜的文件數(shù)據(jù)的存儲設計,減小了系統(tǒng)的尺寸,提高了系統(tǒng)的可靠性,使得單片機對文件的讀出和存取簡單易行。對FAT裁減實現(xiàn)了嵌入式文件系統(tǒng),提高了系統(tǒng)的存儲能力,同時也增強了單片機與PC級之間的通信能力,簡化了繁瑣的調試。采用Freescale 16位單片機MC9S12XSl28MAA的串行外設接口SPI對SD卡進行訪問,加快了整個系統(tǒng)的設計進度。實踐證明,該設計讀寫SD卡文件信息的速度以及穩(wěn)定性滿足調試要求。該設計只需對底層驅動進行簡單修改就可直接應用于MMC卡、Micro SD卡等其他存儲介質上。