汽車診斷協議,(K線/CAN匯流排、kwp2000、ISO14230、ISO1575...)
相信像我這樣的小白第一次接觸汽車診斷協議肯定有點懵逼,什麼鬼kwp2000,那什麼又是ISO-14230,ISO-15765,ISO-14229,UDS,UDSonCAN???它們到底是什麼關係,還有什麼又是基於K線的KWP2000,基於CAN的KWP2000???嗯,慢慢來,一定不要混淆這些協議,首先對這些協議進行初步認識:
一、初步認識
KWP 2000和IS0-14230
在汽車故障診斷領域,針對診斷裝置和汽車ECU之間的資料交換,最早歐洲出現了一種標準診斷協議KWP2000(Keyword Protocol 2000),又名關鍵字協議。
那時候KWP2000是基於K線的診斷協議,(一條線K,或者兩條線K和L)那具體KWP2000協議是什麼?這時候就要講講ISO-14230協議。
當時的KWP2000只三個子層有定義說明,即:應用層、資料鏈路層和物理層。並且這三個層都由ISO-14230-1、ISO-14230-2、ISO-14230-3定義標準,所以一直都這麼說,ISO-14230就是KWP2000。
ISO-14229和UDS
先知道一件事,ISO-14229協議就是UDS(Unified diagnostic services),這個標準定義了診斷的應用層服務,不基於任何底層標準。它是診斷服務的規範化標準,比如讀取故障碼應該向ecu發什麼指令,讀資料流又是發什麼指令等…
ISO-15765 和UDSonCAN
由於K線物理層和資料鏈路層在網路管理和通訊速率上的侷限性,使得K線無法滿足日趨複雜的車載診斷網路的需求。這時候CAN匯流排出現並代替了K線,也就是我們說的ISO-15765。ISO-15765是基於CAN,它的ISO-15765-2、ISO-15765-3定義了診斷資料網路層和應用層的定義標準。
又因為ISO-15765-3使用了ISO-14229(UDS)的診斷服務,所以ISO-15765也叫UDSonCAN。
再看他們的關係
又有人把ISO-14230稱為基於K線的KWP2000協議,把後面發展稱為Can線的ISO-15765稱為基於基於CAN的KWP2000協議。
其實都可以,不混淆就行,基於K線的KWP2000協議就是ISO-14230,基於CAN的KWP2000協議就是ISO-15765或者UDSonCAN!!!!
改個名字也行~
二、1. KWP 2000協議
KWP 2000協議是最常用的通訊協議之一,又稱為關鍵字協議,因為這種協議在系統進入時,會涉及到關鍵字的校驗而得名。K線KWP2000協議是非同步半雙工進行通訊的,通常採用10416BPS的波特率;空閒電平通常為12V。其實很簡單,就是用一條K線進行資料通訊,然後制定一些協議而已。下面系統初始化進入、幀結構、命令互動、互動時間引數、常用命令字等幾個方面來介紹這種協議。
1、系統進入初始化
有兩種初始化方式,主要是用第一種初始化。由裝置先發送25ms的拉低電平,然後是25ms的高電平(空閒電平),然後再發送系統進入資料,系統進入資料通常為5個位元組,ECU響應7個位元組,完成系統初始化互動。請參見下圖:
第二種初始化方式為裝置傳送5BPS或者200BPS的地址碼,ECU響應55H,KW1,KW2,裝置對KW2取反發回給ECU,ECU對地址碼取反發回給裝置,完成系統初始化互動。其中55H這個位元組用來規定後面的通訊波特率。參見下圖
2、幀結構
命令頭(1個或多個位元組)+命令體(1個或多個位元組)+校驗(通常為和校驗)
在命令頭中,包括以下幾個部分的內容:格式+目標地址+源地址+長度位元組。長度資訊有時候在格式位元組中體現,則不需要另外的長度位元組,長度資訊用以表示命令體的內容;目標地址和源地址有時候也會沒有。
命令體的內容中:命令字+命令內容。命令內容可以沒有。
舉例如下:
81H 11H F1H 81H 04H
第一個位元組81H為格式+長度資訊(80+1)
第二個位元組11H為目標地址
第三個位元組F1H為源地址
第四個位元組81H為命令字,表示系統進入
最後一個位元組04H為前面4個位元組的校驗和
同樣,也可能表現如下:(命令字)
80H 11H F1H 01H 3EH C1H
這種情況下,長度位元組放在源地址之後
還可能表現為:
02H 1AH 9AH B6H
這種情況下,格式位元組和目標地址源地址都已經沒有了
還有一種特殊的情況,在上一種情況的基礎上,在幀資料之前,加一個00,例如:
00H 02H 1AH 9AH B6H
但這種幀結構的情況極少
3、命令互動
命令互動通常情況下為1對1,但也存在1對多或者多對1的情況。下面是一組命令互動舉例:
Tools: 81H 31H F1H 81H 24H
ECU: 83H F1H 31H C1H E9H 8FH DEH
在互動中,因為傳送命令的物件不一樣,所以目標地址和源地址是進行了互換;
同時,ECU響應裝置的命令字在裝置命令字的基礎上 + 0x40(肯定回答)
還有否定回答,即回覆 7F
Tools: 0x81, 0x11, 0xF1, 0x81, 0x04,
ECU: 0x83, 0xF1, 0x11, 0x7F, 0x81, 0x21, 0xA6,
4、互動時間引數
裝置傳送命令位元組間的時間間隔P1,通常為5ms
ECU返回命令位元組間的時間間隔P2,通常為0ms
裝置傳送完一幀命令後等待ECU響應的時間P3,通常為75ms~90ms
裝置接收到ECU響應後到傳送下一幀命令的時間P4,通常為20ms~26ms
5、常用命令字
系統進入:81H
系統退出:82H
鏈路保持:3EH
讀故障碼:18H
清除故障碼:14H
讀版本資訊:1AH
讀資料流:21H
6、實訓
從最底層開始,直接看K線的電平變化吧
截一段裝置向ECU傳送請求的資料:
IO[0]:用作K線通訊傳送和接收資料的埠,變化電平高低(1,0)表示資料位的值
T:表示電平持續的時間
一個數據位的時間 = 1/波特率即: 1 / 10416 = 95 ns(約等於)
那就簡單了,把上面電平持續時間時間除以95,可以得出K線的電平變化情況:
單位:一個數據位的時間單位
傳送一位元組的資料表示方法:
很容易看出,這個裝置傳送命令位元組間的時間間隔P1,為4.5ms
所以解析一下電平圖代表的資料實際是:
向ECU傳送請求的資料為:0x80,0x11,0xF1,0x01
意思:裝置請求和ECU建立連線
隨便再搞一段ECU返回裝置的資料:
電平持續時間時間除以95,可以得出K線的電平變化情況:
可知ECU返回命令位元組間的時間間隔P2,為0ms
ECU返回裝置的資料為:0x81,0xF1,0x11,0x7E,0x01
意思:ECU返回鏈路保持
注意:這兩段電平是對應的,是我隨機取的,所以請求和返回沒對應起來,大家不要誤會