摘 要: 提出了用SD卡來實現(xiàn)記錄汽車CAN總線數(shù)據(jù)的設計,介紹了基于LPC2368的SD卡FAT文件系統(tǒng)的實現(xiàn)方法,并給出了該設計的硬件接口與軟件實現(xiàn),闡述了SD卡應用于大容量數(shù)據(jù)記錄的優(yōu)點。
關鍵詞: CAN總線;SD卡;FAT文件系統(tǒng);數(shù)據(jù)記錄
CAN總線是德國BOSCH公司在20世紀80年代初,為了解決現(xiàn)代汽車中眾多的控制與測試儀器之間的數(shù)據(jù)交換而開發(fā)的一種串行數(shù)據(jù)通信協(xié)議。它的短幀數(shù)據(jù)結構、非破壞性總線性仲裁技術以及靈活的通信方式適應了汽車的實時性和可靠性要求,備受汽車生產(chǎn)廠商的青睞。目前,汽車上的ECU(電控單元)之間使用CAN總線進行通信,例如電控燃油噴射系統(tǒng)、電控傳動系統(tǒng)、防抱死制動系統(tǒng)(ABS)和防滑控制系統(tǒng)(ASR)等,記錄汽車CAN總線上的數(shù)據(jù)對于監(jiān)控汽車ECU間正確通信和研究汽車CAN網(wǎng)絡故障的原因具有重要的意義。
設計以SD卡作存儲載體,實現(xiàn)實時記錄CAN總線上數(shù)據(jù)的記錄儀,具有容量大、體積小、重量輕、接口電路簡單等特點。并且記錄的數(shù)據(jù)文件可以為PC機所識別,通過PC機上的分析軟件對其進行分析和回放,作為歷史數(shù)據(jù)用于數(shù)據(jù)對比。
1 系統(tǒng)設計
SD卡應用于CAN總線數(shù)據(jù)記錄儀的系統(tǒng)結構圖如圖1所示,CAN總線數(shù)據(jù)儀工作時應掛接到汽車CAN總線上,成為一個CAN節(jié)點,以便采集CAN數(shù)據(jù)信息。主控芯片的主要作用是進行數(shù)據(jù)采集并將采集到的CAN數(shù)據(jù)以文件格式存儲在SD卡上。此外,SD卡在數(shù)據(jù)組織結構上與PC機格式兼容,這里選用FAT32文件系統(tǒng),使記錄數(shù)據(jù)可以直接供Windows操作系統(tǒng)下的應用程序使用。
2 硬件接口設計
硬件平臺的控制核心采用NXP公司的ARM7芯片LPC2368, 該芯片是基于ARM7TDMI-S內核的32位微控制器,可在高達72 MHz的頻率下操作,功能強大且成本低,具有高達512 KB的片內Flash、32 KB的SRAM,內部具有豐富的系統(tǒng)外圍設備控制器,包括SD控制器和CAN控制器。
SD卡支持2種工作模式:SD模式和SPI模式。SD模式允許4線高速數(shù)據(jù)傳輸,SPI模式允許簡單通用的SPI通道接口, 但讀寫速度大大降低。由于CAN總線數(shù)據(jù)傳輸速率較高,因此本設計采用SD模式的4線高速數(shù)據(jù)傳輸功能。
LPC2368與SD卡接口電路如圖2所示,使用SD通信協(xié)議將SD和LPC2368相連實現(xiàn)數(shù)據(jù)傳輸。CMD傳輸SD控制器的命令及相關參數(shù)和SD卡對命令的響應信號,DAT0、DAT1、DAT2、DAT3傳輸讀寫數(shù)據(jù),CLK為時鐘信號,并由主控芯片來控制SD卡的電源。
3 軟件設計
3.1 SD卡底層讀寫
SD卡的讀寫操作都是基于命令的,主控芯片通過向SD卡發(fā)送相應的命令并讀取相應的響應來實現(xiàn)對SD卡的控制,在對SD卡讀寫之前,首先要對SD控制器進行初始化,完成各項參數(shù)的配置,包括控制器與CPU數(shù)據(jù)傳輸?shù)腄MA方式、傳輸速率和讀寫數(shù)據(jù)塊長度等,之后需要對SD卡進行初始化,這是確保SD卡正常數(shù)據(jù)讀寫的前提。SD卡的初始化流程如圖3所示。
SD卡初始化完成之后如果要使用默認的塊讀寫長度(512 B),就可以進行SD卡的讀寫。當然,也可用CMD16命令來設置SD卡的塊讀寫長度,可以是1B~512 B之間的任意值。但是對SD卡的寫過程則要求塊長度必須為512 B。無論是SD卡的讀還是寫,都要求在讀寫命令發(fā)送后有數(shù)據(jù)起始令牌FEH,數(shù)據(jù)傳輸結束有2 B的循環(huán)冗余編碼CRC。本設計采用默認的塊讀寫長度。
3.2 FAT32文件系統(tǒng)
存儲在SD卡中的數(shù)據(jù)為二進制數(shù)據(jù),為了使其能為計算機所識別,SD卡文件系統(tǒng)必須與計算機的文件系統(tǒng)一致。目前Windows系列操作系統(tǒng)中最常用的文件系統(tǒng)有FAT16、FAT32及NTFS等。由于汽車CAN網(wǎng)絡的數(shù)據(jù)量大,并且記錄儀需要記錄長時間的數(shù)據(jù),所以本設計選擇FAT32作為SD卡的文件系統(tǒng),F(xiàn)AT32最大支持單個文件4 GB容量,滿足CAN數(shù)據(jù)記錄儀的要求。
FAT32文件系統(tǒng)由系統(tǒng)引導記錄區(qū)、FAT表區(qū)、文件登記表區(qū)和數(shù)據(jù)區(qū)四部分組成。系統(tǒng)引導記錄區(qū)存儲SD卡有關磁盤的結構信息,包括扇區(qū)字節(jié)數(shù)、FAT表的數(shù)目和總扇區(qū)數(shù)等;FAT表是FAT32文件系統(tǒng)中用于磁盤數(shù)據(jù)(文件)索引和定位引進的一種鏈式結構,它準確記錄著已經(jīng)被占用的簇,并為每個已經(jīng)占用的簇指明存儲后續(xù)內容的下一個簇的簇號。文件登記表FDT記錄文件的登記項,每個登記項占32 B,記錄了文件的起始簇號、大小以及創(chuàng)建和最后修改的時間等;數(shù)據(jù)區(qū)用于存儲文件數(shù)據(jù)。
SD卡的文件系統(tǒng)主要功能包括創(chuàng)建文件、打開文件、寫文件、讀文件和關閉文件。在應用中,可以根據(jù)實際情況,增刪以上功能,以簡化系統(tǒng)。
考慮數(shù)據(jù)采集對系統(tǒng)實時性的要求, 對FAT表區(qū)的鏈式結構進行簡化,磁盤的空閑空間是連續(xù)的,采用連續(xù)存儲方式,這樣略去了每次去FAT表搜索空閑簇的過程,滿足系統(tǒng)對實時性的要求。簡化后的鏈式結構是直線鏈, 即寫滿一個扇區(qū)自動寫下一個扇區(qū), 寫滿一個簇自動寫下一個簇。
3.2.1 文件的創(chuàng)建
在SD卡上創(chuàng)建文件就是在文件目錄表FDT中申請登記項和向FAT表中的FAT項填寫空閑簇號的過程,流程圖如圖4所示。程序首先在系統(tǒng)引導記錄區(qū)獲取SD卡磁盤的結構信息;接著要檢測文件登記表FDT中是否已經(jīng)存在該文件,如果存在同名的文件,則返回,創(chuàng)建文件失?。蝗缓笊暾埧臻e的FDT表項,申請FDT 表項成功后,程序會檢測磁盤剩余的空間是否滿足新創(chuàng)文件數(shù)據(jù)長度的需要,然后尋找第一個空閑的簇號,并修改對應的FDT表項。由于文件都是連續(xù)的,在FAT表中的FAT鏈表是直線鏈即前一簇指向后一簇,根據(jù)文件的大小,向FAT表區(qū)填寫FAT鏈表,直到最后一個FAT項寫入0x0FFFFFFFH,表示文件結束。
3.2.2 文件的讀/寫
SD卡上文件都是以簇為單位存取的,向SD卡上的文件寫數(shù)據(jù)時,首先要根據(jù)文件名查找到該文件的文件登記項,根據(jù)文件登記項中的起始簇號即可找到文件在數(shù)據(jù)區(qū)中第1簇,向數(shù)據(jù)區(qū)對應的簇中寫數(shù)據(jù),并且可以在FAT表中找到第2個簇號。根據(jù)第2個簇號又能向第2簇寫數(shù)據(jù)并找到FAT 中的第3個簇號,以此類推,直到FAT表中最后一項0x0FFFFFFFH,完成寫文件。讀取文件的過程與寫文件類似。
SD卡在記錄汽車CAN總線數(shù)據(jù)中的應用程序流程圖如圖5所示。其中LPC2368以中斷方式將接收到的CAN數(shù)據(jù)以及接收時的時間存儲到數(shù)據(jù)隊列里,并立即跳出中斷,進行主程序的處理或等待下一幀數(shù)據(jù)的接收中斷,從而避免報文的丟失。
本設計采用SD卡作為外部存儲介質,將實時采集到的CAN數(shù)據(jù)信息以標準文件的格式保存于SD卡中,具有性能可靠、使用方便、重量輕及存儲容量大等特點,具有廣闊的應用前景。
參考文獻
[1] Philips , LPC2368 User Manual. 2007.
[2] 周立功. ARM微控制器基礎與實踐[M].北京:北京航空航天大學出版社,2005.
[3] 張明亮,張宗杰.淺析FAT32 文件系統(tǒng)[J].計算機與數(shù)字工程,2005,33(1):56-59.
[4] SanDisk Corporate. SD memory card specification part 1:physical layer specification version 1. 0[M].2000.