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

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