郭健忠,田瀟寒,謝 斌,杜新寶,胡文龍
(1.武漢科技大學(xué)汽車與交通工程學(xué)院,湖北武漢 430065;2.武漢保華顯示科技有限公司,湖北 武漢 430082)
CAN(Controller Area Network)總線作為目前唯一具有國(guó)際標(biāo)準(zhǔn)的現(xiàn)場(chǎng)總線,其以數(shù)據(jù)在通信過(guò)程中突出的可靠性、實(shí)時(shí)性和靈活性,被作為車載控制器之間的主要通信網(wǎng)絡(luò)[1]。CAN 總線上的報(bào)文數(shù)據(jù)不僅記錄了汽車的實(shí)時(shí)運(yùn)行狀態(tài),而且可以反映出汽車行駛過(guò)程中的各種問(wèn)題[2]。采集和使用好實(shí)車數(shù)據(jù),可以給車輛檢測(cè)、故障診斷與汽車相關(guān)產(chǎn)品開(kāi)發(fā)等帶來(lái)正面影響,其中完整的實(shí)車數(shù)據(jù)可為車輛檢測(cè)與故障診斷提供全面客觀的數(shù)據(jù)依據(jù),同時(shí)運(yùn)用完整的實(shí)車數(shù)據(jù)可以在開(kāi)發(fā)過(guò)程中對(duì)車載電子嵌入式設(shè)備進(jìn)行多工況模擬測(cè)試[3],模擬汽車真實(shí)運(yùn)行環(huán)境,發(fā)現(xiàn)車載電子嵌入式設(shè)備開(kāi)發(fā)設(shè)計(jì)中的不足,提出改進(jìn)思路,形成分析-改進(jìn)-分析的閉環(huán)設(shè)計(jì)過(guò)程[4]。針對(duì)目前CAN 總線數(shù)據(jù)記錄儀在CAN 總線數(shù)據(jù)量大的應(yīng)用場(chǎng)景下存在數(shù)據(jù)丟幀,所采集的數(shù)據(jù)內(nèi)容無(wú)法為車輛檢測(cè)與車載電子嵌入式開(kāi)發(fā)提供完整可靠的數(shù)據(jù)支持,以及人工操作PC 搭配CAN 分析儀采集實(shí)車數(shù)據(jù)流程繁瑣的問(wèn)題[5-6],有必要設(shè)計(jì)一種可以完整采集總線實(shí)車數(shù)據(jù)、操作簡(jiǎn)單的CAN總線數(shù)據(jù)采集方案。
文中所設(shè)計(jì)開(kāi)發(fā)的系統(tǒng)主要實(shí)現(xiàn)數(shù)據(jù)采集和數(shù)據(jù)存儲(chǔ)兩種功能[7]。
1)CAN 總線報(bào)文數(shù)據(jù)采集:車載設(shè)備產(chǎn)生的數(shù)據(jù)信息通過(guò)CAN 總線進(jìn)行通信,設(shè)計(jì)的系統(tǒng)將采集監(jiān)聽(tīng)到的總線數(shù)據(jù)信息。
2)采集數(shù)據(jù)固定格式存儲(chǔ):系統(tǒng)主控芯片將采集到的CAN 總線數(shù)據(jù)以既定格式寫入Micro SD 卡中進(jìn)行存儲(chǔ)。
文中的CAN 總線數(shù)據(jù)采集系統(tǒng)以CAN 節(jié)點(diǎn)的形式加入車載CAN 總線中,并對(duì)總線中產(chǎn)生的CAN報(bào)文數(shù)據(jù)進(jìn)行監(jiān)聽(tīng)、采集與記錄。當(dāng)采集系統(tǒng)監(jiān)聽(tīng)到總線上有CAN 報(bào)文數(shù)據(jù)時(shí),自動(dòng)觸發(fā)系統(tǒng)中斷,并將實(shí)時(shí)采集的數(shù)據(jù)暫存在無(wú)鎖FIFO 隊(duì)列中,隊(duì)列依據(jù)數(shù)據(jù)量的多少自動(dòng)調(diào)節(jié)隊(duì)列大小,在保證總線數(shù)據(jù)存儲(chǔ)無(wú)誤的同時(shí)改變系統(tǒng)資源占用。系統(tǒng)控制單元將隊(duì)列內(nèi)的數(shù)據(jù)依次取出并將其以標(biāo)準(zhǔn)CANLog 格式存儲(chǔ)到Micro SD 卡中。最終從Micro SD 卡中導(dǎo)出相應(yīng)數(shù)據(jù),為車載電子嵌入式開(kāi)發(fā)、測(cè)試等提供實(shí)車數(shù)據(jù)支持。
無(wú)鎖FIFO 隊(duì)列作為一種受限制線性表,具有只允許在隊(duì)列的前端進(jìn)行刪除操作,而在隊(duì)列的后端進(jìn)行插入操作的特殊性。也是因?yàn)榇颂匦裕钤邕M(jìn)入隊(duì)列的元素才能最先從隊(duì)列中刪除,即先進(jìn)先出[8]。由于隊(duì)列只有一端可以進(jìn)行插入操作,故隊(duì)列中的每一個(gè)元素都是按照先后順序排列的。根據(jù)以上特點(diǎn),無(wú)鎖FIFO 隊(duì)列在實(shí)際應(yīng)用中常用于流量削峰、日志處理場(chǎng)等景中[9]。文中所設(shè)計(jì)的CAN 總線數(shù)據(jù)采集系統(tǒng)屬于單生產(chǎn)者單消費(fèi)者問(wèn)題,不涉及多生產(chǎn)者多消費(fèi)者情況,可避免多生產(chǎn)者多消費(fèi)者隊(duì)列中ABA 問(wèn)題帶來(lái)的不利影響[10]。
系統(tǒng)硬件主要由核心板和功能擴(kuò)展板兩部分組成,功能口展板搭載CAN 數(shù)據(jù)采集模塊與數(shù)據(jù)存儲(chǔ)模塊。CAN 總線數(shù)據(jù)采集系統(tǒng)工作時(shí)作為CAN 節(jié)點(diǎn)接入總線中,對(duì)車輛CAN 總線上的電子設(shè)備進(jìn)行監(jiān)聽(tīng)并采集存儲(chǔ)車輛在運(yùn)行過(guò)程中所產(chǎn)生的數(shù)據(jù)信息。系統(tǒng)中的Micro SD 卡可隨時(shí)取出,用于PC 端讀取數(shù)據(jù)。系統(tǒng)硬件總體設(shè)計(jì)框圖如圖1 所示。
圖1 系統(tǒng)硬件總體設(shè)計(jì)框圖
邏輯控制單元作為整個(gè)系統(tǒng)的核心,控制協(xié)調(diào)著系統(tǒng)中各個(gè)模塊之間的關(guān)系與系統(tǒng)運(yùn)行的穩(wěn)定。因此,選擇合適的主控芯片至關(guān)重要。通過(guò)對(duì)比調(diào)研,針對(duì)該系統(tǒng)功能明確、所用外設(shè)資源少的特點(diǎn),綜合各種因素,最終選擇STM32F103ZET6 芯片作為主控芯片,其性能可以保證邏輯程序的流暢性。該系列外設(shè)類型、數(shù)量豐富,具有良好的擴(kuò)展能力。其中,CAN 接口是ST 公司為汽車領(lǐng)域應(yīng)用專門增加的汽車總線接口,支持CAN2.0B 接口標(biāo)準(zhǔn)。
1)CAN 數(shù)據(jù)采集模塊
主控設(shè)備采集到的CAN 信號(hào)通過(guò)外部CAN 收發(fā)器將電壓差動(dòng)信號(hào)轉(zhuǎn)化為數(shù)字信號(hào)之后,將CAN報(bào)文以數(shù)字信號(hào)的形式存在到指定的郵箱內(nèi)[11]。TJA1042 作為一款高速CAN 收發(fā)器,可為CAN 控制器提供差動(dòng)發(fā)送與接收功能,最高傳輸輸出達(dá)1 Mbit/s,完全符合ISO 11898-2 標(biāo)準(zhǔn)。
根據(jù)CAN 節(jié)點(diǎn)組成關(guān)系,CAN 數(shù)據(jù)采集單元電路設(shè)計(jì)如圖2 所示。為保證通信過(guò)程中的信號(hào)穩(wěn)定性,采用在電路中加上較小電容的共模電感L3來(lái)抑制干擾。電阻R42、R43、R342為CAN 總線在高速通信時(shí)提供一個(gè)阻抗以避免回?fù)芨蓴_。
圖2 CAN數(shù)據(jù)采集單元電路圖
2)數(shù)據(jù)存儲(chǔ)模塊
由于CAN 總線上數(shù)據(jù)傳輸量大、傳輸速率快,在對(duì)接收到的CAN 總線數(shù)據(jù)進(jìn)行存儲(chǔ)時(shí)采用Micro SD 卡作為外部設(shè)存儲(chǔ)設(shè)備,Micro SD 卡支持兩種讀寫方式,即SPI 模式與SDIO 模式。在SPI 模式下,主從機(jī)之間只有一條數(shù)據(jù)線用于數(shù)據(jù)傳輸,其傳輸速率為1~2 MB/s。但SDIO 模式允許四線的高速數(shù)據(jù)傳輸,單線傳輸速率可達(dá)到2 MB/s。文中設(shè)計(jì)選擇采用SDIO 模式四線高速數(shù)據(jù)傳輸方式[12]。
CAN 數(shù)據(jù)采集功能的實(shí)現(xiàn)需要完成對(duì)主控芯片內(nèi)部CAN 控制器初始化、CAN 中斷接收進(jìn)行相應(yīng)的程序設(shè)計(jì)。
1)CAN 控制器初始化
CAN 控制器初始化通過(guò)功能配置函數(shù)操作CAN控制器寄存器、CAN 郵箱寄存器、CAN 篩選器等三大類寄存器,對(duì)CAN 總線工作模式、波特率及濾波器等進(jìn)行配置,為CAN 總線數(shù)據(jù)接收工作準(zhǔn)備好環(huán)境。具體流程圖如圖3 所示。
圖3 CAN控制器初始化流程圖
由于CAN 總線網(wǎng)絡(luò)上掛載的節(jié)點(diǎn)數(shù)量多、總線數(shù)據(jù)傳輸量大。為了保證數(shù)據(jù)在采集時(shí)不丟失,無(wú)關(guān)信息對(duì)采集產(chǎn)生干擾,在接收方面CAN 控制器具有兩個(gè)三級(jí)FIFO 緩沖結(jié)構(gòu)。此外,在CAN 控制器中包含時(shí)間觸發(fā)機(jī)制,可以為采集到的數(shù)據(jù)提供時(shí)間戳信息。
2)CAN 接收中斷處理
從CAN 總線上接收到的數(shù)據(jù)幀經(jīng)過(guò)篩選器篩選,通過(guò)FIFO 觸發(fā)接收中斷進(jìn)入中斷函數(shù),在中斷服務(wù)中識(shí)別產(chǎn)生中斷的FIFO,讀取相應(yīng)的數(shù)據(jù),再將接收到的CAN 報(bào)文數(shù)據(jù)存入到已經(jīng)初始化的數(shù)據(jù)結(jié)構(gòu)體當(dāng)中。
CAN 總線數(shù)據(jù)的存儲(chǔ)功能主要基于FatFS 文件系統(tǒng)進(jìn)行開(kāi)發(fā),與常規(guī)的裸機(jī)直接操作Micro SD 卡相比,利用FatFS 文件系統(tǒng)模塊可以對(duì)Micro SD 的物理地址進(jìn)行高效統(tǒng)一的管理,所存儲(chǔ)的文件可以隨時(shí)在PC 端使用。而裸機(jī)程序操作Micro SD 卡直接將數(shù)據(jù)寫入物理內(nèi)存,查找困難,電腦等其他設(shè)備也無(wú)法讀取所存儲(chǔ)的信息。
1)Micro SD 卡
Micro SD 卡與主控芯片之間的命令交互需要通過(guò)CMD 引腳實(shí)現(xiàn)。在對(duì)Micro SD 卡進(jìn)行讀寫操作之前,需要對(duì)其進(jìn)行初始化,完成各項(xiàng)參數(shù)配置。Micro SD 介入后,自動(dòng)進(jìn)入等待電壓穩(wěn)定需上電延時(shí)至少74 個(gè)時(shí)鐘周期[13]。Micro SD 卡初始化完成之后,對(duì)其進(jìn)行讀寫操作,將采集到的CAN 總線數(shù)據(jù)寫入到Micro SD 卡中。
2)FatFS 文件系統(tǒng)移植
FatFS 文件系統(tǒng)在移植的過(guò)程中需要用到六個(gè)文件:diskio.c、dickio.h、ff.c、ff.h、integer.h 與ffconf.h[14],其中,integer.h 中定義了FatFS 所使用的各種數(shù)據(jù)類型;ffcinf.h 是關(guān)于FatFS 文件系統(tǒng)模塊的相關(guān)配置;diskio.c 與dickio.h 包含了FatFS 所規(guī)定的標(biāo)準(zhǔn)函數(shù)接口;ff.c 與ff.h 為標(biāo)準(zhǔn)文件,為應(yīng)用程序提供標(biāo)準(zhǔn)文件操作接口,使用時(shí)只需調(diào)用相關(guān)接口即可。在移植時(shí),只需要根據(jù)具體需求更改diskio.c 與ffconf.h 兩個(gè)文件。其移植主要分為以下三個(gè)步驟:
1)在integer.h 文件內(nèi)根據(jù)需求對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行定義;
2)根據(jù)具體功能需求,通過(guò)ffconf.h 配置FatFS文件系統(tǒng)相關(guān)模塊;
3)調(diào)用diskio.c 中六個(gè)函數(shù)接口,進(jìn)行底層驅(qū)動(dòng)編寫,完成相關(guān)功能函數(shù)編寫。
通過(guò)上述三步完成FatFS 文件系統(tǒng)移植。FatFS文件系統(tǒng)完成移植后,只需要根據(jù)具體需求調(diào)用相關(guān)函數(shù)即可實(shí)現(xiàn)相關(guān)功能。
在應(yīng)用文中設(shè)計(jì)的系統(tǒng)時(shí),CAN 數(shù)據(jù)報(bào)文最終以CANlog 格式存儲(chǔ),在采集、存儲(chǔ)數(shù)據(jù)報(bào)文時(shí),需要對(duì)報(bào)文信息進(jìn)行逐條處理,廣義上屬于日志處理范疇[15-16]。同時(shí),當(dāng)CAN 總線上的報(bào)文數(shù)據(jù)量激增時(shí),系統(tǒng)需具備處理大流量數(shù)據(jù)的能力。結(jié)合FIFO 隊(duì)列自身特點(diǎn)與應(yīng)用場(chǎng)景大數(shù)據(jù)量的特性,在設(shè)計(jì)開(kāi)發(fā)時(shí)將FIFO 隊(duì)列融入到數(shù)據(jù)采集、存儲(chǔ)功能當(dāng)中,并對(duì)其進(jìn)行適應(yīng)性改進(jìn),提出了無(wú)鎖FIFO 隊(duì)列。當(dāng)總線數(shù)據(jù)量較小時(shí),自適應(yīng)地減小隊(duì)列大小,以減少系統(tǒng)資源占用;當(dāng)總線數(shù)據(jù)量激增時(shí),則自適應(yīng)地增加隊(duì)列大小,以避免數(shù)據(jù)丟失。無(wú)鎖FIFO 隊(duì)列算法原理如圖4 所示。
圖4 無(wú)鎖FIFO隊(duì)列算法原理
系統(tǒng)采集到CAN 總線上產(chǎn)生的報(bào)文數(shù)據(jù)之后,觸發(fā)硬件外部中斷,報(bào)文數(shù)據(jù)作為隊(duì)列元素臨時(shí)存入到無(wú)鎖FIFO 隊(duì)列當(dāng)中,完成入隊(duì)操作,此過(guò)程通過(guò)系統(tǒng)硬件設(shè)備采集數(shù)據(jù)來(lái)激活系統(tǒng)軟件功能。隊(duì)列中被臨時(shí)存入數(shù)據(jù)時(shí),系統(tǒng)會(huì)自動(dòng)將隊(duì)列中臨時(shí)存儲(chǔ)的數(shù)據(jù)通過(guò)FatFs 文件系統(tǒng)以標(biāo)準(zhǔn)CANLog 格式寫入到Micro SD 卡中,完成出隊(duì)與存儲(chǔ)操作。在入隊(duì)、出隊(duì)操作時(shí),系統(tǒng)會(huì)根據(jù)數(shù)據(jù)量的大小自動(dòng)調(diào)整隊(duì)列大小,其數(shù)據(jù)存儲(chǔ)流程如圖5 所示。
圖5 數(shù)據(jù)存儲(chǔ)流程圖
文中將對(duì)所開(kāi)發(fā)的CAN 總線數(shù)據(jù)采集系統(tǒng)進(jìn)行相應(yīng)功能驗(yàn)證,主要以室內(nèi)實(shí)驗(yàn)為主,以此對(duì)該系統(tǒng)進(jìn)行初步功能驗(yàn)證。此方法也是設(shè)備研究開(kāi)發(fā)過(guò)程中的主要測(cè)試方法,避免試車測(cè)試過(guò)程中繁瑣的安裝流程,提高開(kāi)發(fā)效率。
在CAN 總線數(shù)據(jù)采集系統(tǒng)功能驗(yàn)證實(shí)驗(yàn)中,模擬發(fā)送不同ID 的實(shí)車數(shù)據(jù)報(bào)文,發(fā)送周期為100 ms,表2 為PC 端模擬發(fā)送數(shù)據(jù),圖6 為Micro SD 卡中讀取數(shù)據(jù)。通過(guò)對(duì)比表2 與圖6 中的報(bào)文主要信息可知,CAN 總線數(shù)據(jù)采集系統(tǒng)所存儲(chǔ)的數(shù)據(jù)完全正確,且無(wú)數(shù)據(jù)丟失現(xiàn)象。
圖6 存儲(chǔ)數(shù)據(jù)讀取
表2 實(shí)車模擬數(shù)據(jù)報(bào)文
通過(guò)在測(cè)試實(shí)驗(yàn)中加入對(duì)無(wú)鎖FIFO 隊(duì)列的功能驗(yàn)證,進(jìn)一步證明無(wú)鎖FIFO 隊(duì)列可避免數(shù)據(jù)丟失問(wèn)題。在所有實(shí)驗(yàn)條件不變的情況下,分別使用有、無(wú)鎖FIFO 隊(duì)列系統(tǒng)進(jìn)行模擬實(shí)車數(shù)據(jù)采集,所采集的數(shù)據(jù)對(duì)比如圖7 所示。以第一輪采集到所有模擬發(fā)送的不同ID 實(shí)車數(shù)據(jù)報(bào)文為例,使用無(wú)鎖FIFO 隊(duì)列的系統(tǒng)采集到全部ID 的報(bào)文,沒(méi)有使用無(wú)鎖FIFO隊(duì)列的系統(tǒng)存在丟幀現(xiàn)象,說(shuō)明CAN 總線數(shù)據(jù)采集系統(tǒng)具有一定可行性。
圖7 存儲(chǔ)數(shù)據(jù)對(duì)比
文中結(jié)合無(wú)鎖FIFO 隊(duì)列,針對(duì)CAN 總線數(shù)據(jù)量大的特點(diǎn),設(shè)計(jì)開(kāi)發(fā)了基于無(wú)鎖FIFO 隊(duì)列的CAN 總線數(shù)據(jù)采集系統(tǒng)。其具有以下優(yōu)勢(shì):
1)系統(tǒng)運(yùn)用無(wú)鎖FIFO 隊(duì)列算法,可根據(jù)CAN 總線上數(shù)據(jù)量的大小自適應(yīng)地調(diào)整隊(duì)列緩沖區(qū)的大小,可避免在實(shí)車數(shù)據(jù)采集過(guò)程中的丟幀現(xiàn)象,完成采集總線實(shí)車數(shù)據(jù)。
2)該系統(tǒng)無(wú)需人工跟車操作,實(shí)現(xiàn)脫離PC 端獨(dú)立采集實(shí)車數(shù)據(jù),簡(jiǎn)化數(shù)據(jù)采集流程。系統(tǒng)中搭載FatFs 文件系統(tǒng),將總線數(shù)據(jù)以標(biāo)準(zhǔn)格式存儲(chǔ)于Micro SD 卡,生成的文件具有一定通用性,可在PC端相關(guān)軟件中直接讀取。