K线诊断协议驱动器设计.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
K线诊断协议驱动器设计

K线诊断协议驱动器设计 Time:2012-03-22 11:49:41??Author:??Source:中电网 关键字:K线诊断,汽车电子控制单元,协议驱动器 分享到: 引言: 随着汽车电子控制单元功能的增加及升级换代的需要,诊断功能已经成为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所示。 OSI模型 K线诊断协议 应用层 ISO14230-3 表述层 N/A 会话层 N/A 传输层 N/A 网络层 N/A 数据链路层 ISO14230-2 物理层 ISO14230-1 表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所示: 报文头 数据字段 校验和 Fmt Tgt Src Len Sid Data CS 最大4个字节 最大63字节或255字节 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[S

文档评论(0)

wuyuetian + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档