,
(1.湖北四機賽瓦石油鉆采設備有限公司, 荊州 434023;2.長江大學電信學院)
工業現場的各種實時數據的采集和保存一直是應用工程師關心的問題,尤其是在數據量大、采集時間長的場合,如何對數據進行安全有效的保存和分析顯得格外重要。U盤作為新型移動存儲設備,具有體積小、容量大、抗震動、通用性強的特點,以U盤作為存儲介質來保存工業現場數據,不僅可以有效提高保存數據的可靠性,而且便于與計算機進行數據交換。采用USB器件CH378[1],結合ARM處理器設計的大容量實時數據記錄儀,將現場采集的各種數據按文件方式存儲在大容量U盤中,可以方便地實現現場數據采集、室內進行數據分析的要求,特別適合于長時間數據采集的場合。
USB通信[2]以分層方式進行,總體上可分為功能層、USB設備層和總線接口層。U盤屬于USB家族內的海量存儲(USB Mass Storage)[3]設備,它與主機之間采用“控制/批量/中斷”(CBI)方式或“批量”(Bulk_Only)方式進行通信。海量存儲協議包括CBI、 Bulk-Only、 ATA和 UFI等4個獨立的子類規范,前兩個子規范定義了數據/命令/狀態在USB總線上的傳輸方法,后兩個子規范定義了存儲介質的操作命令,ATA命令規范用于硬盤,UFI命令規范則是針對USB移動存儲制定的。
U盤在能夠進行數據保存之前必須先按文件系統[4]進行格式化,FAT32[5]文件系統因具有高度兼容性而被廣泛應用于U盤移動存儲設備中。FAT32文件系統結構分為5個部分:
主引導記錄區(MBR),其后為64字節的磁盤分區表DPT。U盤一般只有一個分區,沒有磁盤分區。操作系統引導記錄區(DBR),占用分區的第0扇區,共512字節,由跳轉指令、結束標志等幾部分組成。文件分配表區(FAT),文件分配表與數據區簇號一一對應,反映所有簇的使用情況。每個表項單元大小決定了FAT的類型,FAT32的表項單元為32位。FAT表一般都有一個備份。文件目錄表區(FDT),位于備份FAT表之后。FDT由32位線性目錄項構成,記錄著根目錄下每個文件或子目錄的起始單元、屬性等。數據存儲區(DATA),位于FDT之后,占據U盤上的大部分空間。
當U盤格式化為FAT32分區時,文件系統就將這個分區進行整體規劃,以便于數據存儲。通常將U盤空間以一定數目的扇區為單位進行劃分稱為簇,每個扇區512字節,每個簇的最大存儲空間為32 KB。
CH378 是一種新型高速USB總線通用接口芯片,支持Host主機方式和Slave設備方式。內置了多種固件程序,如USB通信協議的基本固件、海量存儲設備的專用通信協議固件、SD卡通信接口固件、FAT32文件系統管理固件。支持常用的USB存儲設備,包括U 盤、USB移動硬盤和SD卡(包括標準容量SD卡和高容量HC-SD卡以及協議兼容的MMC卡和TF卡)。CH378支持8位標準并行接口、高速SPI串行接口以及異步串口接口,MCU處理器可以通過上述任何一種通信接口來控制CH378芯片,對U 盤或SD卡中的文件進行讀寫操作,或者與其它USB設備進行通信。
CH378芯片具有如下主要特點:
支持12 Mbps全速和480 Mbps高速USB通信,外圍元器件只需要一個晶振和2個電容。支持USB主機接口和USB設備接口,支持動態切換主機方式和設備方式。 支持USB設備的控制傳輸、批量傳輸和中斷傳輸。自動檢測USB設備或SD卡的連接和斷開,提供設備連接和斷開的事件通知。提供最高 50 MHz 的SPI主機接口,支持 SD 卡以及與其協議兼容的 MMC 卡和 TF 卡等。內置文件系統,提供文件管理功能,支持長文件名。以字節為單位或者以扇區為單位對多級子目錄下的文件進行讀寫操作,支持容量高達32 GB的U盤和SD卡。提供磁盤管理功能,包括磁盤初始化、查詢物理容量、查詢剩余空間、物理扇區讀寫。提供高速8位并行接口,支持8位并行數據總線。提供最高30 MHz速度的SPI 設備接口,支持SPI串行總線。提供最高10 Mbps速度的異步串行串口,支持串行通信波特率動態調整。支持低功耗模式。內置20 KB的RAM存儲器,可作為文件讀寫緩沖區使用,也可作為普通RAM 使用,極大降低了外部系統的資源要求。

圖1 大容量實時數據記錄儀硬件電路框圖
大容量實時數據記錄儀硬件電路如圖1所示。
ARM處理器LPC2138[6]為記錄儀核心,工業現場需要測量采集的模擬信號,通過整形和調理電路之后,通過LPC2138片內A/D轉換器進行采樣并轉換成數字量,ARM處理器對測量結果進行數字濾波,進一步提高抗干擾能力。記錄儀根據實時時鐘芯片DS1302提供的時間,對測量數據進行實時處理,并按時間標記存儲到U盤中。記錄儀采用點陣圖形液晶作為本地顯示接口,控制芯片為SED1335,既可以通過文本模式顯示所采集的數據,也可以以圖形方式顯示數據曲線。系統外擴矩陣鍵盤用于設定數據采集間隔、采集時間等,根據用戶設定的參數定時啟動數據采集,并自動將采集得到的數據通過CH378存儲到U盤之中。當U盤中數據即將存滿時系統將顯示報警,提醒用戶及時更換U盤。
CH378支持三種通信接口,在芯片上電復位時,CH378將采樣SEL和TXD引腳的狀態,根據這2個引腳狀態的組合選擇當前的通信接口,如表1所列。

表1 CH378的通信接口選擇
CH378采用USB主機方式,通過并行方式實現與LPC2138 ARM處理器之間的接口。并口信號線包括:8 位雙向數據總線 D7~D0、讀選通輸入引腳 RD、寫選通輸入引腳 WR、片選輸入引腳 PCS以及地址輸入引腳A0。CH378芯片通過并行接口,可以很方便地掛接到各種8位系統總線上,并且可以與多個外圍器件共存。表2為CH378并行接口操作的真值表。

表2 CH378并行接口操作的真值表 (其中X表示不關心此位)
為使CH378工作于并口方式,應將CH378的SEL引腳接地,TXD引腳接高電平。8位雙向數據總線D7~D0直接與LPC2138的P0口相連。片選端PCS連接到LPC2138的P1.1引腳,該引腳為低電平時選通CH378芯片。地址輸入線A0連接至LPC2138的P1.0引腳,當A0為高電平時選擇命令端口,向CH378寫入操作命令;當A0為低電平時選擇數據端口,對CH378進行數據讀寫。讀、寫信號端RD和WR分別連接到LPC2138的P1.6和P1.7引腳。中斷請求信號端INT連接到LPC2138外部中斷輸入EINT0引腳,低電平有效。考慮到讀寫U盤時一般以扇區方式進行,為了提高讀寫效率,利用LPC2138片內32 KB的RAM作為數據文件緩沖區,一般來說緩沖區越大,數據讀寫效率越高。
CH378芯片內置了處理海量存儲設備的專用通信協議固件,支持Bulk-Only傳輸協議和SCSI、UFI、RBC等命令集,這使得USB控制傳輸過程大為簡化,CH378編程時只需要根據發出文件管理和數據讀寫命令,極大地方便了用戶對U盤的讀寫等操作。
U盤提供若干個物理扇區用于數據存儲,每個扇區大小為 512 字節。通常將U盤中的物理扇區組織為FAT32文件系統,為了方便起見,ARM處理器也應該在FAT32規范下通過文件的形式存取U盤中的數據。一個U盤中可以有若干個文件,每個文件都是一組數據的集合,以文件名來區分和識別。實際文件數據的存放可能不是連續的,而是通過一組“指針”鏈接的多個塊(也就是分配的簇),從而能夠根據需要隨時增大文件長度以便容納更多數據。
目錄(文件夾)是為了便于分類管理,可以將多個文件歸檔在一起。在FAT32文件系統中,U盤容量以簇為基本單位進行分配,而簇的大小總是扇區的倍數,所以文件的占用空間總是簇的倍數,也就是扇區的倍數。但在實際應用中,保存在文件中的有效數據的長度卻不一定是扇區的倍數,所以FAT32在文件目錄信息FAT_DIR_INFO中專門記錄了當前文件中有效數據的長度,也就是通常所說的文件長度,文件長度總是小于或者等于文件占用的空間。
在對文件寫入數據后,如果覆蓋了原數據,則文件長度可能不發生變化,當超過原文件長度后,變為追加數據,那么文件長度將會增大。如果向文件追加數據后,沒有修改文件目錄信息中的文件長度,那么FAT32 文件系統會認為超過文件長度的數據是無效的,這時處理器將無法讀出超過文件長度的數據,雖然數據實際存在。如果數據量少或者數據不連續,那么可以在每次追加數據后立即更新文件目錄信息中的文件長度,但是如果數據量大并且需要連續寫入數據,立即更新文件目錄信息會降低效率,并且頻繁修改文件目錄信息會縮短U盤的使用壽命。
所以在這種情況下,應該在連續寫入多組數據后再更新一次文件目錄信息中的文件長度,或者一直等到關閉文件時再更新文件長度,CH378的內置命令 CMD_FILE_CLOSE可以將內存中的文件長度刷新到U盤的文件目錄信息中。雖然CH378最大支持1 GB的單個文件,但是為了提高效率,一般單個文件的長度不要超過100 MB,通常在幾KB到幾MB范圍是比較正常的,數據較多時可以分為多個目錄、多個文件存儲。
圖2為大容量數據記錄儀軟件系統在U盤中創建文件并寫入數據的流程圖。采用FAT32文件系統時最小單元為簇,即使一個很小的文件也會占用一簇,為了節約存儲空間,創建文件時如果有同名文件存在,只需要向原來的同名文件追加數據。系統軟件對于U盤的操作主要包括如下幾點:

圖2 在U盤中創建文件并向其中寫入數據的流程圖
① 創建文件:在FDT中申請新的目錄項。
② 寫文件:創建新文件時,在FAT表中查找未使用的簇,并將該簇號寫入文件對應目錄數據結構中的起始簇號位置。當文件長度大于一簇時,需要在FAT表對應的起始簇號位置填入下一個可用簇號,直到文件的最后一簇。
③ 刪除文件:除了在FDT中對應的目錄項設置相應標志外,還要修改FAT表,將要刪除文件所使用的簇號位置清0,表示此簇當前未被使用。
通過CH378構建的FAT32文件系統為用戶提供了多種API函數,用戶只需要調用相關命令即可完成對應的操作。下面按操作順序給出常用的幾種命令。
(1)初始化操作
這是進行任何一項文件操作之前的必要步驟,相關命令如下:
① 發送 CMD_SET_USB_MODE 命令,進入 USB-HOST工作方式。
② 等待U盤連接,由處理器向CH378發送CMD_DISK_CONNECT命令定期查詢。
③ 發送CMD_DISK_MOUNT命令,初始化U盤,并測試磁盤是否就緒,失敗后可以重試最多5次。
④ 上述步驟只需執行一次,如果U盤斷開后重新連接,則必須回到步驟②。
(2)新建文件并寫入數據
相關命令如下:
① 發送 CMD_SET_FILE_NAME 命令+CMD_FILE_CREATE 命令,新建文件。
② 多次發送 CMD_WR_HOST_OFS_DATA 命令+CMD_BYTE_WRITE 命令,寫入數據。
③ 發送 CMD_FILE_CLOSE 命令,參數是 1,關閉文件并允許自動更新文件長度。
(3)向已有文件追加數據
相關命令如下:
① 發送 CMD_SET_FILE_NAME 命令+CMD_FILE_OPEN 命令,打開文件。
② 發送 CMD_BYTE_LOCATE 命令,參數是 0F FFFF FFFH,移動文件指針到文件末尾。
③ 多次發送 CMD_WR_HOST_OFS_DATA 命令+CMD_BYTE_WRITE 命令,寫入數據。
④ 發送 CMD_FILE_CLOSE 命令,參數是 1,關閉文件并允許自動更新文件長度。
在FAT32中子目錄被視為特殊的文件,對其操作類似于文件操作,不再贅述。
系統軟件設計還包括數據記錄儀的液晶驅動、A/D轉換驅動以及鍵盤驅動等,其中液晶驅動程序較為復雜,包括初始化液晶、讀寫參數子程序、寫命令子程序、建坐標子程序、繪圖子程序、漢字寫入子程序等,限于篇幅,這里不再一一列舉。
