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