費 超,趙英俊
(華中科技大學 機械科學與工程學院,湖北 武漢 430074)
嵌入式實時操作系統(tǒng)μC/OS具有源代碼公開、良好的實時性等優(yōu)點,廣泛應(yīng)用于各種嵌入式系統(tǒng)中,特別是實時數(shù)據(jù)采集與處理的嵌入式系統(tǒng)。這種嵌入式系統(tǒng)往往需要存儲大量的數(shù)據(jù),并且需要將存儲的數(shù)據(jù)方便地轉(zhuǎn)移到PC平臺進行后續(xù)的離線分析。
常見的嵌入式系統(tǒng)往往采用EEPROM外部存儲芯片,容量小、速度慢而且不便于數(shù)據(jù)的移動,因此需要結(jié)合硬件平臺選擇一種大容量且具有移動靈活性的存儲設(shè)備。另外,考慮到在PC平臺的離線處理的便捷需要,存儲系統(tǒng)采用廣泛應(yīng)用的FAT文件系統(tǒng)。
由于S3C2440具有專門的SDIO接口,且SD卡具有容量大、速度快、移動靈活和安全性高等優(yōu)點[1]。綜合考慮,選擇采用SD卡作為移動存儲設(shè)備。
軟件設(shè)計上,首先要實現(xiàn)在μC/OS下的SD卡驅(qū)動,同時要保證兼容標準SD卡和SDHC卡。完成SD卡驅(qū)動后,還要在基于μC/OS的嵌入式系統(tǒng)中方便地實現(xiàn)對FAT文件系統(tǒng)下的文件的多種操作。如果從無到有設(shè)計FAT文件系統(tǒng)軟件模塊,將費時費力并且難以保證軟件模塊的可靠性。因此,最好的方案是采用通用的FAT文件系統(tǒng)軟件模塊,只需要進行較少的移植工作,完成項目效率大大增加。
通用的 FAT 文件系統(tǒng)主要有 μC/FS、FatFs、EFSL、ZLG/FS、znFAT等。其中μC/FS是Micrium公司開發(fā)的一個商業(yè)用途的文件系統(tǒng),兼容性、穩(wěn)定性較好。ZLG/FS和znFAT主要面向?qū)W習用途。而FatFs是免費開源的項目,具有代碼精簡、易于移植、支持RTOS、支持Unicode長文件名等特點,特別是其提供的底層讀寫函數(shù),具有讀寫塊數(shù)量的參數(shù),可以一次命令讀寫多個扇區(qū),在速度與效率上具有明顯優(yōu)勢,而μC/FS和EFSL都不提供塊數(shù)量參數(shù)。因此,選擇FatFs作為文件系統(tǒng)軟件模塊。
圖1 系統(tǒng)總體結(jié)構(gòu)圖Fig.1 Structure diagram of the system
總體方案采用基于SDIO接口的SD卡存儲設(shè)備和FatFs文件系統(tǒng),其系統(tǒng)總體結(jié)構(gòu)如圖1所示。SD卡從S3C2440微處理器的SDIO接口接入硬件層,通過SD卡驅(qū)動程序提供給FatFs文件系統(tǒng)進行管理,然后用戶在功能層調(diào)用FatFs提供的文件接口函數(shù)進行數(shù)據(jù)存儲等任務(wù)。
如圖2所示為本次SD卡硬件電路圖,其中S3C2440微處理器上有SDIO控制器,連接的SD總線包括時鐘線CLK、命令線CMD及4根數(shù)據(jù)線 (DAT0~DAT3)[2]。S3C2440通過SDIO接口與SD卡座相連,其中卡座上除了6根SD總線外,還有3根電源線,以及無卡檢測引腳nCD和寫保護引腳WP。其中nCD和WP是連接到卡座上的兩個常開型機械開關(guān),開關(guān)的另一端接地。當插入SD卡時,開關(guān)合上,nCD從高電平變?yōu)榈碗娖?,當插入的是未寫保護的SD卡時,另一個開關(guān)也會合上,WP從高電平變?yōu)榈碗娖剑床迦隨D卡以及插入寫保護的SD卡時,WP被上拉成高電平。SD卡側(cè)面的寫保護的撥動開關(guān)實現(xiàn)寫保護的原理不是通過開閉SD卡內(nèi)部的線路,而是通過不同位置作用于SD卡座內(nèi)的機械彈性開關(guān)的開閉。SD卡有9個引腳,支持SD和SPI兩種總線方式,其中SD總線方式又分為1位數(shù)據(jù)模式和4位數(shù)據(jù)模式,本文設(shè)計采用采用4位數(shù)據(jù)模式,可以獲得更高傳輸速率,具體過程在SD卡驅(qū)動中實現(xiàn)。
圖2 硬件電路圖Fig.2 Hardware circuit diagram
SD卡驅(qū)動程序的功能是給FatFs文件系統(tǒng)提供對SD卡的讀寫操作接口,屏蔽掉上層軟件對硬件的直接操作,其中主要包括初始化SD卡、讀數(shù)據(jù)、寫數(shù)據(jù)等?,F(xiàn)在市場上的SD卡有SD1.0協(xié)議下的標準容量卡、SD2.0協(xié)議下的標準容量卡和高容量卡(SDHC),為了使驅(qū)動程序兼容性好,必須同時支持這些類型。
在初始化SD卡時,要識別并記錄SD卡的類型,然后在讀寫數(shù)據(jù)時,根據(jù)不同類型進行操作。SD卡通信是由主機控制,通過CMD線發(fā)出不同類型的命令(Command),然后被尋址的SD卡在CMD線上產(chǎn)生相應(yīng)的響應(yīng)(Response),當CMD線上是數(shù)據(jù)傳輸命令時,數(shù)據(jù)線DAT0或DAT0~DAT3接著進行數(shù)據(jù)傳輸。
SD卡初始化流程圖如圖 3所示,最開始初始化SD卡控制器時,配置SD卡工作在傳輸效率較高的4位數(shù)據(jù)傳輸模式。命令CMD0實現(xiàn)復位SD卡,使其進入到空閑狀態(tài),命令CMD8是SD2.0協(xié)議新增加的接口條件檢查命令,用來檢查電壓匹配和擴展SD1.0協(xié)議中某些原有命令的功能,例如命令A(yù)CMD41在參數(shù)中增加了HCS(Host Capacity Support)位,在響應(yīng)中增加了CCS(Card Capacity Status)位,同時也能根據(jù)SD卡是否產(chǎn)生響應(yīng)來判斷SD卡版本,SD1.0版本的SD卡不能識別該命令,不會產(chǎn)生響應(yīng)。同時通過SD卡返回的響應(yīng)中的CCS位來判斷是否為SDHC卡。另外,針對讀寫SD卡時的差異,將SD卡總結(jié)為兩種類型,標準容量SD卡 (包括SD1.0和SD2.0標準容量卡)和高容量SD卡,在后面進行讀寫數(shù)據(jù)時,要分別處理。最后發(fā)送命令CMD2和CMD3使SD卡從卡識別模式進入數(shù)據(jù)傳輸模式,處于等待狀態(tài),后面可以發(fā)送相關(guān)存儲器訪問命令。
在本設(shè)計中,結(jié)合FatFs的移植需要,將用到的存儲器訪問 命 令 有 塊 讀 取 命 令 (CMD17,CMD18), 塊 寫 入 命 令(CMD24,CMD25),其中 CMD17和 CMD24為單塊操作命令,CMD18和CMD25為連續(xù)多塊操作命令[3]。以下為標準容量SD卡和高容量SD卡在存儲器訪問命令上的主要功能區(qū)別。
1)存儲器訪問的命令參數(shù)(Command Argument)。標準容量SD卡的32位命令參數(shù)是對字節(jié)尋址,高容量SD卡的命令參數(shù)是對塊尋址。
2)塊長度。標準容量SD卡的塊長度根據(jù)CMD16命令設(shè)置大小,而高容量SD卡的塊大小固定為512字節(jié),必須設(shè)置塊大小寄存器為0x200。
除此之外,兩者還有局部尋址、寫保護、讀寫超時等方面的區(qū)別,針對以上主要區(qū)別,采用以下解決辦法實現(xiàn)同時兼容兩種SD卡。讀寫數(shù)據(jù)函數(shù)給上層文件系統(tǒng)模塊提供對SD卡的塊地址訪問,并統(tǒng)一塊大小為512Byte。如圖 4為SD卡讀取單塊數(shù)據(jù)的流程圖,在發(fā)送讀取命令CMD17前先根據(jù)初始化SD卡時確定的卡類型來進行處理。
圖3 SD卡初始化流程圖Fig.3 SD cardinitialization flow chart
提供的變量是塊地址,因此可以直接作為高容量卡的命令參數(shù),而標準容量SD卡的命令參數(shù)是字節(jié)單位,需要塊地址乘以塊大?。?12Byte),即左移9位,轉(zhuǎn)換為字節(jié)地址。其他塊讀寫命令CMD18、CMD24、CMD25處理辦法與此相同,實現(xiàn)多塊讀取函數(shù)、單塊寫入函數(shù)、多塊寫入函數(shù)。
圖4 讀取單塊數(shù)據(jù)流程圖Fig.4 Flow chart of reading a block
SD卡驅(qū)動程序還支持SD卡插拔檢測和寫保護功能。配置無卡檢測接入引腳為外部中斷方式,并設(shè)計中斷處理函數(shù),隨時通知軟件系統(tǒng)當前SD卡的插拔狀態(tài)。SD卡的寫保護采用軟件方式實現(xiàn),實現(xiàn)方法有兩種,一種是在SD卡的兩個寫數(shù)據(jù)的驅(qū)動函數(shù)開始處加入查詢寫保護引腳狀態(tài),一旦寫保護開啟,則通知軟件系統(tǒng),并取消執(zhí)行后面寫數(shù)據(jù)流程。另一種可選方法是在FatFs文件系統(tǒng)層實現(xiàn)。
FatFS是一個為小型嵌入式系統(tǒng)設(shè)計的通用FAT文件系統(tǒng)模塊。FatFs的編寫遵循ANSI C,并且完全與磁盤I/O層分開。因此,它獨立于硬件架構(gòu)。它可以被嵌入到低成本的微控制器中而不需要做任何修改。FatFs已經(jīng)封裝了對文件系統(tǒng)層和磁盤管理層的操作。對它的移植,主要在于配置FatFs功能和寫好SD卡驅(qū)動接口[4]。
FatFs的配置選項在ffconf.h中,實現(xiàn)文件系統(tǒng)接口函數(shù)的剪裁,需要結(jié)合嵌入式系統(tǒng)硬件平臺和具體應(yīng)用來設(shè)置。由于本次系統(tǒng)平臺是小端模式,為了獲得較好的軟件性能,_WORD_ACCESS設(shè)為1,配置為字訪問,比字節(jié)訪問快;由于SD卡屬于Menory Card,_MAX_SS必須設(shè)為512,代表塊大小最大為512 Byte;其他采用默認設(shè)置即可。
底層接口函數(shù)有6個,位于diskio.c中,主要是調(diào)用SD卡驅(qū)動程序?qū)崿F(xiàn)。
1)disk_initialize():磁盤初始化函數(shù),調(diào)用 SD 卡初始化函數(shù)實現(xiàn)。
2)disk_read:讀扇區(qū)函數(shù),調(diào)用SD卡塊讀取函數(shù)實現(xiàn)。
3)disk_write:寫扇區(qū)函數(shù),調(diào)用SD卡塊寫入函數(shù)實現(xiàn)。
4)disk_status:狀態(tài)檢測函數(shù),共包含三種返回狀態(tài),包括STA_NOINIT ( 未 初 始 化 )、STA_NODISK ( 無 磁 盤 )、STA_PROCTECTED(卡保護)。可以在此處查詢SD卡寫保護引腳的狀態(tài),返回STA_POCTECTED卡保護狀態(tài)。正常返回0即可。
5)disk_ioctl:磁盤控制函數(shù),包括獲取磁盤容量等,在文件系統(tǒng)實現(xiàn)一些復雜功能時會用到,簡單應(yīng)用直接返回0即可。
6)get_fattime:獲取當前系統(tǒng)時間,查詢 S3C2440的實時時鐘[5],并轉(zhuǎn)換為32位無符號整數(shù)返回即可。
完成FatFs移植后,上層應(yīng)用經(jīng)常訪問的API有:f_mount()注冊或注銷一個工作區(qū)域、f_open()打開或創(chuàng)建一個文件、f_close()關(guān)閉文件、f_read()讀取數(shù)據(jù)、f_write()寫數(shù)據(jù)、f_lseek()移動讀寫指針等。
在μC/OS系統(tǒng)下增加數(shù)據(jù)存儲任務(wù)測試FatFs文件系統(tǒng)能否滿足本次數(shù)據(jù)采集系統(tǒng)數(shù)據(jù)保存的需要。其中數(shù)據(jù)采集部分是采用一個具有SPI接口的TLC2543模數(shù)轉(zhuǎn)換器以200 Hz的采樣頻率采集12位精度的數(shù)據(jù)。數(shù)據(jù)存儲任務(wù)實現(xiàn)將采集任務(wù)發(fā)送過來的緩存數(shù)據(jù)保存到SD卡中,存儲任務(wù)[6]設(shè)計如圖5所示。
采集并保存半小時的數(shù)據(jù)到SD卡中,關(guān)機后,將SD卡取出插入到計算機中,將文件中的數(shù)據(jù)繪制曲線,與數(shù)據(jù)采集輸入的信號吻合,驗證了FAT文件系統(tǒng)能夠正常工作,并且已經(jīng)滿足當前數(shù)據(jù)采集系統(tǒng)數(shù)據(jù)存儲和數(shù)據(jù)轉(zhuǎn)移的需求。另外,系統(tǒng)運行過程中,由于軟件實現(xiàn)了無卡檢測功能,支持熱插拔,系統(tǒng)可以長時間工作仍能穩(wěn)定運行。
圖5 數(shù)據(jù)存儲任務(wù)流程圖Fig.5 Flow chart of data storage task
本設(shè)計在硬件上采用S3C2440的SDIO接口實現(xiàn)底層驅(qū)動,軟件上采用FatFs實現(xiàn)μC/OS下FAT文件系統(tǒng)的管理,滿足數(shù)據(jù)存儲和數(shù)據(jù)移動的需求。其中兼容標準SD卡和SDHC卡的驅(qū)動實現(xiàn)方法可以應(yīng)用到其他具有SDIO接口的硬件平臺,通用性好。另外,F(xiàn)atFs經(jīng)過了大量用戶的使用和測試,運行穩(wěn)定可靠,并且其具有較多的上層接口,可以應(yīng)用于更多復雜文件管理功能的任務(wù)。
[1]劉榮林,程曉東.基于ARM和μC/OS的SD卡文件系統(tǒng)設(shè)計[J].內(nèi)蒙古大學學報:自然科學版,2009, 40(3):309-314.
LIU Rong-lin,CHENG Xiao-dong.Design of the SD card file systems based on ARM and μC/OS-Ⅱ [J].Journ al of Inner Mongolia University:Natural Science,2009,40(3):309-314.
[2]師超.SDIO接口的軟硬件實現(xiàn)及性能評估[D].南京:東南大學,2006.
[3]SD Card Association.SD SpecificationsPart1:Physical LayerSimplifiedSpecification Version 2.00[EB/OL].(2006-09-25)[2013-03-10].https://www.sdcard.org/downloads/pls/simplified_specs/archive/part1_200.pdf.
[4]李世奇,董浩斌,李榮生.基于FatFs文件系統(tǒng)的SD卡存儲器設(shè)計[J].測控技術(shù),2011(12):79-81.
LI Shi-ji,DONG Hao-bin,LI Rong-sheng.Design of SD memory card based on FatFs file system[J].Measurement&Control Technology,2011(12):79-81.
[5]Samsungsemiconductor.S3C2440A32-BitCMOSMicrocontroller User’s Manual[EB/OL].(2004-06-03)[2013-3-11]http://wenku.baidu.com/view/2adfbaea5ef7ba0d 4a733b54.html.
[6]周慈航.基于嵌入式實時操作系統(tǒng)的程序設(shè)計技術(shù)[M].2版.北京:北京航空航天大學出版社,2011.