單片機CF卡接口設(shè)計
這套系統(tǒng)除了包括單片機和CF卡這兩個必不可少的元件以外,另外還包括一個LCD液晶顯示屏,其功能主要是用于顯示程序執(zhí)行中各種參數(shù)的狀態(tài)(如串口是否能正常工作)。液晶顯示屏是一個很好的硬件調(diào)試監(jiān)視器,尤其是在沒有仿真器的條件下,它可以方便地設(shè)立程序斷點,監(jiān)視程序的執(zhí)行,實時顯示各個狀態(tài)參數(shù)。
為了更有效地測試CF卡的海量存儲功能,系統(tǒng)中還設(shè)置了一個RS-232接口,以便與PC機之間進(jìn)行通信。另外,考慮到在線調(diào)試CF卡驅(qū)動程序的時候需要多次燒寫單片機的程序存儲器,特別又設(shè)置了一個ISP下載線接口。這樣一來,不用仿真器和燒寫器而僅使用ISP并口下載線就可以對整個系統(tǒng)進(jìn)行在線調(diào)試,大大方便了驅(qū)動程序的開發(fā)與調(diào)試。
軟件設(shè)計
嚴(yán)格遵循ATA標(biāo)準(zhǔn)的CF卡設(shè)備對軟件的編制有非常標(biāo)準(zhǔn)化的方法,而且基于CFA的協(xié)議,CF卡硬件上的向下兼容性也保證了軟件設(shè)計上的兼容性。CF卡工作在內(nèi)存映射下的讀寫程序邏輯框圖如圖3所示。值得指出的是,不同于一般的Flash存儲器,CF卡采用IDE標(biāo)準(zhǔn)的讀寫方式,它的尋址方式、讀寫方式,甚至命令都與普通的ATA硬盤相符合。也就是說,CF是在模擬硬盤的讀寫,按照扇區(qū)、磁道、柱面來尋址。同硬盤一樣,CF卡不能夠?qū)ξ徊僮?,它的一次性吞吐量為一個扇區(qū),也就是512個字節(jié)。CF卡在設(shè)計之初,之所以要采取類似硬盤的讀寫方式,是因為這種方法的存儲速度快、可靠,并能節(jié)省資源。本設(shè)計并不需要在CF上面建立文件系統(tǒng),這樣可以充分利用CF卡存儲量大、速度快的特點,同時也可使軟件的編制更為簡化。
圖3 讀寫CF卡程序的邏輯框圖
實驗步驟與結(jié)果
測試讀寫CF卡是否成功的方法是:先用串口調(diào)試助手把PC機上的一個ASCII文件通過串口發(fā)送到CF卡的特定扇區(qū),然后將剛剛寫入的數(shù)據(jù)讀出,并通過串口發(fā)送到PC機的串口調(diào)試助手的終端上。如果發(fā)送與接收到的文件數(shù)據(jù)是一致的,那么就說明對CF卡的讀寫操作成功。
首先要測試串口是否能正常工作,因為只有在串口正常工作的前提下,才能對CF卡的讀寫功能程序進(jìn)行測試。先將一個簡單的串口調(diào)試程序用ISP下載線下載到單片機上運行,通過串口調(diào)試助手的終端顯示測試結(jié)果,確定串口調(diào)試助手發(fā)送到單片機上的數(shù)據(jù)能夠被正確返回。
在確定串口在電氣特性上沒有問題了之后,就可以通過ISP接口,將事先編好的CF卡讀寫測試程序下載到單片機上運行。在PC機上選擇一個約4M大小的 ASCII碼文件,預(yù)計它將充滿CF卡的8000個扇區(qū),將其通過串口調(diào)試助手發(fā)送到單片機上。在單片機上運行的這個小程序是一個伺服進(jìn)程,它一直在檢測是否有數(shù)據(jù)通過串口傳過來。一旦有數(shù)據(jù)過來,它就會調(diào)用中斷,將接收到的數(shù)據(jù)存入CF卡相鄰的扇區(qū)內(nèi)。這樣就完成了對CF卡的寫操作。寫操作之后可以立即對同一地址進(jìn)行讀操作,這也正是CF卡的讀寫機制與其它普通Flash存儲器不同的地方,單片機從先前存入扇區(qū)的首地址開始,讀出剛剛寫入的數(shù)據(jù),并將其送出到串口,發(fā)送到PC機的串口調(diào)試助手終端上。經(jīng)過驗證,原先發(fā)送的數(shù)據(jù)和反饋回來的內(nèi)容一致,由此判定, CF卡程序編寫正確。
CF 卡讀寫設(shè)計的難點主要在于對扇區(qū)的訪問,由于CF卡由ATA控制器和Flash存儲器兩部分構(gòu)成,系統(tǒng)訪問Flash存儲器的速度遠(yuǎn)遠(yuǎn)小于訪問內(nèi)存的速度,如果系統(tǒng)頻繁訪問CF卡,勢必會影響系統(tǒng)的實時性和工作效率,所以必須考慮CF卡讀寫程序的設(shè)計技巧。根據(jù)存儲器訪問的局部性原理,CPU存取數(shù)據(jù)所訪問的存儲單元都趨向于聚集在一個較小的連續(xù)區(qū)域。從時間上看,如果一個信息項正在被訪問,那么在近期它很可能還會被再次訪問。從空間上看,在最近將用到的信息很可能與目前正在使用的信息在空間地址上是臨近的。在本系統(tǒng)的程序設(shè)計中,開辟了一個扇區(qū)的內(nèi)存空間TempSect,用于存儲最近訪問過的扇區(qū)數(shù)據(jù)。另外還設(shè)置了兩個全局變量SaveSectorNum和SectorDirty:SaveSectorNum保存最近備份的扇區(qū)編號; SectorDirty說明備份數(shù)據(jù)是否與CF卡中的相應(yīng)數(shù)據(jù)一致,如果一致,其值為0,否則為1。這樣不但可以減少讀寫CF卡的次數(shù),而且提高了訪問速度,滿足嵌入式操作系統(tǒng)的實時性要求。
結(jié)語
本文對單片機直接讀寫CF卡進(jìn)行了介紹,重點闡述了軟硬件的實現(xiàn)思路、測試方法以及一些針對CF卡的編程思想。隨著嵌入式處理器在通信、航空航天、醫(yī)療設(shè)備、消費類電子產(chǎn)品等領(lǐng)域的蓬勃發(fā)展,基于CF卡的嵌入式數(shù)據(jù)存儲系統(tǒng)的應(yīng)用前景一定會十分廣闊。
評論