郭健忠,田瀟寒,謝 斌,杜新寶,胡文龍
(1.武漢科技大學汽車與交通工程學院,湖北武漢 430065;2.武漢保華顯示科技有限公司,湖北 武漢 430082)
CAN(Controller Area Network)總線作為目前唯一具有國際標準的現場總線,其以數據在通信過程中突出的可靠性、實時性和靈活性,被作為車載控制器之間的主要通信網絡[1]。CAN 總線上的報文數據不僅記錄了汽車的實時運行狀態,而且可以反映出汽車行駛過程中的各種問題[2]。采集和使用好實車數據,可以給車輛檢測、故障診斷與汽車相關產品開發等帶來正面影響,其中完整的實車數據可為車輛檢測與故障診斷提供全面客觀的數據依據,同時運用完整的實車數據可以在開發過程中對車載電子嵌入式設備進行多工況模擬測試[3],模擬汽車真實運行環境,發現車載電子嵌入式設備開發設計中的不足,提出改進思路,形成分析-改進-分析的閉環設計過程[4]。針對目前CAN 總線數據記錄儀在CAN 總線數據量大的應用場景下存在數據丟幀,所采集的數據內容無法為車輛檢測與車載電子嵌入式開發提供完整可靠的數據支持,以及人工操作PC 搭配CAN 分析儀采集實車數據流程繁瑣的問題[5-6],有必要設計一種可以完整采集總線實車數據、操作簡單的CAN總線數據采集方案。
文中所設計開發的系統主要實現數據采集和數據存儲兩種功能[7]。
1)CAN 總線報文數據采集:車載設備產生的數據信息通過CAN 總線進行通信,設計的系統將采集監聽到的總線數據信息。
2)采集數據固定格式存儲:系統主控芯片將采集到的CAN 總線數據以既定格式寫入Micro SD 卡中進行存儲。
文中的CAN 總線數據采集系統以CAN 節點的形式加入車載CAN 總線中,并對總線中產生的CAN報文數據進行監聽、采集與記錄。當采集系統監聽到總線上有CAN 報文數據時,自動觸發系統中斷,并將實時采集的數據暫存在無鎖FIFO 隊列中,隊列依據數據量的多少自動調節隊列大小,在保證總線數據存儲無誤的同時改變系統資源占用。系統控制單元將隊列內的數據依次取出并將其以標準CANLog 格式存儲到Micro SD 卡中。最終從Micro SD 卡中導出相應數據,為車載電子嵌入式開發、測試等提供實車數據支持。
無鎖FIFO 隊列作為一種受限制線性表,具有只允許在隊列的前端進行刪除操作,而在隊列的后端進行插入操作的特殊性。也是因為此特性,最早進入隊列的元素才能最先從隊列中刪除,即先進先出[8]。由于隊列只有一端可以進行插入操作,故隊列中的每一個元素都是按照先后順序排列的。根據以上特點,無鎖FIFO 隊列在實際應用中常用于流量削峰、日志處理場等景中[9]。文中所設計的CAN 總線數據采集系統屬于單生產者單消費者問題,不涉及多生產者多消費者情況,可避免多生產者多消費者隊列中ABA 問題帶來的不利影響[10]。
系統硬件主要由核心板和功能擴展板兩部分組成,功能口展板搭載CAN 數據采集模塊與數據存儲模塊。CAN 總線數據采集系統工作時作為CAN 節點接入總線中,對車輛CAN 總線上的電子設備進行監聽并采集存儲車輛在運行過程中所產生的數據信息。系統中的Micro SD 卡可隨時取出,用于PC 端讀取數據。系統硬件總體設計框圖如圖1 所示。

圖1 系統硬件總體設計框圖
邏輯控制單元作為整個系統的核心,控制協調著系統中各個模塊之間的關系與系統運行的穩定。因此,選擇合適的主控芯片至關重要。通過對比調研,針對該系統功能明確、所用外設資源少的特點,綜合各種因素,最終選擇STM32F103ZET6 芯片作為主控芯片,其性能可以保證邏輯程序的流暢性。該系列外設類型、數量豐富,具有良好的擴展能力。其中,CAN 接口是ST 公司為汽車領域應用專門增加的汽車總線接口,支持CAN2.0B 接口標準。
1)CAN 數據采集模塊
主控設備采集到的CAN 信號通過外部CAN 收發器將電壓差動信號轉化為數字信號之后,將CAN報文以數字信號的形式存在到指定的郵箱內[11]。TJA1042 作為一款高速CAN 收發器,可為CAN 控制器提供差動發送與接收功能,最高傳輸輸出達1 Mbit/s,完全符合ISO 11898-2 標準。
根據CAN 節點組成關系,CAN 數據采集單元電路設計如圖2 所示。為保證通信過程中的信號穩定性,采用在電路中加上較小電容的共模電感L3來抑制干擾。電阻R42、R43、R342為CAN 總線在高速通信時提供一個阻抗以避免回撥干擾。

圖2 CAN數據采集單元電路圖
2)數據存儲模塊
由于CAN 總線上數據傳輸量大、傳輸速率快,在對接收到的CAN 總線數據進行存儲時采用Micro SD 卡作為外部設存儲設備,Micro SD 卡支持兩種讀寫方式,即SPI 模式與SDIO 模式。在SPI 模式下,主從機之間只有一條數據線用于數據傳輸,其傳輸速率為1~2 MB/s。但SDIO 模式允許四線的高速數據傳輸,單線傳輸速率可達到2 MB/s。文中設計選擇采用SDIO 模式四線高速數據傳輸方式[12]。
CAN 數據采集功能的實現需要完成對主控芯片內部CAN 控制器初始化、CAN 中斷接收進行相應的程序設計。
1)CAN 控制器初始化
CAN 控制器初始化通過功能配置函數操作CAN控制器寄存器、CAN 郵箱寄存器、CAN 篩選器等三大類寄存器,對CAN 總線工作模式、波特率及濾波器等進行配置,為CAN 總線數據接收工作準備好環境。具體流程圖如圖3 所示。

圖3 CAN控制器初始化流程圖
由于CAN 總線網絡上掛載的節點數量多、總線數據傳輸量大。為了保證數據在采集時不丟失,無關信息對采集產生干擾,在接收方面CAN 控制器具有兩個三級FIFO 緩沖結構。此外,在CAN 控制器中包含時間觸發機制,可以為采集到的數據提供時間戳信息。
2)CAN 接收中斷處理
從CAN 總線上接收到的數據幀經過篩選器篩選,通過FIFO 觸發接收中斷進入中斷函數,在中斷服務中識別產生中斷的FIFO,讀取相應的數據,再將接收到的CAN 報文數據存入到已經初始化的數據結構體當中。
CAN 總線數據的存儲功能主要基于FatFS 文件系統進行開發,與常規的裸機直接操作Micro SD 卡相比,利用FatFS 文件系統模塊可以對Micro SD 的物理地址進行高效統一的管理,所存儲的文件可以隨時在PC 端使用。而裸機程序操作Micro SD 卡直接將數據寫入物理內存,查找困難,電腦等其他設備也無法讀取所存儲的信息。
1)Micro SD 卡
Micro SD 卡與主控芯片之間的命令交互需要通過CMD 引腳實現。在對Micro SD 卡進行讀寫操作之前,需要對其進行初始化,完成各項參數配置。Micro SD 介入后,自動進入等待電壓穩定需上電延時至少74 個時鐘周期[13]。Micro SD 卡初始化完成之后,對其進行讀寫操作,將采集到的CAN 總線數據寫入到Micro SD 卡中。
2)FatFS 文件系統移植
FatFS 文件系統在移植的過程中需要用到六個文件:diskio.c、dickio.h、ff.c、ff.h、integer.h 與ffconf.h[14],其中,integer.h 中定義了FatFS 所使用的各種數據類型;ffcinf.h 是關于FatFS 文件系統模塊的相關配置;diskio.c 與dickio.h 包含了FatFS 所規定的標準函數接口;ff.c 與ff.h 為標準文件,為應用程序提供標準文件操作接口,使用時只需調用相關接口即可。在移植時,只需要根據具體需求更改diskio.c 與ffconf.h 兩個文件。其移植主要分為以下三個步驟:
1)在integer.h 文件內根據需求對數據結構進行定義;
2)根據具體功能需求,通過ffconf.h 配置FatFS文件系統相關模塊;
3)調用diskio.c 中六個函數接口,進行底層驅動編寫,完成相關功能函數編寫。
通過上述三步完成FatFS 文件系統移植。FatFS文件系統完成移植后,只需要根據具體需求調用相關函數即可實現相關功能。
在應用文中設計的系統時,CAN 數據報文最終以CANlog 格式存儲,在采集、存儲數據報文時,需要對報文信息進行逐條處理,廣義上屬于日志處理范疇[15-16]。同時,當CAN 總線上的報文數據量激增時,系統需具備處理大流量數據的能力。結合FIFO 隊列自身特點與應用場景大數據量的特性,在設計開發時將FIFO 隊列融入到數據采集、存儲功能當中,并對其進行適應性改進,提出了無鎖FIFO 隊列。當總線數據量較小時,自適應地減小隊列大小,以減少系統資源占用;當總線數據量激增時,則自適應地增加隊列大小,以避免數據丟失。無鎖FIFO 隊列算法原理如圖4 所示。

圖4 無鎖FIFO隊列算法原理
系統采集到CAN 總線上產生的報文數據之后,觸發硬件外部中斷,報文數據作為隊列元素臨時存入到無鎖FIFO 隊列當中,完成入隊操作,此過程通過系統硬件設備采集數據來激活系統軟件功能。隊列中被臨時存入數據時,系統會自動將隊列中臨時存儲的數據通過FatFs 文件系統以標準CANLog 格式寫入到Micro SD 卡中,完成出隊與存儲操作。在入隊、出隊操作時,系統會根據數據量的大小自動調整隊列大小,其數據存儲流程如圖5 所示。

圖5 數據存儲流程圖
文中將對所開發的CAN 總線數據采集系統進行相應功能驗證,主要以室內實驗為主,以此對該系統進行初步功能驗證。此方法也是設備研究開發過程中的主要測試方法,避免試車測試過程中繁瑣的安裝流程,提高開發效率。
在CAN 總線數據采集系統功能驗證實驗中,模擬發送不同ID 的實車數據報文,發送周期為100 ms,表2 為PC 端模擬發送數據,圖6 為Micro SD 卡中讀取數據。通過對比表2 與圖6 中的報文主要信息可知,CAN 總線數據采集系統所存儲的數據完全正確,且無數據丟失現象。

圖6 存儲數據讀取

表2 實車模擬數據報文
通過在測試實驗中加入對無鎖FIFO 隊列的功能驗證,進一步證明無鎖FIFO 隊列可避免數據丟失問題。在所有實驗條件不變的情況下,分別使用有、無鎖FIFO 隊列系統進行模擬實車數據采集,所采集的數據對比如圖7 所示。以第一輪采集到所有模擬發送的不同ID 實車數據報文為例,使用無鎖FIFO 隊列的系統采集到全部ID 的報文,沒有使用無鎖FIFO隊列的系統存在丟幀現象,說明CAN 總線數據采集系統具有一定可行性。

圖7 存儲數據對比
文中結合無鎖FIFO 隊列,針對CAN 總線數據量大的特點,設計開發了基于無鎖FIFO 隊列的CAN 總線數據采集系統。其具有以下優勢:
1)系統運用無鎖FIFO 隊列算法,可根據CAN 總線上數據量的大小自適應地調整隊列緩沖區的大小,可避免在實車數據采集過程中的丟幀現象,完成采集總線實車數據。
2)該系統無需人工跟車操作,實現脫離PC 端獨立采集實車數據,簡化數據采集流程。系統中搭載FatFs 文件系統,將總線數據以標準格式存儲于Micro SD 卡,生成的文件具有一定通用性,可在PC端相關軟件中直接讀取。