單片機CF卡接口設計
這套系統除了包括單片機和CF卡這兩個必不可少的元件以外,另外還包括一個LCD液晶顯示屏,其功能主要是用于顯示程序執行中各種參數的狀態(如串口是否能正常工作)。液晶顯示屏是一個很好的硬件調試監視器,尤其是在沒有仿真器的條件下,它可以方便地設立程序斷點,監視程序的執行,實時顯示各個狀態參數。
為了更有效地測試CF卡的海量存儲功能,系統中還設置了一個RS-232接口,以便與PC機之間進行通信。另外,考慮到在線調試CF卡驅動程序的時候需要多次燒寫單片機的程序存儲器,特別又設置了一個ISP下載線接口。這樣一來,不用仿真器和燒寫器而僅使用ISP并口下載線就可以對整個系統進行在線調試,大大方便了驅動程序的開發與調試。
軟件設計
嚴格遵循ATA標準的CF卡設備對軟件的編制有非常標準化的方法,而且基于CFA的協議,CF卡硬件上的向下兼容性也保證了軟件設計上的兼容性。CF卡工作在內存映射下的讀寫程序邏輯框圖如圖3所示。值得指出的是,不同于一般的Flash存儲器,CF卡采用IDE標準的讀寫方式,它的尋址方式、讀寫方式,甚至命令都與普通的ATA硬盤相符合。也就是說,CF是在模擬硬盤的讀寫,按照扇區、磁道、柱面來尋址。同硬盤一樣,CF卡不能夠對位操作,它的一次性吞吐量為一個扇區,也就是512個字節。CF卡在設計之初,之所以要采取類似硬盤的讀寫方式,是因為這種方法的存儲速度快、可靠,并能節省資源。本設計并不需要在CF上面建立文件系統,這樣可以充分利用CF卡存儲量大、速度快的特點,同時也可使軟件的編制更為簡化。

圖3 讀寫CF卡程序的邏輯框圖
實驗步驟與結果
測試讀寫CF卡是否成功的方法是:先用串口調試助手把PC機上的一個ASCII文件通過串口發送到CF卡的特定扇區,然后將剛剛寫入的數據讀出,并通過串口發送到PC機的串口調試助手的終端上。如果發送與接收到的文件數據是一致的,那么就說明對CF卡的讀寫操作成功。
首先要測試串口是否能正常工作,因為只有在串口正常工作的前提下,才能對CF卡的讀寫功能程序進行測試。先將一個簡單的串口調試程序用ISP下載線下載到單片機上運行,通過串口調試助手的終端顯示測試結果,確定串口調試助手發送到單片機上的數據能夠被正確返回。
在確定串口在電氣特性上沒有問題了之后,就可以通過ISP接口,將事先編好的CF卡讀寫測試程序下載到單片機上運行。在PC機上選擇一個約4M大小的 ASCII碼文件,預計它將充滿CF卡的8000個扇區,將其通過串口調試助手發送到單片機上。在單片機上運行的這個小程序是一個伺服進程,它一直在檢測是否有數據通過串口傳過來。一旦有數據過來,它就會調用中斷,將接收到的數據存入CF卡相鄰的扇區內。這樣就完成了對CF卡的寫操作。寫操作之后可以立即對同一地址進行讀操作,這也正是CF卡的讀寫機制與其它普通Flash存儲器不同的地方,單片機從先前存入扇區的首地址開始,讀出剛剛寫入的數據,并將其送出到串口,發送到PC機的串口調試助手終端上。經過驗證,原先發送的數據和反饋回來的內容一致,由此判定, CF卡程序編寫正確。
CF 卡讀寫設計的難點主要在于對扇區的訪問,由于CF卡由ATA控制器和Flash存儲器兩部分構成,系統訪問Flash存儲器的速度遠遠小于訪問內存的速度,如果系統頻繁訪問CF卡,勢必會影響系統的實時性和工作效率,所以必須考慮CF卡讀寫程序的設計技巧。根據存儲器訪問的局部性原理,CPU存取數據所訪問的存儲單元都趨向于聚集在一個較小的連續區域。從時間上看,如果一個信息項正在被訪問,那么在近期它很可能還會被再次訪問。從空間上看,在最近將用到的信息很可能與目前正在使用的信息在空間地址上是臨近的。在本系統的程序設計中,開辟了一個扇區的內存空間TempSect,用于存儲最近訪問過的扇區數據。另外還設置了兩個全局變量SaveSectorNum和SectorDirty:SaveSectorNum保存最近備份的扇區編號; SectorDirty說明備份數據是否與CF卡中的相應數據一致,如果一致,其值為0,否則為1。這樣不但可以減少讀寫CF卡的次數,而且提高了訪問速度,滿足嵌入式操作系統的實時性要求。
結語
本文對單片機直接讀寫CF卡進行了介紹,重點闡述了軟硬件的實現思路、測試方法以及一些針對CF卡的編程思想。隨著嵌入式處理器在通信、航空航天、醫療設備、消費類電子產品等領域的蓬勃發展,基于CF卡的嵌入式數據存儲系統的應用前景一定會十分廣闊。
評論