馮海明, 王 波, 張 健, 陳 強(qiáng), 李海海, 黃玉鵬
(中通客車控股股份有限公司,山東 聊城 252000)
整車控制器VCU是電動(dòng)客車的核心零部件之一,其可以根據(jù)駕駛員的加速踏板、制動(dòng)踏板和方向盤等信號(hào)實(shí)現(xiàn)整車的驅(qū)動(dòng)控制,還可以進(jìn)行制動(dòng)能量回收及對(duì)各子系統(tǒng)進(jìn)行故障診斷管理等[1-2]。在以TriCore1872微控制器作為載體設(shè)計(jì)VCU過(guò)程中,由于邏輯策略需要不斷修改,因此需要進(jìn)行反復(fù)的程序燒寫及更新。一般升級(jí)過(guò)程中,開發(fā)人員需要通過(guò)攜帶串口線及頻繁的上下電才能完成對(duì)整車控制器程序的下載及升級(jí)。刷寫燒寫過(guò)程比較繁瑣,降低了程序升級(jí)的效率。因此,本文開發(fā)一種基于CAN在線程序刷寫的方法,利用VCU現(xiàn)有的CAN通訊方式對(duì)其進(jìn)行在線編程升級(jí),通過(guò)開發(fā)BootLoader的程序引導(dǎo)與終端PC相結(jié)合,即可實(shí)現(xiàn)控制器程序在線更新。
BootLoader是VCU系統(tǒng)上電后應(yīng)用程序執(zhí)行前最早運(yùn)行的一段引導(dǎo)代碼程序[3-4]。其主要作用是硬件設(shè)備初始化及內(nèi)存映射等。以某款自主開發(fā)的VCU為例,在進(jìn)行CAN在線程序升級(jí)時(shí),首先需要在線更新BootLoader,然后等待BootLoader進(jìn)入下載模式,最后再通過(guò)CAN網(wǎng)絡(luò)從上位機(jī)中下載應(yīng)用程序。
基于英飛凌32位TC1872內(nèi)核微控制器的VCU作為下位機(jī),基于VS開發(fā)工具的PC為上位機(jī)。目標(biāo)VCU是英飛凌汽車級(jí)單片機(jī),時(shí)鐘頻率為180 MHz,具有3路完全獨(dú)立的高速CAN驅(qū)動(dòng),支持CAN下載及在線調(diào)試模式。上位機(jī)PC與下位機(jī)的數(shù)據(jù)通訊選用USB CAN卡實(shí)現(xiàn)。
整個(gè)CAN在線刷寫系統(tǒng)主要由VCU端、USB CAN卡、PC上位機(jī)3部分組成。其中,CAN卡實(shí)現(xiàn)PC上位機(jī)與VCU端之間的通信連接,用來(lái)傳輸指令與數(shù)據(jù);PC上位機(jī)是基于VS工具的MFC框架進(jìn)行開發(fā)。
VCU端系統(tǒng)上電或復(fù)位后,應(yīng)用層程序在main函數(shù)中會(huì)周期性地調(diào)用底層can_prog_ack()函數(shù)。該函數(shù)主要用于內(nèi)存地址的跳轉(zhuǎn)、握手密鑰的解析及密鑰接收超時(shí)處理。當(dāng)VCU解析到密鑰報(bào)文數(shù)據(jù)域中第五個(gè)字節(jié)為0x38時(shí),即進(jìn)入在線程序升級(jí)模式;若不進(jìn)行應(yīng)用程序的升級(jí),則跳轉(zhuǎn)到0x0E00000處。在上位機(jī)發(fā)送BootLoader的長(zhǎng)度后,VCU返回握手成功,在BootLoader升級(jí)完成后,VCU會(huì)立即返回該BootLoader的版本號(hào),通過(guò)該版本號(hào)進(jìn)行BootLoader升級(jí)是否成功的校驗(yàn)判據(jù)。BootLoader升級(jí)成功后,VCU發(fā)送請(qǐng)求用戶代碼信號(hào),上位機(jī)接收到該信號(hào)后,開始下發(fā)應(yīng)用程序代碼長(zhǎng)度。VCU接收到上位機(jī)下發(fā)應(yīng)用程序代碼長(zhǎng)度數(shù)據(jù)幀后,調(diào)用Flash擦除函數(shù)進(jìn)行扇區(qū)的擦除并返回相應(yīng)的數(shù)據(jù)幀報(bào)文。擦除完畢后,PC上位機(jī)正式進(jìn)入應(yīng)用程序數(shù)據(jù)域的下發(fā),VCU接收到數(shù)據(jù)幀后由CAN命令函數(shù)處理解析各個(gè)數(shù)據(jù)包,并將數(shù)據(jù)寫入到相應(yīng)的Flash扇區(qū)中,同時(shí)VCU會(huì)返回剩余扇區(qū)數(shù),VCU每接收到32幀數(shù)據(jù),就進(jìn)行一次數(shù)據(jù)校驗(yàn)。直至最后接收全部數(shù)據(jù)后再進(jìn)行應(yīng)用程序數(shù)據(jù)總和的校驗(yàn),校驗(yàn)結(jié)束無(wú)誤后上位機(jī)會(huì)發(fā)送VCU重啟指令,VCU接收到該P(yáng)C下發(fā)的重啟指令后,自動(dòng)跳轉(zhuǎn)執(zhí)行新的應(yīng)用程序。
2.2.1 HEX文件轉(zhuǎn)Bin文件
在Tasking中經(jīng)過(guò)編譯生成的是HEX文件,PC端上位機(jī)主要為VCU提供加載該升級(jí)程序代碼。HEX文件是ASCII的記錄文本文件,在HEX文件中,每一行是一個(gè)HEX記錄,包括數(shù)據(jù)長(zhǎng)度域、地址域、記錄類型域、數(shù)據(jù)域及校驗(yàn)和域[5-7]。上位機(jī)在發(fā)送應(yīng)用程序時(shí)為了保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性,需要按照地址高低順序進(jìn)行傳輸,但是HEX文件中數(shù)據(jù)記錄并不是按照起始地址到終止地址的順序進(jìn)行排列的,由于每行數(shù)據(jù)都包含起始地址和數(shù)據(jù)長(zhǎng)度,所以HEX文件中數(shù)據(jù)不需要按照地址順序從低到高進(jìn)行排列;而Bin文件中的數(shù)據(jù)則是嚴(yán)格按照地址順序進(jìn)行排列。因此,需要將HEX文件的內(nèi)容轉(zhuǎn)換成按地址順序從低到高排列的二進(jìn)制數(shù)據(jù)Bin文件[8-10]。
轉(zhuǎn)換過(guò)程主要分為4步:第一,打開HEX文件后通過(guò)遍歷整個(gè)HEX文件,找出起始地址和終止地址,然后根據(jù)終止地址和起始地址相減算出數(shù)據(jù)長(zhǎng)度,用得到的數(shù)據(jù)長(zhǎng)度開辟相應(yīng)的數(shù)組進(jìn)行內(nèi)存的分配[11-12];第二,再次遍歷整個(gè)HEX文件,計(jì)算每條數(shù)據(jù)記錄中的起始地址與HEX文件起始地址的偏移量,按照偏移量將該條數(shù)據(jù)記錄中的數(shù)據(jù)部分寫入剛開辟的數(shù)組中;第三,遍歷保存完的數(shù)組,判定是否與目標(biāo)VCU程序相匹配;第四,將該數(shù)組寫到文件中。
2.2.2 主從機(jī)通信協(xié)議
主從機(jī)數(shù)據(jù)傳輸與命令交互采用自定義的CAN通信協(xié)議,協(xié)議具體內(nèi)容見表1。
表1 主從機(jī)通信協(xié)議
2.2.3 功能設(shè)計(jì)需求
PC端上位機(jī)界面的具體功能需求如下:
1) 設(shè)置CAN波特率、CAN通道、報(bào)文間隔發(fā)送周期。
2) 打開CAN設(shè)備并能正常接收CAN報(bào)文數(shù)據(jù),能根據(jù)路徑打開需要發(fā)送的HEX文件,并將文件自動(dòng)轉(zhuǎn)換成Bin文件,發(fā)送完成后發(fā)送重啟VCU指令。
3) 數(shù)據(jù)通信相關(guān)信息顯示在編輯框中,并實(shí)時(shí)顯示程序更新狀態(tài)。
4) 具備重刷及設(shè)備重啟功能。
2.2.4 關(guān)鍵功能模塊設(shè)計(jì)
1) 數(shù)據(jù)發(fā)送、校驗(yàn)。CAN報(bào)文的發(fā)送通過(guò)CAN卡提供的庫(kù)函數(shù)實(shí)現(xiàn)。由于HEX文件的下發(fā)需要通過(guò)路徑打開并進(jìn)行讀取和轉(zhuǎn)換才能進(jìn)行發(fā)送,所以報(bào)文數(shù)據(jù)的發(fā)送分為報(bào)文的填充和報(bào)文的發(fā)送。32位程序燒寫,每發(fā)送32幀數(shù)據(jù)校驗(yàn)一次,全部發(fā)送完畢后再進(jìn)行總和校驗(yàn),由于VCU會(huì)返回剩余的扇區(qū)數(shù),所以數(shù)據(jù)發(fā)送完后,程序會(huì)自動(dòng)停止。
2) 數(shù)據(jù)的接收。CAN報(bào)文的接收通過(guò)接收數(shù)據(jù)線程,在線程中調(diào)用自定義的接收函數(shù),該接收函數(shù)會(huì)校驗(yàn)接收ID并返回相應(yīng)狀態(tài)值。
3) 數(shù)據(jù)收發(fā)信息顯示。數(shù)據(jù)發(fā)送、接收時(shí)會(huì)觸發(fā)設(shè)定的data_show_add函數(shù),在該函數(shù)中,數(shù)據(jù)會(huì)被加載及顯示在編輯框中。
2.2.5 PC端上位機(jī)界面及發(fā)送流程
打開通過(guò)VS開發(fā)設(shè)計(jì)的PC端上位機(jī)軟件后,在界面上選擇相應(yīng)的CAN通道及波特率,點(diǎn)擊“連接”按鈕,此時(shí)編輯框會(huì)顯示設(shè)備開啟成功信息,通過(guò)“文件路徑”按鈕加載生成HEX文件,然后會(huì)彈出是否刷寫該HEX文件的提示框,點(diǎn)擊“確定”按鈕,開始進(jìn)行BootLoader的燒寫,燒寫完后自動(dòng)進(jìn)行應(yīng)用程序的燒寫,燒寫過(guò)程中,VCU會(huì)返回校驗(yàn)數(shù)據(jù),確保傳輸數(shù)據(jù)的真實(shí)性與完整性。當(dāng)全部應(yīng)用程序下載完后,進(jìn)度條會(huì)顯示100%,VCU自動(dòng)進(jìn)入重啟,編輯框顯示程序刷寫成功及當(dāng)前程序版本,整個(gè)應(yīng)用程序更新過(guò)程完成。
本文設(shè)計(jì)的基于CAN在線VCU程序升級(jí)系統(tǒng)在某8 m純電動(dòng)客車上進(jìn)行實(shí)車驗(yàn)證。首先系統(tǒng)上電后用CAN卡設(shè)備連接VCU與PC上位機(jī),然后上位機(jī)進(jìn)行相關(guān)操作,經(jīng)過(guò)約20 s完成對(duì)VCU程序的升級(jí),升級(jí)后VCU自動(dòng)重啟,程序運(yùn)行正常。
運(yùn)行結(jié)果表明,該系統(tǒng)進(jìn)行VCU程序升級(jí)時(shí),整個(gè)過(guò)程快速穩(wěn)定,更新升級(jí)后VCU程序運(yùn)行正常。
本文設(shè)計(jì)的基于CAN總線的VCU程序升級(jí)系統(tǒng)實(shí)現(xiàn)了VCU程序升級(jí)的快速性、準(zhǔn)確性及便捷性,提高了VCU程序更新效率。經(jīng)實(shí)車驗(yàn)證,該系統(tǒng)擦除Flash過(guò)程穩(wěn)定,CAN通信實(shí)時(shí)性高。該方法極大地方便了VCU程序的后期更新和維護(hù)。