KWP2000最初是基于K线的诊断协议,
但是由于后来无法满足越来越复杂的需求,以及自身的局限性,厂商又将这套应用层协议移植到CAN上面,所以有KWP2000-K和KWP2000-CAN两个版本。
这篇文章主要讲基于K线的早期版本协议,认识一下这种基于串口的协议格式,借鉴借鉴。
K线
链路层
1)标准通讯速率10400 比特每秒
可最高支持124800 比特每秒 用于快速刷写
2)数据包包含目标地址和源地址,根据地址的不同实现主从的应答
3)K线是半双工模式的一根双向数据线
4)K线电平为12~24V
对于发送者,大于VB的80%认为是逻辑1,小于VB的20%认为是0,
对于接收者,二者比例是70%和30%。
VB即总线正常工作电压最大值,一般为24V或12V。
总结:对单片机来说,K线就是一个串口通信。具体的电平转换由特殊的K线电压转换芯片完成。
快速初始化
K线建立通讯之前,必须要有一个快速初始化的过程。
ECU端实现了一个硬件检测功能,必须要检测到总线上25ms低电平,
在信号唤醒之后的第一个下降沿,诊断仪发送ECU通讯报文,
如果ECU给与响应,则通信建立。
应用层
下图列出来几种常见的K线通讯协议格式:
1)首字节+SID+DATA+CS
这种一般首字节表示长度,SID表示服务ID,Data为有效数据,CS为1byte的校验和
这种格式简单适用于简单命令控制和数据高速传输
2)首字节+Tgt+Src+SID+Data+cs
这种格式添加了,1byte 目标地址 和 1byte源地址,是最常见和正常的通讯格式。
其中首字节一般为0x80+长度或者0xC0+长度
3)首字节+Tgt+Src+SID+Len+Data+cs
与格式2类似,所不同的是首字节一般固定尾0x80或0xC0,具体长度位要去取Len位置数据。
总结
虽然K线芯片现在基本停产,转到CAN、FDCAN等等,但是这种通讯协议值得参考。
可以用到单片机与其它的模块的串口通信。
实现数据解析
实现这样一种串口通讯协议。
1)需不需要做超时判定
根据自己的应用场景决定是否需要判断超时。
假如需要且超时设定为2s,则每次接收到数据就启动超时定时器,定时器到期则判断数据接收长度,如果仍有数据未处理,则强制推送。
2)确定接收处理方式
a. 单字节接收处理
设置接收非空闲中断,收到1个字节处理1个字节
b. 串口空闲中断或DMA传输
收到一段数据后单字节循环方式处理