XCP协议学习笔记
1.XCP用來做什么?
在汽車電子軟件開發(fā)中,經(jīng)常會(huì)遇到需要在整車調(diào)試或者臺(tái)架調(diào)試時(shí)才能確定的一些變量,這個(gè)時(shí)候就會(huì)用到XCP,例如電機(jī)控制器的PID參數(shù),可能根據(jù)汽車的負(fù)載不一樣需要調(diào)整,這個(gè)時(shí)候就可通過XCP來標(biāo)定。
那么XCP主要的用處以下總結(jié)為四點(diǎn):
a.標(biāo)定
b.測(cè)量(反饋一些變量的值供上位機(jī)或測(cè)試系統(tǒng)查看,如轉(zhuǎn)速等)
c.編程和刷新(例如更新一部分地址的數(shù)據(jù)值,甚至重編程等,這部分用的較少一般用UDS)
d.對(duì)ECU功能進(jìn)行旁路,簡(jiǎn)單來說就是模擬ECU的數(shù)據(jù)
其中主要用a,b兩點(diǎn),其他兩點(diǎn)用的比較少。
XCP協(xié)議數(shù)據(jù)結(jié)構(gòu)
主、從設(shè)備之間每次傳輸?shù)臄?shù)據(jù)都采用XCP幀的格式,包含一個(gè)XCP報(bào)頭、XCP數(shù)據(jù)包和XCP報(bào)尾。XCP幀支持的傳輸層可將這三個(gè)幀元素映射到相應(yīng)的傳輸幀格式。
XCP數(shù)據(jù)包包含獨(dú)立于所選傳輸機(jī)制的協(xié)議數(shù)據(jù),攜帶標(biāo)識(shí)、時(shí)間戳和實(shí)際數(shù)據(jù)。PID是標(biāo)識(shí)字段的一部分,用于標(biāo)記數(shù)據(jù)包及數(shù)據(jù)包內(nèi)部的數(shù)據(jù)值。
?
2.XCP的工具簡(jiǎn)介
目前XCP主要使用的工具有Vector公司的CANape ?ITAS的INCA,Value CAN等工具。
3.XCP的一般工作流程
首先XCP是主從的工作結(jié)構(gòu),主節(jié)點(diǎn)(Master)即一個(gè)上位機(jī),我們定義它為測(cè)試系統(tǒng),當(dāng)然你也可以理解為我們使用的XCP工具,一個(gè)主節(jié)點(diǎn)可以連接多個(gè)從節(jié)點(diǎn)(Slave),以XCPOnCAN為例,可以通過CAN ID的方式來識(shí)別不同的從節(jié)點(diǎn),一般從節(jié)點(diǎn)需要兩個(gè)CANID,一個(gè)源地址,一個(gè)目標(biāo)地址。那么硬件連接如下所示:
Master(帶上位機(jī)的筆記本)<-->CAN工具<-->Slave(ECU 可多個(gè))
a.第一步我們要將Master和Slave連接起來,當(dāng)然是通過發(fā)命令的方式建立連接,具體命令后面進(jìn)行講解。
b.第二步可以通過上位機(jī)工具監(jiān)控之前定義好的一些變量,例如速度,轉(zhuǎn)矩,電壓等參數(shù);
c.第三步可以進(jìn)行一些在線標(biāo)定功能,比如在臺(tái)架上標(biāo)定PID的一些參數(shù),標(biāo)定過程一般是先在一個(gè)存儲(chǔ)區(qū)(RAM)定義的變量找出一個(gè)比較好的參數(shù),然后將這個(gè)比較好的參數(shù)固化下來,擦除原來的數(shù)據(jù)寫入到另外一個(gè)映射好的存儲(chǔ)區(qū)(flash),這個(gè)是標(biāo)定的一般過程;
d.當(dāng)然也可以通過重新擦寫一個(gè)數(shù)據(jù)區(qū)域,使用其編程的功能。
我認(rèn)為映射關(guān)系可能是XCP中較核心的一個(gè)部分,下面我們講一講c步驟中的地址映射。
4.XCP地址映射
首先我們講一講 參考頁/工作頁/激活頁/邏輯地址/物理地址的一些概念
邏輯地址:為了XCP的邏輯應(yīng)用定義的一塊地址,就像我們給一個(gè)變量定義了一個(gè)名字一樣;
物理地址:它是直接對(duì)應(yīng)存儲(chǔ)器上的一塊地址比如RAM上的0x0000~0x0200一塊地址;Flash 0x1000~0x1200一塊地址;
參考頁: 你可以理解為定義的邏輯地址對(duì)應(yīng)Flash上的一塊地址,比如邏輯地址0x0000~0x0200對(duì)應(yīng)Flash上一塊0x1000~0x1200這個(gè)地址;那么參考頁的屬性在標(biāo)定過程是可讀不可寫;
工作頁:你可以理解為定義的邏輯地址對(duì)應(yīng)RAM上的一塊地址,比如邏輯地址0x0000~0x0200對(duì)應(yīng)RAM上一塊0x0000~0x0200這個(gè)地址;注意工作頁的屬性是可讀可寫(方便標(biāo)定修改嘛)
激活頁:就是指選擇激活的一個(gè)頁,比如激活工作頁或者激活參考頁等。
這里再進(jìn)一步說一下標(biāo)定過程:首先激活參考頁(僅可讀),讀取當(dāng)前的參數(shù),比如PID中的比例因子 P,然后切換激活頁,激活工作頁(可讀可寫),這個(gè)時(shí)候就可以在線修改參數(shù),來獲得較好的PID曲線,從而確定優(yōu)化后的參數(shù)P,最后,我們還是需要將原來參考頁上的P參數(shù),寫入優(yōu)化后的P參數(shù),這樣就完成了一個(gè)參數(shù)的標(biāo)定。
下面我們講講兩種地址映射方式:
a.硬件方式
有些芯片是支持硬件地址映射的,比如我們現(xiàn)在使用的英飛凌TC27X系列,它的工作方式比較簡(jiǎn)單,就是在你切換激活的工作頁時(shí),操作寄存器,硬件完成地址映射。
舉個(gè)例子 假如Reg1 = 0時(shí),激活頁是參考頁,邏輯地址0x000~0x200 對(duì)應(yīng)的Flash中的0x100~0x300;
切換激活頁為工作頁時(shí),Reg1=1,對(duì)應(yīng)邏輯地址0x000~0x200 對(duì)應(yīng)Ram中的0x000~0x200;
是不是超簡(jiǎn)單,但是相應(yīng)芯片價(jià)格會(huì)貴一點(diǎn)。
b.軟件方式
其實(shí)就是加入一個(gè)offset偏移量來實(shí)現(xiàn)。
還是以上面的例子為例:
激活頁->參考頁 ??邏輯地址 0x000~0x200 ?-> Offset=0x100 ?Flash地址0x100~0x300 =(邏輯地址+Offset)
激活頁->工作頁 ??邏輯地址 0x000~0x200 ?->?Offset=0x000 ?Flash地址0x000~0x200 =(邏輯地址+Offset)
同樣也不不復(fù)雜,但是會(huì)部分增加軟件的維護(hù)工作。
激活頁->參考頁 ??邏輯地址 0x000~0x200 ?->?Offset=0x100 ?Flash地址0x100~0x300 =(邏輯地址+Offset)
5.XCP的命令簡(jiǎn)介
下面我將進(jìn)行一定的分類方法來進(jìn)行介紹;
Master->Slave (上位機(jī)到下位機(jī))總共0xFF條
?????名稱 ???????????????????PID范圍
?????CMD ?????????????????0xC0~0xFF
?????STIM ?????????????????0x00~0xBF
Slave?->Master(下位機(jī)到上位機(jī))總共0xFF條
?????名稱 ???????????????????PID范圍
?????Response ????????????0xFF
?????Error ????????????????????0xFE
? ? ?Event ???????????????????0xFD
?????Service ????????????????0xFC
?????DAQ ??????????????????0x00~0xFB ?//ODT的序號(hào)
下面大致解釋一下上面名稱:
CMD:指的是上位機(jī)下發(fā)給下位機(jī)的一些命令,比如連接命令FF,解鎖,獲取狀態(tài)等一些和下位機(jī)交互的命令;
STIM:你可以理解為一種上位機(jī)向下位機(jī)大量發(fā)數(shù)據(jù)的一種方式,相當(dāng)于反向的DAQ;
Response:肯定應(yīng)答,指的下位機(jī)答復(fù)上位機(jī)的命令;
Error:否定應(yīng)答上位機(jī)的命令;
Event:事件,指下位機(jī)發(fā)生某事件時(shí)通知上位機(jī);
Service:指下位機(jī)在某些情況下,需要上位機(jī)執(zhí)行一些動(dòng)作,你可以理解為請(qǐng)求上位機(jī)服務(wù)。
DAQ:很顯然,就是下位機(jī)上傳數(shù)據(jù)給上位機(jī)。
XCP數(shù)據(jù)包有兩種類型CTO和DTO。
命令傳輸對(duì)象(CTO:Command Transfer Object)被用來傳輸一般的控制命令:控制命令(CMD),命令響應(yīng)(RES),錯(cuò)誤包(ERR)事件包(EV)以及服務(wù)請(qǐng)求數(shù)據(jù)包(SERV)。
數(shù)據(jù)傳輸對(duì)象(DTO:Data Transfer Object)被用于傳輸同步數(shù)據(jù)采集數(shù)據(jù)(DAQ)和同步數(shù)據(jù)激勵(lì)數(shù)據(jù)(STIM)。
CMD: Command
RES: Response
ERR: Error
EV: Event
SERV: Service Request Processor
DAQ: Data Acquisition
STIM: Stimulation
6.XCP的A2L文件
ASAP2標(biāo)準(zhǔn)是ASAM組織制定的一套標(biāo)準(zhǔn),該標(biāo)準(zhǔn)規(guī)定了上位機(jī)(Master)和ECU(Slave)之間的通訊所需要的所有信息(可以是XCPonCAN,XCPonUSB等,也可以是CCP,還可以是UDS),而A2L文件就是ASAP2標(biāo)準(zhǔn)的表現(xiàn)形式。
符合ASAP2標(biāo)準(zhǔn)的A2L文件主要含有兩部分內(nèi)容:ECU的描述信息和通訊方式的描述信息。
首先A2L文件是采用ASAP2指定的一套類XML語言的描述性語言(采用開標(biāo)簽和關(guān)標(biāo)簽來描述信息)書寫的文件,它里邊包含了某個(gè)特定的ECU中的軟件和系統(tǒng)信息,還包含了上位機(jī)和ECU通訊方式的約定,它用來指導(dǎo)上位機(jī)和ECU的通訊交互過程,讓他們對(duì)交互的信息有一致的認(rèn)識(shí),從而是上位機(jī)工具準(zhǔn)確且友好的將ECU中的信息展現(xiàn)給用戶。
A2L文件是啥呢?它其實(shí)就是一種方便XCP進(jìn)行工作的描述性一個(gè)文件,你可以理解為一個(gè)通訊矩陣,包含了項(xiàng)目信息、ECU信息、標(biāo)定變量信息、測(cè)量變量信息等等如下所示。
/begin PROJECT /*表示一整個(gè)項(xiàng)目,一個(gè)文件一個(gè)項(xiàng)目*//begin HEADER /*描述項(xiàng)目信息,包括項(xiàng)目編號(hào),項(xiàng)目版本等信息*/ /end HEADER/begin MODULE Device/*描述ECU需要的所有信息,一個(gè)ECU對(duì)應(yīng)一個(gè)MODULE塊*//begin MOD_PAR /*管理ECU的數(shù)據(jù),CPU 客戶 編號(hào)等等,最重要的是內(nèi)存的分段分頁管理,類似DSP中的CMD文件*//end MOD_PAR /begin MOD_COMMON/*一般性描述信息,比如大小端,數(shù)據(jù)的對(duì)齊方式*//end MOD_COMMON/begin CHARACTERISTIC/*定義標(biāo)定變量,包含被標(biāo)定的變量的名字,地址,長(zhǎng)度,計(jì)算公式,精度,最大最小值等信息*//end CHARACTERISTIC /*可定義多個(gè)*//begin AXIS_PTS/end AXIS_PTS/begin MEASUREMENT/*定義測(cè)量變量,包含了被測(cè)量的變量的名字,地址,長(zhǎng)度,計(jì)算公式,精度,最大最小值等信息*//end MEASUREMENT/*可定義多個(gè)*//begin COMPU_METHOD/*定義計(jì)算公式,及原始值和物理值之前的轉(zhuǎn)換關(guān)系 如phy = ax+b*//end COMPU_METHOD/begin COMPU_TAB /*定義原始值和物理值的映射關(guān)系 一般是枚舉變量*//end COMPU_TAB/begin FUNCTION/end FUNCTION/begin GROUP/end GROUP/begin RECORD_LAYOUT/*定義標(biāo)定變量的物理存儲(chǔ)結(jié)構(gòu)(一維,二維表,三維表等)*//end RECORD_LAYOUT/end MODULE Device /end PROJECTA2L文件結(jié)構(gòu)及內(nèi)容
一個(gè)A2L文件只能有一個(gè)Project(項(xiàng)目),而項(xiàng)目中至少要有一個(gè)Module,A2L文件的注釋和C語言的注釋方式是一樣的,支持/**/和//兩種方式。
上邊文件結(jié)構(gòu)中,不同的文件塊的意義:
上述的這些信息塊可以分為兩類:
- 一類是隨著ECU和XCP實(shí)施完成以后就確定的,這類信息一經(jīng)確定以后再后續(xù)的使用過程中是不需要修改的,例如大小端,MEMORY SEGMENT內(nèi)存分配等,上述HEADER/MOD_PAR/MOD_COMMON屬于這一類,另外一類是當(dāng)ECU軟件有所調(diào)整的時(shí)候就會(huì)變化的,例如已有的標(biāo)定變量和測(cè)量變量的地址,甚至變量名,或者可能會(huì)新增變量,上述CHARACTERISTIC/AXIS_PTS/MEASUREMENT/COMPU_METHOD/COMPU_TAB/FUNCTION
/GROUPS/RECORD_LAYOUT屬于這一類。 - 在第二類中改動(dòng)最多的尤其是CHARACTERISTIC和MEASUREMENT快中的變量地址信息,因?yàn)槊看诬浖兓匦戮幾g都會(huì)造成這部分信息的更新,地址更新導(dǎo)致的塊信息更新需要手動(dòng)的更改A2L文件才能使得A2L和當(dāng)前的軟件配置起來,只有兩者相匹配才能實(shí)現(xiàn)正確的標(biāo)定和測(cè)量。
?A2L塊示例
測(cè)量變量vechicle_speed可以進(jìn)行如下定義,該變量處于RAM中,對(duì)應(yīng)的地址是0xD0001234,它的范圍是[0-230] ,它在ECU中以一個(gè)UWORD類型來表示,原始值和物理值的轉(zhuǎn)換關(guān)系為:Phy = 0.003 X Raw ,即Ax+B中A=0.003,B=0;
測(cè)量變量xcp_state代表XCP的狀態(tài),可以進(jìn)行如下定義,它處于RAM中,在ECU中的地址是0xD0005678,它是一個(gè)枚舉量,0對(duì)應(yīng)DISCONNECTED,1對(duì)應(yīng)CONNECTED,2對(duì)應(yīng)RESUME;
標(biāo)定變量Current_threshold可以進(jìn)行如下定義,它處在FLASH標(biāo)定區(qū)域,在ECU中的地址是0x00012345,它的范圍是[-20,20],是一個(gè)有符號(hào)量,精度為0.125,即Phy = 0.125 X Raw我們前邊提到的,在每次軟件有更新重新編譯以后,會(huì)導(dǎo)致這些變量在ECU中的地址有變化,
那么上邊這些變量對(duì)應(yīng)的ECU ADDRESS條目的內(nèi)容就需要隨著改變,變量的地址信息可以從編譯生成的MAP文件中獲得,然后手動(dòng)更新到A2L中。
總結(jié)
- 上一篇: 增值税防伪税控主机共享服务系统管理暂行办
- 下一篇: 02 Xcp协议层介绍