“容百科技”为LP:投资6.4亿进军电池领域
06-18
简介: LIN总线是CAN总线的有效补充,在低端车身电子领域取代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){ 情况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; }否则{ 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; 情况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); Cur_frame.done=1; }else{ tmp=Cur_sch_item->data[Cur_sch_item->datalen-Cur_frame.datalen]; l_SendChar(tmp); Cur_frame.data[Cur_sch_item->datalen-Cur_frame.datalen]=tmp; Cur_frame.datalen--; } }else{ Cur_frame.data[ 0]=ch; Cur_frame.datalen--; } break; case l_DATA: ... break; case l_CHECKSUM: default : break; } } 在声明变量和函数时,均以“l_”开头,这样可以避免跟其他模块在变量和函数命名空间上的冲突,从而增强了可移植性。
3应用层: 应用层主要实现报文信号访问及通信管理。
3.1信号访问 首先根据信号在消息数据域中的位置和长度,为每个消息的数据域设计相应的结构体,然后以结构体成员变量的形式访问信号。
以阳光传感器与该节点通信发送的消息为例。
消息数据字段长度为l_SunSensLen=4。
其信号包括阳光采样值、大灯操作请求、小灯操作请求等。
消息数据字段结构如下所示: typedef struct { l_bool l_ss_sshealth:1; l_u8 l_ss_headlampreq: 2; l_bool l_ss_poslampreq:2; l_u8:3; l_u8 l_ss_ssvalue:8; l_u8 l_ss_headlampswth:8; l_bool l_ss_sserror:1; l_u8 :3; l_u8 l_ss_ssmsgcounter:4; }l_ss_msgType; 为了方便使用,定义一个 union 如下: typedef union { l_u8 data[l_SunSensLen]; l_ss_msgType sun感觉; }l_ss_msgBuf; 为此消息数据字段l_SunSens定义全局变量l_ss_msgBuf;采取“无”带复制的访问方式5,直接对LIN信号赋值并获取值,如读写l_SunSens.sunsens.l_ss_headlampreq来实现对大灯操作请求信号的访问。
采用这种方式的原因是采用调度方式的LIN消息周期是固定的,信号变化速度是调度长度的整数倍,对于LIN应用来说,基本上在几百毫秒的数量级。
应用程序对LIN非常敏感。
信号数据的访问速度远大于这个变化速度,即数据在变化之前就已经被访问了,并且节省了变量空间 3.2 通信管理 LIN通信使用时间。
调度管理是调度通信的核心,调度条目的数据结构如下: typedef struct { uchar handle; uchar pid; l_Resp_mode 模式; uchar datalen; uchar *data; uchar 刻度; }l_sch_table_item; 调度表是一个l_sch_table_item结构体数组,pid表示该条目对应的是哪条消息,mode表示节点是发送还是接收数据字段,*data是消息数据字段结构体的地址,ticks是时间长度slot,在初始化调度数组时,将消息数据字段结构体变量的地址赋给调度表项中的*data,从而实现访问方法部分的“无需复制的访问方法”。
调度表是一个循环序列。
当时间表到达表尾时,切换到表头并继续旋转。
调度表的轮转函数如下: void l_sch_tick(void) { if(1==TM [LIN_TIMESLOT_MS].overflow_flag){ TM[LIN_TIMESLOT_MS].overflow_flag=0 ; if(Cur_sch_item==&l_sch_table_main[l_MAIN_SLOTS-1]){ Cur_sch_item=l_sch_table_main; }否则{ Cur_sch_item++; } Cur_ frame.state=l_IDLE; Cur_frame.done=0; Cur_frame.error=0; if(Cur_sch_item->pid!=l_Freepid){ l_SendBreak(); }else{ ; } TimerStart(LIN_TIMESLOT_MS,Cur_sch_item->ticks,0,1); } } 应用层函数还包括睡眠和唤醒函数,这里不再详细介绍。
结论 本文实现的LIN协议驱动模块可以轻松集成到应用程序中,并且独立于所使用的特定处理器和操作系统。
具有良好的可移植性,具有良好的实用价值和参考价值。
意义。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-18
06-18
06-08
06-18
06-17
06-18
06-06
06-17
06-18
最新文章
使用电子管有哪些注意事项?如何检查电子管之间是否短路?
博通支付1200万美元和解SEC财务欺诈指控
八名运营商高管确认加入虚拟运营商
内蒙古农牧区雷电灾害成因分析及防雷对策
北京联通将5G应用于世园会远程医疗急救
TD-SCDMA最后一轮冲刺测试启动,产业前景更加光明
专访阿里云总裁王健:云计算服务平台梦想成真
USB2.0控制器CY7C68013的接口设计与实现