您好,欢迎光临!   请登录 免费注册    
  您的位置:电子变压器资讯网 > 资讯中心 >  技术文章 > 正文
一种实用的K线诊断协议驱动器设计
[发布时间]:2012年4月5日 [来源]:21ic电子 [点击率]:4629
【导读】: 引言:随着汽车电子控制单元功能的增加及升级换代的需要,诊断功能已经成为ECU不可或缺的重要组成部分,因此,深入研究诊断协议及其实现非常必要。基于K线的ISO14230和基于CAN总线的ISO157...

引言:

随着汽车电子控制单元功能的增加及升级换代的需要,诊断功能已经成为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所示。

           

物理层定义了逻辑位与物理电平的对应关系,同时定义了信号位的上升时间和下降时间,数据链路层协议定义了K线数据格式、诊断报文格式、定时参数及通信错误判定及处理机制,应用层协议定义了基于请求/响应的诊断过程及各项诊断服务。做为待诊断ECU节点,K线协议驱动器实现的主要功能包括:
1、诊断报文的封装和发送、接收和解析,根据报文格式填充/提取SID和数据;
2、通过初始化过程建立与诊断仪之间的诊断通信;
3、保持正确的帧间定时、字节间定时,检测诊断仪报文的定时错误及其它通信错误;
4、根据诊断仪的诊断请求和ECU当前状态返回相应的诊断响应,管理诊断会话;
下面结合数据链路层的协议分析及其数据结构、驱动程序的设计介绍下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);
  } 
}
2.2 初始化
在开始诊断服务之前,诊断仪必须对ECU进行初始化,通过ECU的响应获取ECU支持的报文头格式和定时参数,建立诊断通讯【4】。初始化过程如图1所示,诊断仪发送一个25ms ’0’、25ms’1’的WuP(WakeUp Pattern),然后发送STC(StartCommunication) Request,ECU检测出WuP并接收到正确的STC Request后返回STC Response,该报文的Data字段为由两个字节构成的“关键字(Key Word)”,指定了ECU所支持的报文头和定时参数信息,如Key Word指定为0x8fea即表示在报文头中采用附加长度信息Len表示数据字段长度,同时采用默认的定时参数。

[上一页] [1] [2] [3] [下一页]

投稿箱:
   电子变压器、电感器、磁性材料等磁电元件相关的行业、企业新闻稿件需要发表,或进行资讯合作,欢迎联系本网编辑部QQ: , 邮箱:info%ett-cn.com (%替换成@)。
第一时间获取电子变压行业资讯,请在微信公众账号中搜索“电子变压器资讯”或者“dzbyqzj”,或用手机扫描左方二维码,即可获得电子变压器资讯网每日精华内容推送和最优搜索体验,并参与活动!
温馨提示:回复“1”获取最新资讯。