如何采集LIN报文

如何采集LIN报文,第1张

本文中关于LIN报文帧结构的5个部分,图片及部分文字参考公众号“汽车ECU设计”的相关内容,只是对其部分描述进行了简化和补充。

LIN的全称为LocalInterconnect Network。LIN主要功能是为CAN总线网络提供辅助功能,在传统车上应用最多的场合就是自动车窗、车灯、后视镜这些节点。LIN的一大优点是成本低,而且走线也更简单,只是一根线就好了,而不用像CAN总线一样需要双绞线。但其最大传输速率为20Kbps。

在说LIN总线之前,先把物理层的东西搬出来,下图就是目前应用最为广泛的LIN总线的应用电路,图片是从TJA1021的规格书中截图出来的。

作为主节点的LIN收发器电路是有一个1K上拉到Vbat的电阻,而如何改变LIN总线上的电位,也就是通过LIN收发器内部的MOSFET的拉低来实现的。因此,LIN总线实际上是一个12V电平的方波信号,之前我用示波器录过一段LIN总线上的波形,可惜找不到了,只能抄网络上别人的图来写了。

LIN总线的特点

1.采用单主多从的组网方式,无CAN总线那样的仲裁机制,最多可连接16个节点(1主15从)。2.对硬件要求简单,仅需UART/SCI接口,辅以简单驱动程序便可实现 LIN 协议。故几乎所有的MCU均支持LIN。3.不需要单独的晶振,便能完成主、从节点的同步,硬件成本大幅降低。4.仅使用一根信号线便可完成信息的传输,即所谓的单总线设备。5.传输速率最高可达20Kbps,符合A类网络标准,满足车身控制需要。6.LIN 网络中新节点的加入,对网络中其他原有节点的软硬件设计不会造成影

初始化子程序CANINIT()

选用CAN2. 0协议构建CAN总线控制网络,对SJA1000的初始化主要包括工作方式的设置、验收代码寄存器ACR、验收屏蔽寄存器AMR、波特率的参数设置等。

void caninit(void) /*SJA1000的初始化子函数*/

{control = 1; /*禁止超载、出错及接收中断,并置复位请求位使其进入复位状态*/

while (control&0x01== 0)

acceptancecode = 0x01; /*验收码寄存器(存机号1号)*/

acceptancemask= 0xfe ; /*验收屏蔽码寄存器*/

bustiming0= 0x03; /*总线定时寄存器0,同步跳转宽度

T0= T,BPS= 125 k*/

bustiming1= 0x18; /*总线定时寄存器1,T1= 9T,T2=2T,波特率为500kbit/S*/

outputcontrol = 0x1A; /*正常输出方式,TX1引脚悬浮*/

clockdivider = 0x40; /*BASICCAN模式,RX1接固定电平*/

control = 0x1A; /*清复位请求,使其进入工作状态*/

}

发送cansend()

发送子程序负责节点报文的发送,由CAN控制器SJA1000独立完成,将命令寄存器里的发送请求标志置位,即可发送SJA1000发送缓冲区中的报文。

void cansend(unsigned char ID ,char*xdata) /*该子函数完成一帧数据的发送*/

{while ( (status&0x10)>>4 == 1)NOP; /*检查上次请求发送是否完成*/

while ( (status&0x04)>>2== 0)NOP

Transmitbuffer1= ID

Transmitbuffer2= 0x08

Transmitbuffer3= txdata[0]

Transmitbuffer10= txdata[7]

Command = 0x05 ; /*发送请求*/

while ( (status&0x08)>>3== 0)

}

接收子程序canreceive ()

接收子程序负责节点报文的接收。SJA1000自动接收发往该节点的数据并将收到的数据放到它的接收缓冲器中。

SJA1000的报文接收主要有2种方式:中断接收方式和查询接收方式。系统采用的是中断接收方式。

{unsigned char ir

ir = interrupt; /*获得SJA1000的中断状态*/

EA= 0

If ( (ir&0x04)>>2== 1)error ( ); /*如果是出错中断,则调出错处理函数*/

If ( (ir&0x08)>>3== 1)overruN( ); /*如果是超载中断,则调超载处理函数*/

While ( ( (ir&0x04)>>2== 1)‖( ( (ir&0x08)>>3)== 1){NOP}

RxID[0] = Receivebuffer1

RxID[0] = Receivebuffer2

If ( ( (Receivebuffer2&0x10)>>4)== 0) /*如果是数据帧,则接收数据*/

{Rxdata[0] = Receivebuffer3

.

Rxdata[7] = Receivebuffer10

Command = 0x04 ; /*SJA1000的接收缓存器被释放*/

}

else if ( ( (Receivebuffer2&0x10)>>4)== 1) /*如果是远程帧,则作相应处理*/

{ /*相应处理程序*/

EA= 1

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12102423.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存