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