0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

K线诊断协议驱动器的工作原理及如何实现设计

电子设计 来源:电子产品世界 作者:王振华;余格非;张 2021-04-13 09:47 次阅读

作者:王振华;余格非;张学平 来源:电子产品世界

引言:

随着汽车电子控制单元功能的增加及升级换代的需要,诊断功能已经成为ECU不可或缺的重要组成部分,因此,深入研究诊断协议及其实现非常必要。基于K线的ISO14230和基于CAN总线的ISO15765是业内广泛采用的两种诊断标准,K线是ISO9141定义的诊断通信总线,ISO14230在ISO9141的基础上将K线电压扩展到24V,并扩展了诊断服务。相比较于CAN总线,K线诊断既能满足要求,又能节约成本,在国产车上得到大规模应用。不同于CAN总线有专门的协议驱动器,用户直接进行应用程序的编写而不用管理底层的通信,K线没有专门的协议驱动器,一般要在SCI模块的基础上用软件实现其底层通信管理,笔者为某国产车设计了一款带K线诊断功能的车身控制模块,结合ISO14230规范,首先分析K线诊断协议驱动器的功能,然后介绍协议驱动器的关键设计技术,最后用CANoe进行测试。

1 协议驱动器功能

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

K线诊断协议驱动器的工作原理及如何实现设计

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

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

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

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

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

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

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

2 协议驱动器设计

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

2.1 报文收发及解析

K线诊断报文结构如表2所示:

表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 初始化过程

初始化之前K线处于空闲状态,ECU禁止SCI功能并使能SCI的RXD引脚为IO模式,检测到下降沿时通过定时器统计RXD引脚的IO低电平的持续时间,检测到上升沿时开始统计RXD引脚的IO高电平持续时间,判断是否为有效的WuP;也可以设置SCI的波特率为200bps,判断是否能接收到数据0xf0(0xf0在总线上表现为5个0,5个1),检测出正确的WuP后,使能SCI功能,设置波特率为10400bps,等待诊断仪发送的STC Request,接收到请求后返回STC Response肯定响应,建立诊断通讯。

2.3 定时管理

ISO14230定义了4个定时参数管理字节间定时和报文间定时,诊断仪和ECU需要共同遵守这些定时约束以保证正常的诊断通讯,表2给出了这4个定时参数的含义及取值区间。

表2 定时参数

P1和P4是报文内字节间定时,P2和P3为报文间定时。诊断仪在初始化完成后或接收到诊断响应后需要在P3时间内发送诊断请求,否则ECU端退出诊断会话,断开诊断通讯,K线协议驱动器重启,等待诊断仪发出下一个WuP和STC Request。ECU在接收到诊断请求后,需要在P2时间内返回诊断响应, P2由ECU控制,通常采用25ms的固定值,当诊断请求报文中的Fmt字段指定目标地址为“功能地址”时,P2的取值需要用一个随机数发生器来产生,因为对于功能寻址的诊断仪请求来说,可能多个ECU都会返回响应,如果采用固定的P2参数的话,可能会因为多个ECU竞争总线而出现总线冲突问题,P2采用随机数,ECU不会在同一时间返回响应,从而避免了总线竞争问题。

3 协议驱动器测试

协议驱动器在Vector公司的CANoe软硬件平台上进行测试,进行基于K线的KWP2000服务测试时,将KWP2000.dll和KLineCPL.dll模块加入CANoe仿真环境,CANoe模拟诊断仪节点,并使用一个代理节点来实现CAN网络和K线之间的报文转发,此时CANoe使用计算机的串口,并通过串口/K线转换器与ECU相连,诊断实现框架如图2所示。

图2 K线诊断框架

与CAN总线诊断不同的是,K线诊断需要诊断仪通过初始化过程和ECU建立诊断通讯,诊断通讯的建立如图3所示。建立诊断通讯后便可以像CAN诊断一样进行诊断服务了,这方面论文很多,在此不再赘述。

图3 建立诊断通讯

结语

本文实现的K线协议驱动器模块经过严格测试, 能够高效完成K线诊断,性能和稳定性达到预期设计要求。驱动器独立于处理器操作系统,具有良好的通用性和灵活性,可以方便得集成到应用程序中,具有很高的实用价值和借鉴意义。

责任编辑:gt


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动器
    +关注

    关注

    52

    文章

    8226

    浏览量

    146253
  • 汽车电子
    +关注

    关注

    3026

    文章

    7941

    浏览量

    166910
  • 应用程序
    +关注

    关注

    37

    文章

    3265

    浏览量

    57677
收藏 人收藏

    评论

    相关推荐

    伺服驱动器工作原理及伺服驱动器常见接线方法

    电机的转速,因此也是一个自动调速系统。伺服驱动器工作原理图如下所示:伺服驱动器工作原理_伺服驱动器内部结构
    发表于 06-28 09:06

    伺服驱动器工作原理是什么

    高精度的传动系统定位,目前是传动技术的高端产品。下面本文就为大家介绍一下伺服驱动器工作原理。伺服驱动器均采用数字信号处理(DSP)作为控制核心,可以
    发表于 06-28 08:16

    了解伺服驱动器工作原理

    高精度的传动系统定位,目前是传动技术的高端产品。下面本文就为大家介绍一下伺服驱动器工作原理。  伺服驱动器均采用数字信号处理(DSP)作为控制核心,可以
    发表于 06-28 08:06

    伺服驱动器是什么工作原理

    伺服驱动器是什么工作原理
    发表于 10-11 07:08

    基于K线诊断协议驱动器设计指南

    是业内广泛采用的两种诊断标准【1】,K线是ISO9141定义的诊断通信总线,ISO14230在ISO9141的基础上将K线电压扩展到24V,
    发表于 09-18 16:17 17次下载
    基于<b class='flag-5'>K</b><b class='flag-5'>线</b><b class='flag-5'>诊断</b><b class='flag-5'>协议</b>的<b class='flag-5'>驱动器</b>设计指南

    基于K线/CAN总线的KWP2000协议分析

    Protocol 2000),该协议实现了一套完整的车载诊断服务,并且满足E-OBD(European On Board Diagnose)标准。KWP2000最初是基于K
    发表于 11-27 11:01 12次下载
    基于<b class='flag-5'>K</b><b class='flag-5'>线</b>/CAN总线的KWP2000<b class='flag-5'>协议</b>分析

    伺服驱动器工作原理是什么

    工作原理 目前主流的伺服驱动器均采用数字信号处理(DSP)作为控制核心, 伺服驱动器(图1) 可以实现比较复杂的控制算法,
    的头像 发表于 08-14 14:53 738次阅读
    伺服<b class='flag-5'>驱动器</b>的<b class='flag-5'>工作原理</b>是什么

    什么是伺服驱动器?伺服驱动器工作原理和应用领域

    在现代工业领域,伺服驱动器是一种关键的电气装置,它在机器控制和运动控制系统中发挥着至关重要的作用。无论是工业机器人、数控机床还是自动化生产线,伺服驱动器都是实现精准位置控制和高效运动控
    的头像 发表于 08-21 17:34 6189次阅读

    驱动器工作原理

    及应用。 一、驱动器工作原理 驱动器工作原理是通过能量转换,将输入的能量转换为机械能,从而实现对负载的
    的头像 发表于 06-10 16:08 2314次阅读

    步进电机驱动器工作原理及调速方法

    驱动器工作原理及调速方法。 一、步进电机驱动器工作原理 步进电机的基本概念 步进电机是一种电磁式电动机,其工作原理是利用电磁力矩使转子产
    的头像 发表于 06-12 09:45 3103次阅读

    半桥驱动器工作原理和应用

    半桥驱动器是一种在电力电子领域中广泛应用的电路驱动器,主要用于控制电机、电源转换和其他负载设备。以下是对半桥驱动器的详细解析,包括其定义、工作原理及相关应用。
    的头像 发表于 08-28 15:07 1901次阅读

    线路驱动器工作原理_线路驱动器输入差模电压范围

    线路驱动器工作原理主要基于信号的放大、转换和驱动技术,其工作原理可以细分为以下几个关键步骤:
    的头像 发表于 10-03 15:00 315次阅读

    步进驱动器工作原理知识你了解多少?

    ‌‌步进驱动器工作原理是通过将电脉冲转化为角位移来驱动电机。 步进驱动器是一种将电脉冲信号转换为电机角位移或线位移的执行机构。它通过接收
    的头像 发表于 09-13 15:31 285次阅读
    步进<b class='flag-5'>驱动器</b><b class='flag-5'>工作原理</b>知识你了解多少?

    步进电机驱动器的主要工作原理是什么?

    步进电机驱动器的主要工作原理是通过精确控制电机的步进角度,实现对电机位置和速度的精确控制。步进电机驱动器通常由微处理、功率放大器、
    的头像 发表于 10-24 13:40 387次阅读

    驱动器工作原理 驱动器与电机的区别

    驱动器工作原理 驱动器是一种电子设备,用于控制电机的速度、方向和扭矩。它的主要功能是将输入信号(通常是模拟或数字信号)转换为电机可以理解的控制信号。以下是驱动器的基本
    的头像 发表于 12-19 16:20 205次阅读