嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > LIN Bus从机动态识别帧头的关键细节

LIN Bus从机动态识别帧头的关键细节

-- The Start --

前言:

根据文中内容,我们掌握了LIN Bus从机动态识别帧头的方法。为了方便理解,文中内容都是完全基于LIN Bus协议,但是有一些关键细节在LIN Bus协议中却是一笔带过,特别容易让初学者忽略,在实际应用中却是需要特别注意并掌握的。这些关键细节决定了动态识别帧头的灵活性和可靠性。在《LIN Bus从机怎么动态识别帧头?》文中,因限于篇幅,我也没有特别提出,所以,本文就对这些关键细节梳理一遍。
1. 同步间隔段到底多长?请看下图1。


图1
图1中红框所示位置为同步间隔段。
LIN Bus协议中仅指出同步间隔段时间T_SYNBRK至少13位显性电平,也就是大于等于13位。那么问题来了,实际情况下,T_SYNBRK一定大于等于13?T_SYNBRK小于多少呢?
1)T_SYNBRK一定大于等于13?LIN Bus采用标准串口收发数据,那么最长显性电平只能是9位(数据0,1起始位显性电平+8位数据显性电平+1位隐性电平),因此,如果同步间隔段发送10位显性电平,能和标准数据区分开吗?答案当然是肯定的。我们调试时候买的LIN Bus仿真器所使用的T_SYNBRK最小值就可以设置为10。即,同步间隔段时间T_SYNBRK大于等于10是可以的,T_SYNBRK大于等于10是没问题的。
2)T_SYNBRK小于多少呢?

LIN Bus协议并没规定同步间隔段小于多少。那么实际操作的时候怎么办?严格来说,这没有标准答案。这里给出我们调试时候买的LIN Bus仿真器所使用的T_SYNBRK最长值为26作为参考。我想26源于13的两倍。

综上,同步间隔段显性电平持续时间T_SYNBRK的大小范围为【10,26】位码元。所以,我们在写从机接收源码的时候,是需要使用此范围作为同步间隔段是否正确的判断依据的。
2. 同步间隔段间隔符到底多长?请看下图2。

图2

图2中红框所示位置为同步间隔段的间隔符。


LIN Bus协议中仅指出间隔符时间T_DEL至少1个隐性码元宽度,即大于等于1码元。那么问题来了,实际情况下,T_DEL小于多少?同样,我认为这没有标准答案。这里给出我们调试时候买的LIN Bus仿真器所使用的T_DEL为2个码元作为参考。


T_DEL这是主从双方需要提前约定的。可以是1,也可以是2。个人倾向于2,因为T_DEL时间会进行GPIO切换到UART,因此,适当的留一些余量更为可靠。


3. 接收帧头或者应答突然中断,怎么办?理想情况下,我们可以按照LIN Bus协议完成帧头和应答。但是,我们做程序设计是需要充分考虑异常情况发生应该怎么办。比如,从机在接收帧头或者应答的过程中,主机突然停止了帧头或应答的发送,此时,从机该怎么办?
1)接收帧头突然中断比如,刚接收完同步间隔段,主机就停止了发送,如下图3。注意从机在接收帧头时,在还没接收到同步段0x55时,是不知道主机发送数据的波特率的。
图3此时,从机怎么办?一直等下去?等多久?不等?退出接收的条件是?
毫无疑问,一直等下去肯定是错的。因为,主机发现通讯异常,一定会启动重传机制。作为从机,要做的是,在合理时间内,尽快退出本次接收,做好下一次帧头接收的准备。
这种情况因不知道主机波特率,所以很被动。最好的办法就是按主机使用最低波特率(比如:2400bit/s)计算最长帧(124bit)的时长。超过该时长的1.4倍,那么就退出本次接收。当然也可以按最短帧(54bit)的时长的1.4倍,作为判断标准。可以根据实际系统,灵活选择。如果你还不知道124bit和54bit的由来,那得好好复习下LIN Bus协议。
2)接收应答突然中断比如,刚接收完同步段0x55,主机就停止了发送,如下图4。图4在接收同步段0x55后,就知道了主机波特率。在此之后,从机接收突然中断,其实就很好办了。就按照主机波特率按最长帧(124bit)或者最短帧(54bit)计算帧时长。超过该时长的1.4倍,则退出本次接收。
很多新手,在做这类通讯接收时,一定会忘记处理这类异常情况。我们要知道,在通讯过程中,可能发生各种异常,我们要做的就是尽可能考虑周全,避免因异常导致自己的接收异常。
小结:(1)遵守协议,但不盲从协议。协议是人写的,是人写的就会有考虑不周的地方。(2)按照协议编写源码是基础,在不违背协议的基础上,尽可能将协议没能考虑周全的细节考虑进去才能提高程序的可靠性和稳定性。(3)学会从机动态识别帧头的方法是基础,掌握各种关机细节才是成败的关键。-- The End --往期文章:



欢迎点分享、收藏、点赞、在看!谢谢!