徐健,陳永冰,劉勇,賈玉柱
(海軍工程大學(xué) 導(dǎo)航工程系,武漢430033)
艦船自動(dòng)舵參數(shù)采集傳輸系統(tǒng)設(shè)計(jì)中,大量的自動(dòng)舵參數(shù)數(shù)據(jù)都存儲(chǔ)在外部介質(zhì)SD卡中。為使存儲(chǔ)的采集數(shù)據(jù)可直接在PC機(jī)上讀取、處理,需要使用文件系統(tǒng)組織數(shù)據(jù)格式。文件系統(tǒng)是操作系統(tǒng)用于明確磁盤或分區(qū)上文件的方法和數(shù)據(jù)結(jié)構(gòu),是對(duì)文件的管理規(guī)則,也是操作系統(tǒng)的重要組成部分,而操作系統(tǒng)對(duì)處理器要求比較高,且占用一定的存儲(chǔ)空間,艦舵參數(shù)采集系統(tǒng)微處理器C8051F500沒有操作系統(tǒng),這就需要在SD卡上建立文件系統(tǒng)。而建立文件系統(tǒng)就需要實(shí)時(shí)時(shí)鐘來管理數(shù)據(jù)文件的創(chuàng)建、修改、訪問等詳細(xì)時(shí)間信息。
通常用的單片機(jī)沒有實(shí)時(shí)時(shí)鐘部件,如果需要此功能就得使用定時(shí)器來實(shí)現(xiàn),而一旦系統(tǒng)掉電時(shí)鐘就不能運(yùn)行,嵌入式文件系統(tǒng)就沒有了時(shí)鐘,這與設(shè)計(jì)要求不相符。高精度實(shí)時(shí)時(shí)鐘芯片DS3231不僅能夠在一定溫度范圍內(nèi)提供優(yōu)于2 min/年的計(jì)時(shí)精度[1],而且包含電池輸入端,斷開主電源仍然可以保持精確計(jì)時(shí)。因此,本文提出通過DS3231時(shí)鐘芯片連續(xù)不斷地給嵌入式文件系統(tǒng)提供實(shí)時(shí)時(shí)鐘的方案。
SD卡存儲(chǔ)系統(tǒng)結(jié)構(gòu)如圖1所示,C8051F500單片機(jī)是主控芯片,通過SPI接口與SD卡實(shí)現(xiàn)數(shù)據(jù)通信,采集的數(shù)據(jù)在FAT32文件系統(tǒng)管理下,以文件形式存儲(chǔ)于SD卡中,如.txt、.doc、.dat等。
目前常用的文件系統(tǒng)有兩類[2]:基于微軟 Windows操作系統(tǒng)的 FAT16、FAT32、NTFS、ex FAT文件系統(tǒng);Linux系統(tǒng)下的EXT2、EXT3、EXT4。Windows操作系統(tǒng)使用廣泛,且SD卡容量比較大,因此這里選用FAT32文件系統(tǒng)。
圖1 存儲(chǔ)系統(tǒng)框圖
FAT32文件系統(tǒng)的實(shí)現(xiàn)方法可以分為[3]:直接法,分析FAT32文件系統(tǒng)的組織結(jié)構(gòu),遵循文件生成機(jī)制,編寫程序代碼實(shí)現(xiàn)功能;移植法,移植FAT文件系統(tǒng)模塊,調(diào)用其提供的應(yīng)用接口函數(shù),同樣可以實(shí)現(xiàn)功能。
目前比較流行使用的FAT文件系統(tǒng)模塊主要有[4]:周立功公司的zlg/FS、Micrium 公司的 μC/FS、Source-Forge.net網(wǎng)站上發(fā)布的開源項(xiàng)目efsl,以及日本電子愛好者設(shè)計(jì)并維護(hù)的FATFS文件系統(tǒng)模塊。以上4個(gè)文件系統(tǒng)模塊各有特點(diǎn):zlg/FS因讀寫速率較慢,主要用于實(shí)驗(yàn)教學(xué);Micrium公司的μC/FS一般在商業(yè)上使用;efsl及FATFS都是免費(fèi)開源軟件,F(xiàn)ATFS相對(duì)成熟一些。
圖2 FATFS架構(gòu)圖
本文采用了移植FATFS Module方法,F(xiàn)ATFS Module專門為小型嵌入式系統(tǒng)而設(shè)計(jì),采用標(biāo)準(zhǔn)的C語言編程,具備良好的硬件平臺(tái)獨(dú)立性,移植到8051、AVR等單片機(jī)上,只需簡單修改。它還支持FAT 12、FAT 16和 FAT 32,以及多個(gè)存儲(chǔ)介質(zhì),可以對(duì)多個(gè)文件進(jìn)行讀/寫。FATFS整體框架如圖2所示。
頂層是應(yīng)用層,調(diào)用FATFS Module提供的一系列API函數(shù)(如:f_open、f_read、f_write、f_close等),用戶即使不理解FAT協(xié)議,也可以利用應(yīng)用接口函數(shù)輕松地讀/寫文件;中間層完整地實(shí)現(xiàn)FAT文件讀/寫協(xié)議,用戶無需對(duì)此進(jìn)行任何修改;底層是用戶在移植過程中需要處理的接口,需要用戶編寫代碼,它包括存儲(chǔ)介質(zhì)的讀/寫接口Disk I/O和文件創(chuàng)建修改時(shí)間所需的實(shí)時(shí)時(shí)鐘。
嵌入式文件系統(tǒng)的移植可以分為3步:編寫SD卡的通信函數(shù),編寫RTC時(shí)鐘函數(shù)和FATFS的移植。
編寫RTC時(shí)鐘函數(shù)實(shí)際上就是給文件系統(tǒng)時(shí)鐘函數(shù)DWORD get_fattime(Void)賦值,連續(xù)提供給文件系統(tǒng)一個(gè)實(shí)時(shí)時(shí)鐘。DWORD get_fattime(Void)需要RTC函數(shù)支持,返回一個(gè)32位無符號(hào)整數(shù),時(shí)鐘信息包含在這32位中,如圖3所示。
圖3 時(shí)鐘位
DS3231是Maxim公司生產(chǎn)的一款低成本、超高精度的I2C總線實(shí)時(shí)時(shí)鐘芯片[5],該器件不僅能夠在一定溫度范圍內(nèi)提供優(yōu)于2 min/年的計(jì)時(shí)精度,而且省去了制造過程中晶振安裝和布線校準(zhǔn)的工作。
DS3231實(shí)時(shí)時(shí)鐘(RTC),具有集成的溫補(bǔ)晶體振蕩器(TCX0)和1個(gè)32.768 k Hz的晶振,該晶振包含電池輸入端,斷開主電源仍然可以保持精確計(jì)時(shí)。集成晶體振蕩器可提供器件的長期精確度,并減少生產(chǎn)的元件數(shù)。DS3231提供商級(jí)和工業(yè)級(jí)溫度范圍,采用16引腳、300 mil的SO封裝[7]。RTC保持秒、分、時(shí)、星期、日期、月和年信息。當(dāng)遇到少于31天的月份,將自動(dòng)調(diào)整月末日期,包括閏年補(bǔ)償。時(shí)鐘可以工作于24小時(shí)模式或帶AM/PM指示的12小時(shí)。提供2個(gè)可編程日歷鬧鐘和1路可編程方波輸出。地址與數(shù)據(jù)通過I2C雙向串行傳輸。通過精密的、經(jīng)過溫度補(bǔ)償?shù)碾妷夯鶞?zhǔn)和比較器來監(jiān)視VCC狀態(tài),檢測電源故障,提供復(fù)位輸出,并在必要時(shí)自動(dòng)切換到備用電源。另外,RST監(jiān)視引腳可作為手動(dòng)按鈕輸入,以產(chǎn)生外部復(fù)位信號(hào)。
圖4為高精度實(shí)時(shí)時(shí)鐘芯片DS3231與主控制器C8051F500單片機(jī)的接口連接電路。
圖4 C8051F500單片機(jī)與DS3231時(shí)鐘芯片接口連接電路
DS3231的主要引腳功能說明:VCC用于主電源的DC引腳;INT/SQW為低電平有效中斷或方波輸出;RST是低電平有效復(fù)位引腳;GND為地;VBAT為備用電源輸入;SDA為串行數(shù)據(jù)輸入、輸出;SCL為串行時(shí)鐘輸入。
C8051F500通過I2C總線與DS3231連接,DS3231的VCC接系統(tǒng)電源VCC,VBAT為備用電源輸入,該引腳應(yīng)該連接一個(gè)低泄漏電容去耦。INT/SQW為低電平有效中斷或方波輸出,該漏極開路輸出要求外接上拉電阻,如果不使用,可保持開路。微控制器主要通過I2C總線向時(shí)鐘芯片DS3231寫時(shí)間信息,DS3231以寫入的時(shí)間信息為基準(zhǔn)精確走時(shí)。上電后,微控制器從時(shí)鐘芯片讀取時(shí)間信息并存入內(nèi)存供系統(tǒng)使用,器件每隔64 s測量一次溫度,通過調(diào)節(jié)晶振的負(fù)載電容,使其在指定溫度達(dá)到2 ppm的精度[8],最終達(dá)到提高時(shí)鐘精度的目的。即使系統(tǒng)斷電一段時(shí)間后重新上電,時(shí)鐘芯片內(nèi)的實(shí)時(shí)數(shù)據(jù)仍能被正確讀出。
3.3.1 DS3231電源供電方式
DS3231有兩個(gè)電源引腳VCC和VBAT[9],分別連接電源VCC和備用電池,它們之間的切換由溫度補(bǔ)償電壓基準(zhǔn)(VPF)和監(jiān)視VCC電平的比較器電路控制。當(dāng)VCC高于VPF時(shí),DS3231由VCC供電,當(dāng)VCC低于VPF但高于VBAT時(shí),DS3231由VCC供電;當(dāng)VCC低于VPF和VBAT時(shí),DS3231由VBAT供電;如果用一節(jié)容量為38 m Ah的電子表用紐扣鋰電池作備用電池,在系統(tǒng)掉電時(shí)電流損耗最大為3.5μA,則至少供電時(shí)間為:
t=38×10-3/3.5×10-6=10 857 h
按照這個(gè)理論,可以粗略估計(jì)備用電池供電時(shí)間,能夠滿足實(shí)際需要。
3.3.2 DS3231采用I2C總線通信方式
單片機(jī)C8051F500通過讀取時(shí)鐘芯片DS3231的值來給文件系統(tǒng)提供日期時(shí)間,也可以寫入DS3231一個(gè)任意的時(shí)間初始值,讓其依據(jù)設(shè)定值開始計(jì)時(shí),這就要求研究這兩者之間的通信模式。DS3231工作于讀和寫兩種模式。
(1)DS3231寫模式
通過SDA線和SCL線來接收串行數(shù)據(jù)和時(shí)鐘[10],收到每個(gè)字節(jié)后,發(fā)送應(yīng)答位,START和STOP條件作為串行數(shù)據(jù)傳輸?shù)拈_始和結(jié)束。
軟件設(shè)計(jì)流程如圖5所示。首先調(diào)用START_IIC()函數(shù)使單片機(jī)產(chǎn)生開始條件,再通過SendByte()函數(shù),發(fā)送DS3231寫地址,然后發(fā)出應(yīng)答信號(hào),接下來單片機(jī)向DS3231發(fā)送一個(gè)字地址(秒、分、時(shí)、日、月、年地址),產(chǎn)生應(yīng)答信號(hào)后,再發(fā)送一個(gè)字節(jié)數(shù)據(jù)(秒、分、時(shí)、日、月、年數(shù)據(jù))至DS3231設(shè)定初始化時(shí)間。產(chǎn)生應(yīng)答信號(hào)后,調(diào)用STOP_IIC函數(shù)來使單片機(jī)產(chǎn)生終止數(shù)據(jù)寫入條件。
(2)DS3231讀模式
接收和處理字節(jié)的方式與寫模式相同,但是在這種模式下,方向位指示的傳輸方向是相反的。DS3231向SDA發(fā)送串行數(shù)據(jù),并由SCL輸入串行時(shí)鐘。
軟件設(shè)計(jì)流程如圖6所示。單片機(jī)產(chǎn)生START條件后,通過SendByte()函數(shù)發(fā)送DS3231寫地址,產(chǎn)生應(yīng)答信號(hào)后,發(fā)送一個(gè)字地址(秒、分、時(shí)、日、月、年地址);產(chǎn)生應(yīng)答信號(hào)后再通過SendByte()函數(shù)發(fā)送DS3231讀地址;產(chǎn)生應(yīng)答信號(hào)后,通過函數(shù)RcvByte()從DS3231讀取一個(gè)字節(jié)數(shù)據(jù)(秒、分、時(shí)、日、月、年數(shù)據(jù))來獲取時(shí)間;產(chǎn)生應(yīng)答信號(hào)后,最后調(diào)用STOP_IIC函數(shù)來使單片機(jī)產(chǎn)生終止數(shù)據(jù)讀取條件。
圖5 DS3231寫模式
圖6 DS3231讀模式
在系統(tǒng)測試中,C8051F500選用了22.118 400 MHz的外部晶振,存儲(chǔ)介質(zhì)選用了金士頓8 GB SDHC卡,分別在主電源供電5 V和LITHIUM CELL GR1220紐扣電池供電3 V的情況下,對(duì)1980年之后的年、月、日、時(shí)、分、秒等時(shí)間信息進(jìn)行設(shè)定任意初始值,并在PC機(jī)上查看了存儲(chǔ)在SD卡中的數(shù)據(jù)文件的創(chuàng)建、修改、訪問等具體時(shí)間信息。
測試結(jié)果表明,不論在主電源供電還是備用紐扣電池供電情況下,存儲(chǔ)在SDHC卡上的文件能夠精確顯示年、月、日、時(shí)、分、秒等時(shí)間信息。
本文提出的通過DS3231高精度時(shí)鐘芯片給嵌入式文件系統(tǒng)提供實(shí)時(shí)時(shí)間的方案具有可行性,解決了存儲(chǔ)在SD卡上的采集數(shù)據(jù)文件沒有實(shí)時(shí)時(shí)間的問題,并且在系統(tǒng)掉電情況下,通過一個(gè)紐扣鋰電池仍然能夠長時(shí)間連續(xù)不斷地提供精確的年、月、日、時(shí)、分、秒等時(shí)間信息,滿足了艦舵參數(shù)采集設(shè)計(jì)中對(duì)存儲(chǔ)在SD卡上的數(shù)據(jù)文件的創(chuàng)建、修改、訪問等時(shí)間信息的實(shí)際要求。
[1]方潔.基于DS3231的高精度時(shí)鐘接口設(shè)計(jì)[J].電子設(shè)計(jì)工程,2010(18):134-135.
[2]李世奇.基于Fat Fs文件系統(tǒng)的SD卡存儲(chǔ)器設(shè)計(jì)[J].測控技術(shù),2011(12):79-81.
[3]張明亮.淺談FAT32文件系統(tǒng)[J].計(jì)算機(jī)與數(shù)字工程,2005(33):56-57.
[4]王芳成.嵌入式系統(tǒng)中FAT32文件系統(tǒng)的實(shí)現(xiàn)[J].電子測量技術(shù),2009(32):122-126.
[5]常亮.嵌入式環(huán)境文件系統(tǒng)的研究設(shè)計(jì)[D].吉林:吉林大學(xué),2009.
[6]陳劍鋒.ATmega8單片機(jī)與時(shí)鐘器件DS3231的接口設(shè)計(jì)[J].信息與電腦,2011(8):20-23.
[7]楊金生.基于ADμC842單片機(jī)的I2C總線通信實(shí)現(xiàn)方法[J].工業(yè)控制計(jì)算機(jī),2012(9):58-62.
[8]龔光松.基于I2C總線的實(shí)時(shí)時(shí)鐘芯片設(shè)計(jì)[J].軟件導(dǎo)報(bào),2012(11):97-99.
[9]孫雪梅.實(shí)時(shí)時(shí)鐘芯片在單片機(jī)系統(tǒng)中的應(yīng)用[J].沈陽教育學(xué)院學(xué)報(bào),2005(7):132-134.
[10]童海濤.一種可編程實(shí)時(shí)時(shí)鐘芯片的研究與設(shè)計(jì)[D].武漢:華中科技大學(xué),2011.