LIN协议驱动器的设计.docx

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

??引言:LIN总线做为CAN总线的有效补充,在低端车身电子领域替代CAN总线,既能满足功能要求,又能节约成本,在对成本更加敏感的国产车上得到大规模应用。不同于CAN总线有专门的协议驱动器,用户不用管理底层的通信而直接进行应用程序的编写1,LIN总线没有专门的协议驱动器,一般需要在SCI模块的基础上用软件实现其底层通信,笔者为某国产车设计了一款LIN主节点产品,结合LIN 2.0规范,首先介绍下LIN协议驱动器的功能,然后从数据链路层、应用层两个方面介绍协议驱动器的关键设计技术。1 驱动器功能:LIN规范定义了数据格式、报文格式以及基于时间片的调度通信机制,做为LIN主节点,需要实现的功能包括:1、报文的封装和发送、接收和解析,根据报文格式填充/提取ID和数据;2、通信管理,以调度表的方式控制时间片的轮转和相应帧的发送;3、网络管理,休眠和唤醒;LIN总线采取8N1的SCI数据格式,协议驱动器在SCI的基础上以软件的形式实现。软件就是“数据+操作”2,做为一个可复用、移植性强的软件模块,其数据结构和API函数的设计是软件模块设计的两个重要组成部分,下面从数据链路层和应用层两个方面介绍下协议驱动器的数据结构设计和API函数设计。?2 数据链路层:数据链路层主要实现LIN报文的发送及接收,报文格式如图1所示:图1 LIN报文格式LIN报文由报文头+响应组成,报文头包括同步间隔、同步字段和标识符三个部分,其中同步间隔为10bit 0,同步场为0x55,标识符唯一标识该报文;响应包括数据和校验和两个部分,报文数据长度由应用层设计指定,也可以认为由标识符唯一指定,校验和包括经典校验和和增强型校验和两种方式,均采用带进位加法进行计算,不同之处在于经典校验和只对数据做校验,而增强型校验和的校验数据中含有标识符,诊断报文采用经典校验和,其它报文采用增强型校验和。由于LIN物理层为单线通信,且采取一种多从的时间片轮转方式,不存在CAN总线的竞争总线问题3,所以LIN节点发送数据可以回读到同样的数据,其报文的发送和接收可以统一在SCI的接收中断中,以状态机的形式实现4,状态对应报文的各个组成部分,状态机跳转条件便是数据接收中断。根据LIN报文结构,设计如下形式的结构体,typedef struct{uchar pid;uchar datalen;uchar data[8];uchar checksum;l_bool done;l_state state;l_bool error;}l_frame;其中pid为标识符,data为报文数据,datalen为数据长度,checksum为校验和,state为状态机状态,其类型定义如下:typedef enum{l_IDLE,l_BREAK,l_SYNC,l_PID,l_DATA,l_CHECKSUM}l_state;状态机设计在SCI接收中断处理函数中实现,部分实现如下:void l_ifc_rx_BcmIfc(void){ uchar ch,tmp,i; ch=Lin_periph[SCIDRL]; switch(Cur_frame.state){ case l_IDLE: if(0x00==ch){ Cur_frame.state=l_BREAK; l_SendChar(0x55);?? }else{ Cur_frame.state=l_IDLE; } break; case l_BREAK: if(0x55==ch){ Cur_frame.state=l_SYNC; l_SendChar(Cur_sch_item-pid); }else{ Cur_frame.state=l_IDLE; }? break;? case l_SYNC: if(Cur_sch_item-pid!=ch){ Cur_frame.state=l_IDLE;? }else{ Cur_frame.state=l_PID; Cur_frame.pid=Cur_sch_item-pid; Cur_frame.datalen=Cur_sch_item-datalen; if(l_SEND==Cur_sch_item-mode){ tmp=Cur_sch_item-data[0]; l_SendChar(tmp); Cur_frame.data[0]=tmp; Cur_frame.datalen--; } } break; case l_PID: Cur_frame.state=l_DATA; if(l_SEND==Cur_sch_item-mode){ if(Cur_frame.datalen==0){ Cur_frame.check=l_CalcChksum(); l_SendChar(Cur_frame.checksum); Cu

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档