CCP 協(xié)議是一種CAN 總線標定匹配協(xié)議。本文簡單介紹該協(xié)議的基本原理,以及一種基于該協(xié)議的汽車ECU 標定系統(tǒng)的實現(xiàn)方法。最后,結(jié)合MC9S12DP256 芯片以及μC/OS-II操作系統(tǒng),詳細討論了此標定系統(tǒng)的CCP 軟件實現(xiàn)方法。
1 前言
標定是指根據(jù)整車的各種性能要求(如動力性、經(jīng)濟性、排放及輔助功能等),來調(diào)整、優(yōu)化和確定整車上各ECU(包括發(fā)動機和各子系統(tǒng) ECU)的運行及控制參數(shù)的控制算法。通過標定系統(tǒng),能夠很方便的讀取 ECU 中的標定變量數(shù)據(jù)到標定平臺,并可以對這些數(shù)據(jù)進行編輯修改,編輯后的數(shù)據(jù)又可以寫入 ECU,從而達到修改 ECU 中標定參數(shù)的目的。功能完善且靈活方便的標定軟件對整個汽車ECU 控制系統(tǒng)的開發(fā)起到事半功倍的效果。目前,一般的標定系統(tǒng)都是采用基于串行口的點對點的通信方式,這種通信方式具有很大的局限性,而且通信協(xié)議都不一樣。在這個ECU 系統(tǒng)中,將采用 CAN 總線的通信方式和CCP(CAN Calibration Protocol)協(xié)議。
2 CCP 協(xié)議簡介
1996 年6 月,歐洲ASAP 項目組發(fā)布了現(xiàn)行的2.0 版,它采用CAN 2.0B(11 位或29位ID)進行MCS(measurement and calibration system)與ECU 之間的通信。該協(xié)議具有通用性強,適用范圍廣的特點,無論對8 位低速帶CAN 的控制器,還是32 位高速帶CAN 的控制器,均可滿足工作要求。基于CCP 協(xié)議的ECU 標定采用主-從通信方式,主設(shè)備通過CAN 總線與多個從設(shè)備相連,其中主設(shè)備是測量標定系統(tǒng)MCS(Measurement CalibrationSystem),從設(shè)備是需要標定的ECU。根據(jù)CCP 協(xié)議,主設(shè)備首先與其中一個從設(shè)備建立邏輯鏈接, 建立邏輯連接后,主、從機之間所有的數(shù)據(jù)傳遞均由主機控制,從機執(zhí)行主機命令后返回包含命令響應值或錯誤代碼等信息的報文。
3 標定系統(tǒng)的實現(xiàn)
3.1 上位機部分
友好的人機頁面對于標定工作的順利進行是起決定性作用的,此標定系統(tǒng)的設(shè)計克服了以往大多數(shù)標定系統(tǒng)只能通過鍵盤對標定數(shù)據(jù)進行修改的局限性,在標定系統(tǒng)中除了表格編輯方式外,還將引入圖形編輯方式。將標定變量數(shù)據(jù)轉(zhuǎn)換成圖形,將使標定員對于標定變量數(shù)據(jù)比如說修正曲線和 MAP 圖有一個更直觀了解,并且可以通過鼠標拖動對圖形進行編輯修改,從而達到編輯修改標定變量數(shù)據(jù)的目的,這樣大大方便了對于修正曲線和 MAP圖類型標定變量的編輯。
在這里我們是采用 Visual C++完成標定頁面的設(shè)計以及與下位機的通信。該標定系統(tǒng)除了具有對 ECU 的標定功能外,還引入了實時監(jiān)測功能,從而可以很快得到標定操作的返回信息。如圖所示,監(jiān)測界面主要完成各種監(jiān)測量數(shù)據(jù)的實時接收和顯示功能。測量得到的數(shù)據(jù)以數(shù)字和圖形兩種方式顯示出來,數(shù)據(jù)可以存儲。歷史數(shù)據(jù)可以從文件中讀出來,進行離線分析。標定界面則是完成標定變量數(shù)據(jù)的顯示、編輯修改以及上傳下載功能。根據(jù)變量的不同類型,變量數(shù)據(jù)分別以參量、二維、三維的形式表示。
圖 1 標定系統(tǒng)實現(xiàn)圖
3.2 底層ECU 部分
而底層 ECU 部分,標定系統(tǒng)在這里采用的是Freescale 公司的MC9S12DP256,這是一款16 位CPU 及0.25 微米、高速、高性能5.0V FLASH 存儲器技術(shù)的中檔芯片。它具有25MHz的主頻、256K 字節(jié)的FLASH 存儲器、16 通道的8 位A/D 轉(zhuǎn)換器以及多達5 個的高速CAN 控制器。其較高的性能價格比使其非常適合用于一些中高檔汽車電子系列相關(guān)產(chǎn)品。同時其較簡單的背景開發(fā)模式(BDM)使得開發(fā)成本進一步降低,也使得現(xiàn)場開發(fā)與系統(tǒng)升級變得更加方便。
需要標定的變量稱為標定參數(shù),標定定義也就是修改駐扎在ECU 內(nèi)存中的變量的內(nèi)容。根據(jù)標定參數(shù)所在不同地址空間( RAM、FLASH 或EEPROM) , 這里也就有了不同的標定方法。RAM EEPROM 標定的速度較塊,但RAM 和EEPROM 空間有限,所需的標定參數(shù)的數(shù)目也就受到了限制,而FLASH 空間較大,但標定的速度相對較慢。這里考慮選擇芯片的實際情況,選擇了FLASH 標定的方法。當標定參數(shù)需要存放在FLASH 中時, 在ECU 上電初始化后, 程序首先將標定參數(shù)的初始值復制到RAM 中, 在標定軟件中該段用來存放標定參數(shù)的RAM 稱為Calibration RAM。標定過程中, 標定軟件修改Calibration RAM 中的參數(shù)值。標定全部結(jié)束后, 再將該段RAM 中的內(nèi)容復制回FLASH 中。
4 軟件設(shè)計
標定系統(tǒng)的軟件設(shè)計主要分為二個部分:CAN Driver 和CCP Driver,而這二個部分都是基于μC/OS-II 這種實時操作系統(tǒng)上運行。由于ECU 這里采用飛思卡爾的MC9S12DP256,因此可以直接應用芯片CAN 模塊提供的接口,發(fā)送CAN 數(shù)據(jù)。CCP Driver 是標定系統(tǒng)的核心部分,它主要是通過調(diào)用CAN Driver 實現(xiàn)與上位機標定軟件的通信,從而進行對ECU的在線標定。
4.1 CAN Driver
在這里我們采用的是μC/OS-II 這種實時操作系統(tǒng),但在標定過程中,我們處理的數(shù)據(jù)量很大,通信速度也很快,CAN 接收到一條消息就產(chǎn)生一次中斷,中斷服務子程序,每次中斷都要引起一次任務調(diào)度。CPU 大量的時間花在任務切換上,若CPU 還需處理其他事件,則可能出現(xiàn)接收緩沖寄存器接收溢出的錯誤,造成數(shù)據(jù)丟失。因此,在這里采用一種基于環(huán)形緩沖區(qū)的方式來實現(xiàn)CAN Driver。整個CAN Driver 由中斷處理程序和底層驅(qū)動模塊組成。中斷處理程序在每次CAN 控制器完成收發(fā)時,喚醒驅(qū)動程序,進行下一步工作,設(shè)備相關(guān)程序通過對CAN 控制器寄存器的讀寫,完成對CAN 端口的配置和狀態(tài)檢測等工作,同時為設(shè)備無關(guān)軟件和用戶程序提供接口。而底層驅(qū)動模塊則主要任務是結(jié)合收發(fā)消息緩沖區(qū),為應用程序提供了接收和發(fā)送消息的接口函數(shù)。
(1)中斷處理程序
中斷級程序的程序流程圖如圖 2 所示。首先根據(jù)不同的中斷類別進入不同的中斷級程序。若為接收完成中斷,則清除中斷源,將接收到的消息放入接收緩沖區(qū);將該消息存入接收緩沖區(qū)存入指針所指向的地址,將該指針向下移動,接收緩沖區(qū)計數(shù)器加1,并發(fā)出信號量通知應用程序有新的消息已經(jīng)接收到,若有任務正在等待CAN 上的新消息,則該任務進入就緒狀態(tài)等待OS 的調(diào)度。
圖2 中斷級程序的程序流程圖
若為發(fā)送完成中斷,則將發(fā)送緩沖區(qū)的待發(fā)送消息讀出;將有待發(fā)送消息且優(yōu)先級最高的一個中讀取最舊的消息,發(fā)送緩沖區(qū)計數(shù)器減1,發(fā)出信號量通知應用程序有一個消息被發(fā)出,并匯報當前發(fā)送緩沖區(qū)的狀態(tài);還應判斷是否為最后一個待發(fā)送的消息,若不是,則清除中斷源并將消息發(fā)送到總線上,若是最后一個,則禁止發(fā)送完成中斷后發(fā)送該消息,將這個發(fā)送完成中斷保留到應用程序下一次發(fā)送消息的時候允許并產(chǎn)生。
(2)底層驅(qū)動模塊
底層驅(qū)動模塊主要是為應用程序提供了接收和發(fā)送消息的接口函數(shù)。當接收消息時,如圖3 實線所示,應用程序在信號量處等待;收到一個消息后,ISR從串行端口讀入消息,將其存入環(huán)狀緩沖區(qū)。然后ISR 發(fā)出信號量,通知在等待串口數(shù)據(jù)的任務已收到一個消息。等待任務收到信號量后,進入就緒狀態(tài),準備被OS 調(diào)度器激活。當內(nèi)核調(diào)度該任務運行時,該任務從環(huán)狀緩沖區(qū)中取出消息,完成接收消息的過程。
圖3 緩沖區(qū)接收發(fā)送消息
發(fā)送消息的方法如圖3 虛線所示。當發(fā)送環(huán)狀緩沖區(qū)已滿時,信號量作為指示,暫停發(fā)送任務。為發(fā)送消息,任務等待信號量。如果環(huán)狀緩沖區(qū)未滿,則任務繼續(xù)向環(huán)狀緩沖區(qū)存儲欲發(fā)送的消息。如果存儲的消息是緩沖區(qū)的第一個字節(jié),則發(fā)送中斷允許,中斷程序準備啟動。CAN 發(fā)送ISR 從環(huán)行緩沖區(qū)中取出最舊的消息,同時發(fā)送信號量,通知發(fā)送任務,表明環(huán)狀緩沖區(qū)有空間接收另外的消息。接著ISR 將消息從CAN 端口發(fā)送到總線上。
4.2 CCP Driver
基于實時操作系統(tǒng)的CCP Driver,標定系統(tǒng)在這里是通過Command 處理機和DAQ 處理機兩部分來實現(xiàn)的。
Command 處理機由一個系統(tǒng)任務來完成。該任務在OS 初始化后就啟動運行,識別CAN 網(wǎng)絡(luò)上的CCP 主設(shè)備發(fā)送給該從設(shè)備的會話命令。根據(jù)命令做相應動作,并回送命令應答,完成會話。DAQ 處理機由1~n 個系統(tǒng)任務來完成。本項目支持對不同時間要求的監(jiān)視參數(shù)設(shè)定不同的DAQ 周期,不同時間要求的監(jiān)視參數(shù)填入不同的DAQ_List,每個DAQ_List 由一個任務完成周期發(fā)送。
Command 處理機在收到主設(shè)備要求啟動某DAQ_List 命令時, 調(diào)用OS 函數(shù)OSTaskCreate()啟動相應的任務,該任務每完成一次發(fā)送就調(diào)用OS 函數(shù)OSTimeDlyHMSM( )掛起一定的時間,這個時間就是主設(shè)備對這個DAQ_List 要求的發(fā)送周期。在收到主設(shè)備要求停止某DAQ_List 命令時,調(diào)用OS 函數(shù)OSTaskDel( )函數(shù)刪除該任務。
(1)Command 處理機
Command 處理機主要是獲取并解讀主設(shè)備的CCP 命令,并執(zhí)行該命令;命令執(zhí)行完成后,向主設(shè)備發(fā)送應答;若執(zhí)行時出錯,應答中向主設(shè)備報錯;若主設(shè)備命令要求對DAQ進行操作,則將該操作傳達給DAQ 處理機,由DAQ 處理機完成DAQ 操作。
Command 處理機由一個RTOS 任務來完成,其示意性代碼如下,GetMsg 函數(shù)為CAN 驅(qū)動程序的接收消息函數(shù),調(diào)用此函數(shù)則等待獲取CAN 端口接收到的消息幀。一旦接收到新的消息幀則函數(shù)返回,用戶可通過&msg_command 獲取該消息幀的內(nèi)容。
void task (void * data) {
for( ; ; ) {
GetMsg(&msg_command); //等待并獲取一個CCP 命令
CCP_Command (&msg_command); //將命令送給CCP 命令處理函數(shù)
}
}
(2)DAQ 處理機
DAQ 處理機的任務是根據(jù)主設(shè)備的需要,定時向CAN 總線上發(fā)送DAQ 數(shù)據(jù)。它由啟動從設(shè)備的DAQ 發(fā)送、停止從設(shè)備的DAQ 發(fā)送、執(zhí)行DAQ 循環(huán)發(fā)送的任務3 個部分構(gòu)成。
啟動或停止從設(shè)備的 DAQ 發(fā)送,由Command 處理機調(diào)用函數(shù)Start_DAQ (DAQ List
number ,)和Stop_DAQ (DAQ List number)來完成,該函數(shù)啟動或停止相應的DAQ 發(fā)送任務,
其示意性代碼如下:
Start_DAQ(INT8U DAQ_List_num) { //啟動第n 個DAQ_List
DAQ_List[n].Started = 1;
DAQ_List[n].Prepared = 1;
OSTaskCreate (第n 個DAQ_List 的任務); //調(diào)用系統(tǒng)函數(shù),創(chuàng)建DAQ 發(fā)送任務,
并使任務進入調(diào)度
}}
Stop_DAQ(INT8U DAQ_List_num) { //停止第n 個DAQ_List
DAQ_List[n].Started = 0;
DAQ_List[n].Prepared = 0;
OSTaskDel (第n 個DAQ_List 的任務); //調(diào)用系統(tǒng)函數(shù),刪除DAQ 發(fā)送任務
}
執(zhí)行DAQ 循環(huán)發(fā)送的任務,需要按照ODT 設(shè)置把DAQ 數(shù)據(jù)發(fā)送到CAN 總線上,同時需要按照DAQ 周期要求循環(huán)執(zhí)行,該任務示意性代碼如下:
void DAQ_task ( ) {
for( ; ; ) {
CCP.Upload(0); //根據(jù)ODT 設(shè)置把DAQ 數(shù)據(jù)發(fā)送到CAN 總線上
OSTimeDlyHMSM(Period); //調(diào)用RTOS 函數(shù),等待一個周期的時間
}
}
5 結(jié)束語
經(jīng)過多次反復不斷的實際調(diào)試,此 CCP 軟件程序在系統(tǒng)上運行穩(wěn)定可靠,實現(xiàn)了基于MC9S12DP256 上的FLASH 區(qū)的標定。
這種采用環(huán)形緩沖區(qū)以及結(jié)合實時操作系統(tǒng)的 CCP 軟件程序設(shè)計,有效的避免在ECU標定過程中數(shù)據(jù)的丟失,并可以對多個ECU 同時進行在線標定,具有很強的實用價值。
責任編輯:gt
-
芯片
+關(guān)注
關(guān)注
455文章
50714瀏覽量
423132 -
控制器
+關(guān)注
關(guān)注
112文章
16332瀏覽量
177803 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6801瀏覽量
123283
發(fā)布評論請先 登錄
相關(guān)推薦
評論