MC9S12UF32的嵌入式文件系統(tǒng)數(shù)據(jù)存儲模塊
(2)MC9S12UF32與SD卡之間的數(shù)據(jù)傳輸
在完成對時鐘頻率和傳輸數(shù)據(jù)線寬度的配置之后,通過發(fā)送相應(yīng)的讀寫命令就可以實現(xiàn)單片機與SD卡之間的數(shù)據(jù)傳輸了。在單片機向SD卡寫入數(shù)據(jù)的過程中,編程者將需要寫入的數(shù)據(jù)寫入SDHC模塊的SDATA寄存器(16位)之后,該數(shù)據(jù)將被轉(zhuǎn)移至發(fā)送數(shù)據(jù)FIFO中。與此同時,只要發(fā)送數(shù)據(jù)FIFO非空,其中的數(shù)據(jù)就會不斷地通過數(shù)據(jù)線被寫入SD卡的相應(yīng)位置。在單片機從SD卡中讀取數(shù)據(jù)的過程中,SD卡中的數(shù)據(jù)將不斷發(fā)送至接收數(shù)據(jù)FIFO中。只要接收FIFO非空,單片機就可以不斷地通過讀SDATA寄存器得到接收數(shù)據(jù)FIFO中的數(shù)據(jù)。
2.2 DSl2887實時鐘模塊
DSl2887模塊使用數(shù)據(jù)/地址復(fù)用的并行異步總線,可以為單片機提供100年以內(nèi)的實時鐘信息(年/月/日/時/分/秒)。它內(nèi)部具有石英晶振和鋰電源,首次使用時,需要對該模塊內(nèi)部的寄存器進行相應(yīng)配置,激活晶振使其進入工作狀態(tài)。由于DSl2887內(nèi)部帶有鋰電源,所以一旦晶振被激活,即使外部掉電,該模塊依然可以保存并提供正確的實時鐘信息。
設(shè)定DSl2887的時間和從DSl2887中讀取時間信息的底層程序比較簡單,只需參照芯片手冊對寄存器進行合理配置。但是,需要特別注意的是,在寫時鐘和讀取時鐘之前需要鎖存時鐘信息相關(guān)的buffer,防止在讀寫過程中由于出現(xiàn)時鐘信息自動更新情況而導(dǎo)致的錯誤。系統(tǒng)中,在每次讀寫實時鐘之前,查詢DSl2887內(nèi)部控制寄存器A最高位UIP是否為O,以避免上述錯誤的產(chǎn)生。因為芯片手冊中給出,一旦UIP=O,那么在244μs內(nèi)實時鐘模塊都不會自動更新當(dāng)前的時鐘信息,而這段時間足以讓單片機完成讀寫實時鐘的過程。
3 FatFS文件系統(tǒng)的移植與配置
3.1 FatFS軟件包簡介
采用文件系統(tǒng),是為了在單片機能夠?qū)D卡進行數(shù)據(jù)讀寫的同時,保證其讀寫的數(shù)據(jù)能夠被大多數(shù)通用設(shè)備識別。換言之,數(shù)據(jù)在存儲器內(nèi)的組織型式,需要遵循一些已有的工業(yè)標(biāo)準(zhǔn)和規(guī)范。例如使用FAT文件系統(tǒng),數(shù)據(jù)存儲單元的SD卡取下來后,可以使用任何標(biāo)準(zhǔn)的讀卡器在windows、Linux等PC機上讀出。
當(dāng)前著名的嵌入式文件系統(tǒng)有若干種選擇,比如EFSL(Embedded Filesystem Library)、uC/FS、/TinyFatFS等。這之中EFSL和FatFs都是開放源碼的,具有十分詳盡的文檔和函數(shù)手冊,除錯更新也十分及時,在本文的設(shè)計中我們采用的是FatFS。
FatFS采用使用ANSI C編寫,具有很好的硬件平臺獨立性,使用者只需要對源程序進行簡單的修改和配置,就可以將其移植到各種系列的單片機上。此外,它的內(nèi)存開銷很小,ROM的占有量在十幾KB的量級,使用者可以根據(jù)不同的應(yīng)用方便的對代碼進行裁減。FatFS支持FATl2、FATl6和FAT32,可以建立獨立的緩沖區(qū)對多個文件進行讀寫。FatFs是一個不斷更新完善的軟件,大量的相關(guān)信息可以從原作者的主頁上得到(http://elm-chan.org/fsw/ff/00index_e.html),同時原作者也做了很多性能測試的工作。
3.2 FatFS的移植
可從FatFS的主頁上下載得到FatFS R0.07版本。FatFS的主程序包含5個文件,即diskio.c、diskio.h、ff.c、ff.h和integer.h。其中,diskio.c和diskio.h是與底層硬件I/O相關(guān)的函數(shù);ff.c和ff.h是應(yīng)用函數(shù),主要涉及FatFS的配置和裁減;而integer.h中定義了FatFS軟件所使用的各種數(shù)據(jù)類型。
移植FatFS的過程中基本不需要對diskio.h和ff.c進行修改。除了核實integer.h中的數(shù)據(jù)類型定義是否與MC9S12U32數(shù)據(jù)類型相符之外,移植的重點工作在于diskio.c中6個主要函數(shù)的實現(xiàn)和ff.h中對于文件系統(tǒng)的裁減配置。dikio.c包含的6個接口函數(shù):disk_initial-ize,disk status,disk ioctl,disk read,disk write和disk_fattime。它們分別實現(xiàn)存儲介質(zhì)的初始化、讀?。瘜懭肴舾蓚€扇區(qū)的數(shù)據(jù)和獲取實時鐘信息的功能。
評論