简介
KWP2000(Keyword Protocol2000)是欧洲汽车领域广泛使用的一种车载诊断协议标准,该协议实现了一套完整的车载诊断服务,并且满足E-OBD(EuropeanOn BoardDiagnose)标准。KWP2000最初是基于K线的诊断协议,由于K线物理层和数据链路层在网络管理和通讯速率上的局限性,使得K线无法满足日趋复杂的车载诊断网络的需求。而CAN网络(ControllerArea Network)由于其非破坏性的网络仲裁机制、较高的通讯速率(可达1Mbps)和灵活可靠的通讯方式,在车载网络领域广受青睐,越来越多的汽车制造商把CAN总线应用于汽车控制、诊断和通讯。
项目特定的kw2000服务的子组件:
外部通信软件由两部分组成:
• Communication handler
• Command Interpreter
报文结构:
一个报文包含: 报文头、数据域、校验和
每个字节在该报文结构中包含:1 开始位、8 数据位(最低有效位开始)、1 停止位
(1)字节是可选的,取决于报文格式字节
(2)服务标识是数据域的一部分
Format byte - Fmt:包含2 bits地址信息和6 bits长度信息。
A1 | A0 | L5 | L4 | L3 | L2 | L1 | L0 |
---|
Target address byte - Tgt: 目的地址信息
Source address byte - Src:源(传输设备)地址信息,是一个物理地址,此字节是可选的(总是与目标地址字节一起使用),并且仅在多节点总线拓扑上是必需的。对于点到点的连接,可以省略它。
Target and Source address bytes
Byte | Tester -> ECU | ECU -> Tester |
---|---|---|
Target address | ECU address (0x10) | Tester address (0xXX) |
Source address | Tester address (0xXX) | ECU address (0x10) |
Length Byte - Len:如果头字节(L0到L5)的长度设置为零,则提供此字节。它允许单元传输数据域超过63字节的报文。低于63的可能被省略。
Data Bytes:数据域可能包含63字节或255字节的信息,取决于长度信息。第一个字节是服务标识,根据所选择的服务,后边可能紧跟着参数和数据。
Data byte information
Sld | Service Identification byte |
---|---|
Data | Data bytes max 254 |
Checksum: 校验和。
服务概述
支持诊断模式
DM [Hex] | Diagnostic Mode (DM) | Security access required? | Security access Mode [hex] |
---|---|---|---|
81 | Default Mode | NO | |
82 | End Of Line Upload Mode | YES | 0x01 / 0x02 |
83 | End Of Line Download Mode | YES | 0x03 / 0x04 |
85 | ECU Programming Mode | YES | 0x07 / 0x08 |
86 | ECU Development Mode | YES | 0x09 / 0x0A |
87 | ECU Adjustment Mode | YES | 0x0B / 0x0C |
88 | EOL VehicleUpload Mode | YES | 0x11 / 0x12 |
89 | EOL VehicleDownload Mode | YES | 0x13 / 0x14 |
90 | EOL Vehicle Customer Service Upload Mode | YES | 0x15 / 0x16 |
91 | EOL Vehicle Customer Service Download Mode | YES | 0x17 / 0x18 |
92 | EOL End Customer Service Uoload Mode | YES | 0x19 / 0x1A |
93 | EOLEndCustomerServiceDownloadMode | YES | 0x1B / 0x1C |
部分服务列表
诊断服务名称 | 请求码(十六进制) | 诊断服务名称 | 请求码(十六进制) | 诊断服务名称 | 请求码(十六进制) |
---|---|---|---|---|---|
startCommunication | 81 | securityAccess | 27 | Read Status Of Diagnostic Trouble Codes | 17 |
stopCommunication | 82 | readEcuIdentification | 1A | Read Diagnostic Trouble Codes By Status | 18 |
accessTimingParamerters | 83 | ecuReset | 11 | clearDiagnosticInformation | 14 |
CommunicationControl | 28 | readDataByLocalIdentifier | 21 | readFreezeFrameData | 12 |
startDiagnosticSession | 10 | readMemoryByAddress | 23 | requestUpload (read Flash) | 35 |
Control Diagnostic Trouble Codes Setting | 85 | requestDownload (write Flash) | 34 | transferData | 36 |
requestTransferExit | 37 | writeMemoryByAddress | 3D | writeDataByLocalIdentifier | 3B |
KWP 请求报文
Data byte | Parameter name | Hex value | Mnemonic |
---|---|---|---|
#1 | Diagnostic service name | $xx | SID |
#2 | Request parameter #1 | $xx | PARAM1(参数1) |
#3 to #n | Other request parameters | $xx | PARAMn(参数2) |
KWP 积极响应(positive response)
Data byte | Parameter name | Hex value | Mnemonic |
---|---|---|---|
#1 | Diagnostic service name OK | SID + $40 | SID OK |
#2 | Response parameter #1 | $xx | RES1 |
#3 to #n | Other response parameters | $xx | RESn |
KWP 消极响应(negative response)
Data byte | Parameter name | Hex value | Mnemonic |
---|---|---|---|
#4 | Negative response | $7F | NR |
#5 | Code of service received by ECU | $xx | SID |
#6 | Negative response code | $xx | RC |
negative response code table
Hex | Definition of Response Code | Mnemonic |
---|---|---|
00 | reservedByDocument 此值不应用作响应代码。 | RBD |
10 | generalReject 服务被拒绝,但是ECU没有指定拒绝的原因 | GR |
11 | serviceNotSupported 不支持请求的服务 | SNS |
12 | subFunctionNotSupported-invalidFormat 请求报文的参数或格式不匹配,此响应代码不影响通信计时! | SFNS-IF |
21 | busy-RepeatRequest 已接收请求,但未在最大响应时间内完成操作 | BRR |
22 | conditionsNotCorrectOrRequestSequenceError 未满足先决条件,可能序列请求顺序错误。 | CNCORSE |
23 | routineNotCompleteOrServiceInProcess 正在执行,还未完成 | RNCOSP |
31 | requestOutOfRange 发现越限的值 | ROOR |
33 | securityAccessDenied-securityAccessRequested 安全策略不满足,访问被拒绝 | SADSAR |
35 | invalidKey 密钥不匹配 | IK |
36 | exceedNumberOfAttempts 客户端试图获取比允许的更多的安全访问次数,失败。 | ENOF |
37 | requiredTimeDelayNotExpired 在服务器需要的时间超时后,发起请求。 | RTDNE |
40 | downloadNotAccepted 由于某些故障不能完成下载。 | DNA |
41 | improperDownloadType ECU不支持请求下载数据的类型 | IDT |
42 | canNotDownloadToSpecifiedAddress 不能识别可用的下载地址 | CNDTSA |
43 | canNotDownloadNumberOfBytesRequested 不能识别可用的下载字节数 | CNDNOBR |
50 | uploadNotAccepted 由于某些故障条件不能完成上传 | UNA |
51 | improperUploadType不支持上传类型 | IUT |
52 | canNotUploadFromSpecifiedAddress 不能识别可用的上传地址 | CNUFSA |
53 | canNotUploadNumberOfBytesRequested 不能识别可用的上传字节数 | CNUNOBR |
77 | blockTransferDataChecksumError 校验和不一样 | BTDCE |
80 | serviceNotSupportedInActiveDiagnosticMode 在当前活动的诊断模式中,服务器(ECU)不支持所请求的服务。 | SNSADM |
81-8F | reservedByDocument 此值不应用作响应代码。 | RBD |
90-9F | vehicleManufacturerSpecific 这一范围的值是预留给汽车制造商的特定用途。 | VMS |
FA | checksumError | an application-RAM or flash-EPROM checksum error. |
FB | ECUErasingFlash ECU当前正在擦除flash-EPROM。 | RC_ERASE |
FC | ECUProgrammingFlash ECU目前正在为flash-EPROM编程。 | RC_PROG |
FD | erasingError 擦除flash-EPROM出错。 | RC_ERER |
FE | programmingError flash-EPROM编程出错。 | RC_PRERR |
FF | reservedByDocument 此值不应用作响应代码。 | RBD |