浅谈K线诊断协议驱动器的设计

发布日期:2017-04-22 15:17:01 更新时间: 2020-09-15 编辑: 晓春

引言:

随着汽车电子控制单元功能的增加及升级换代的需要,诊断功能已经成为ECU不可或缺重要组成部分,因此,深入研究诊断协议及其实现非常必要。基于K线ISO14230和基于CAN总线的ISO15765是业内广泛采用的两种诊断标准【1】,K线是ISO9141定义的诊断通信总线,ISO14230在ISO9141基础上将K线电压扩展到24V,并扩展诊断服务。

相比较于CAN总线,K线诊断既能满足要求,又能节约成本,在国产车上得到大规模应用,不同于CAN总线有专门的协议驱动器,用户直接进行应用程序编写而不用管理底层的通信,K线没有专门的协议驱动器,一般要在SCI模块的基础上用软件实现其底层通信管理,笔者为某国产车设计了一款带K线诊断功能车身控制模块。结合ISO14230规范,首先分析K线诊断协议驱动器的功能,然后介绍协议驱动器关键设计技术,最后用CANoe进行测试

1 协议驱动器功能

ISO14230-1定义了K线物理层协议,ISO14230-2定义了数据链路层协议,ISO14230-3定义了应用层协议【2】,其与OSI模型对应关系如表1所示。


表1 ISO14230与OSI模型的对应关系

物理层定义了逻辑位与物理电平的对应关系,同时定义了信号位的上升时间和下降时间,数据链路层协议定义了K线数据格式、诊断报文格式/定时参数及通信错误判定及处理机制,应用层协议定义了基于请求/响应的诊断过程及各项诊断服务,做为待诊断ECU节点,K线协议驱动器实现主要功能包括:

1和诊断报文的封装、发送、接收和解析,根据报文格式填充/提取SID、数据;

2和通过初始化过程建立与诊断仪之间诊断通信;

3、根据诊断仪诊断请求和ECU当前状态返回相应的诊断响应。管理诊断会话;

4、保持正确的帧间定时、字节间定时,检测诊断仪报文的定时错误及其它通信错误;

下面结合数据链路层的协议分析及其数据结构、驱动程序设计介绍下K线诊断协议驱动器的原理及实现。

2 协议驱动器设计

K线基于异步串行通信接口 在底层传输上采用8N1格式的SCI串行数据链路格式:8个数据位+1个停止位、无奇偶校验。由于K线在物理层上是单根线。在发送时也会触发接收中断,所以K线报文的发送和接收解析统一在SCI接收中断处理函数中以状态机形式实现【3】。下面从报文收发及解析、初始化、定时管理三个方面介绍下数据链路层的实现。

2.1 报文收发及解析


表2 K线诊断报文结构

K线报文由报文头/数据字段及校验和组成。报文头包含格式字节Fmt和目标地址Tgt、源地址Src和可选附加长度信息Len,Fmt指定目标地址的形式(物理地址/功能地址),当报文头中不包含可选Len字段时指定数据字段的长度;数据字段包括服务标识符Sid、数据Data,其长度由Fmt/Len决定;CS为单字节校验和,设计报文结构体如下:

typedef struct

{

k_state state;

uchar fmt;

uchar tgt_addr;

uchar src_addr;

uchar datalen;

uchar sid;

uchar *data;

uchar checksum;

uchar msgdatalen;

uchar done;

}k_msg;

typedef enum{

k_FMT=0,

k_TGTADDR,

k_SRCADDR,

k_DATALEN,

k_SID,

k_DATA,

k_CS

}k_state;

成员变量state表示当前K线通信数据是报文中的哪个组成部分。msgdatalen用于数据字段字节数的统计。done表示该报文是否发送或接收完成。其它成员变量与报文结构组成部分一一对应。

void k_ifc_rx(void)

{

k_u8 ch,SciSr1;

SciSr1=Kline_periph[SCISR1];

ch=Kline_periph[SCIDRL];

TimerStop(k_TP4);

switch(k_curmsg.state){

case k_FMT:

if(k_REP==k_drvhandle.mode){

if(ch==k_curmsg.fmt){

k_curmsg.state=k_TGTADDR;

k_SendChar(k_curmsg.tgt_addr);

}

}else{

k_curmsg.state=k_TGTADDR;

k_curmsg.fmt=ch;

}

break;

case k_TGTADDR:

...

break;

case k_SRCADDR:

...

break;

case k_DATALEN:

if(k_REP==k_drvhandle.mode){

if(ch==k_curmsg.datalen){

k_curmsg.msgdatalen=0;

k_curmsg.state=k_SID;

k_SendChar(k_curmsg.sid);

}

}else{

k_curmsg.msgdatalen=0;

k_curmsg.datalen=ch;

free(k_curmsg.data);

k_curmsg.data=malloc(k_curmsg.datalen);

k_curmsg.state=k_SID;

}

break;

case k_SID:

if(k_REP==k_drvhandle.mode){

if(ch==k_curmsg.sid){

k_curmsg.msgdatalen++;

if(k_curmsg.msgdatalen==k_curmsg.datalen){

k_curmsg.state=k_CS;

k_SendChar(k_curmsg.checksu);

}else{

k_curmsg.state=k_DATA;

k_SendChar(k_curmsg.data[0]);

}

}

}else{

k_curmsg.sid=ch;

k_curmsg.msgdatalen++;

if(k_curmsg.datalen==k_curmsg.msgdatalen){

k_curmsg.state=k_CS;

}else{

k_curmsg.state=k_DATA;

}

}

break;

case k_DATA:

...

break;

case k_CS:

k_curmsg.state=k_FMT;

if(k_REP==k_drvhandle.mode){

if(ch==k_curmsg.checksum){

k_curmsg.done=1;

}

}else{

k_curmsg.checksum=ch;

k_curmsg.done=1;

}

break;

}   if((k_REQ==k_drvhandle.mode)&&(k_FMT!=k_curmsg.state)){

TimerStart(k_REP_P4MS,k_TP4,0,1);

}

}

汽车美图 更多 >

Copyright @ 2011-2016 www.CheBiaoW.com   车标网   苏ICP备12030990号,我要投稿