作者:良知犹存
转载授权以及围观:欢迎添加微信:becom_me
发现K线没有过多的文章描述,作为一个开发过K线的人,不写些文章帮助后来的人岂不是太浪费开发经验了呢。
总述
KWP2000是一套协议,它符合OSI七层协议模型,即即ISO14230-1,ISO14230-2,ISO14230-3,ISO14230-4这4个协议文件。
ISO14230-1协议规定了物理层标准,要求使用K线
ISO14230-2 规定了链路层,即帧格式、计时器等、错误处理机制以及交换关系。
ISO14230-3 规定了应用层,及链路层中的数据域是如何解析的,怎么样为用户提供服务(请求数据、接受数据、解析数据),这部分参考了ISO14229-1协议。
ISO14230-4 则是对一种特殊应用(排放相关系统要求),他分别对ISO14230-1,ISO14230-2,ISO14230-3作出了特例化要求和一些补充,又形成了一个体系协议(这个不太相关)
目前欧洲汽车领域广泛采用了基于CAN总线的KWP2000,即ISO 15765等协议,而基于K线的KWP2000物理层和数据链路层协议基本淘汰,国内也只有一些底端车型有用,但是在摩托车领域,电喷普及进程中,ECU广泛使用BOSH和德尔福等厂家设备的时候,都在同步使用KWP2000协议,开发相关设备的时候,还是需要懂k线协议的。
一、物理接口
K线的特点:
最大通讯速率达10.4 kbit/s(和现在动辄几十、几百M的通讯速度来比,确实很小)
诊断报文最大长度255Byte,k线是单总线,属于关键字协议,通过不同ID实现主从的应答。
总线电平:0~12V
一般电喷的摩托车的ECU不是BOSH就是德尔福或者日本产的,它负责控制整车的运动相关的逻辑,就是整车的CPU。
设备开发K线电路的选择
一般我们开发时候会选择相应的通讯的芯片,如图为K线芯片的电路,使用的是SI9241的k线芯片,一端连接到MCU的串口TX RX引脚,另一端接入K线
K线通讯现在基本上属于被逐渐淘汰的使用,只不过在摩托车电喷的领域还在使用。所以K线芯片也大都停产了,现有的芯片也基本都是以库存料为主,量不大但是很贵,所以设计有一套其他方式做的K线电路,一边连接到K线,一边连接到MCU的串口引脚,通讯很稳定,可以给大家做参考。
其次,大家也可以在某宝购买一些K线测试的开发板,用作测试,用来加快开发的进度。
如图为K线完整的一次初始化应答的信息抓取:
二、通信关键字
搭建好了硬件,这个时候我们需要进行软件的攻关了。首先准备好相关ECU的协议介绍手册。查看相应的协议规则,以及相应的关键词识别位置。
如图K线通讯几种常见的数据格式:
大家看到上面的一些数据格式刚开始可能有些头疼,但是实际上我们用的时候只会有一种使用,我以我使用过的举例解释(如上第二种数据格式)。
StartCommunication:
TEST->ECU (设备端发往ECU请求应答的数据)hex:C1 33 F1 81 66
ECU ->TEST (ECU 应答设备的回复)hex :83 F1 11 C1 E9 8F BE
其中:0xF1代表 设备端的默认地址,0x11代表 ECU的地址
C1(FMT格式字节,0xC1转化为2进制为,11000001,bit7~6 为11,代表请求信息,bit5~0 为1,数据字节长度为1,如下只有一个数据byte SDIRQ)
33(Target字节)
F1(Source字节)
81(SDIRQ,关键字,属于数据段)
66(0xC1+0x33+0xF1+0x81 = 0x266,取一个byte的大小,所以去掉高位变成0x66)
此时候关键字就是81
由上可以知道,K线通讯的注意点:
1.信息里面包括该信息的数据段的长度;
2.协议数据在最后一个byte进行累加和的校验,用来判断数据;
3.协议信息中进行读取关键ID即可判断出当前应答服务的机制;
通过这些信息,我们大致对协议就有一个判断,我们可以通过一些关键词的填写,进行与ECU通信,获得我们需要的信息。例如读取ECU的故障码。
如下是不同的服务ID对应的不同ECU应答信息
这就是我分享的开发Kwp2000的协议,由于太晚了,所以也准备休息了,明天继续分享我的开发经验。如果大家有什么更好的思路,欢迎分享交流哈。