-- The Start --
前言:
本文对LIN总线协议就不再赘述。近期,我们也在调试LIN BUS从机通讯。刚开始调试,还是跳过一些坑,不过现在已经上岸。本文就将LIN Bus从机通讯最关键的动态识别数据帧头的方法分享给大家。
1. 复习LIN总线数据帧数据帧格式,请看下图1。

如图1所示,LIN总线数据帧结构包括两大部分:帧头和应答。帧头部分,一定是主机发出。应答部分,可能是主机发出,也可能是从机发出。本文不做讲解。
从数据帧结构就可以知道,LIN总线通讯都是由主机发起,从机被动响应。从机要能正确响应主机的前提就是能正确接收主机发出的帧头。
这里值得提醒以下两点:(1)因LIN总线只有一根传输线,所以LIN通讯一定是半双工。(2)从机除了会接收到主机发出的信息外,也会接收到自己发出的信息,还会接收到其他从机发出的信息。
综上,从机能否正确识别主机发出的数据帧头就显得格外重要了!一旦识别错误,那就乱套了!
2. 数据帧头数据帧头格式,请看下图2。

如图1所示,帧头包含三部分:同步间隔段、同步段和PID段。同步间隔段(14位)=至少13位显性电平0+1位隐性电平1。实际情况,最大发送13位显性电平0。同步段(10位)=0x55=1位显性电平0+8位数据+1位隐性电平1。PID(10位)=1显性电平0+6位PID值+2位PID值奇偶校验+1位隐性电平1。
有同学看完帧头的数据格式后,立马感觉接收这样的帧头很简单,心想用串口UART不就接收了。是这样吗?分析如下:(1)14位同步间隔段,可用串口接收?当然不可以。就算能,那么还能接着接收后续的10位同步段和PID段吗?当然不能,因为前后数据长度都一样。
(2)10位同步段和10位PID,可以用串口接收?可以,但是,前提是必须知道主机发送数据的波特率。注意按照LIN总线协议,从机是被动响应主机,主机用什么波特率发送数据,从机是不知道的。既然从机不知道主机发送数据的波特率,怎么接收?
(3)先用GPIO中断接收同步间隔段,再改用串口接收同步段、PID以及后续应答部分。这种方法理论上可以。但是,这种方法能成功的前提还是必须知道主机发送数据的波特率。否则,无法知道使用GPIO中断测量的下降沿到上升沿的时间是否正确。即,如果从机不知道主机波特率,那么该方法也不能正确接收同步间隔段。
那么,从机有没有一种方法,在不知道主机波特率的情况下,还能正确完成帧头接收呢?答案当然是肯定的。我们称这类方法为:动态识别帧头。简而言之,主机随机使用任意一种波特率发送数据帧,从机都能正确接收。
3. 动态识别帧头的方法首先需要选择一颗IO具备复用功能的微控器,即同一个IO口即可以复用为通用IO口(GPIO),也可以复用为UART且UART具备自动波特率检测功能。配置串口为8位数据、无奇偶校验、1个停止位,波特率任意。
动态识别帧头的步骤:步骤1:测量同步间隔段的长度,但不做对错判断。复用IO为GPIO。等待触发IO下降沿中断,当触发IO下降沿中断时,启动TimerA。
在触发IO下降沿中断后,等待触发IO上升沿中断。当触发IO上升沿中断后,读取TimerA并记录下降沿到上升沿的时间Tsbf_test,再重启TimerA。最后,复用IO为UART,并启动自动波特率检测功能。
步骤2:UART接收同步段0x55并逆向计算UART波特率,并返回判断同步间隔段是否正确。等待触发UART接收中断,当触发UART接收中断时,读取串口接收值并判断是否等于0x55且是UART接收的第一个字节。如果是,读取TimerA并记录时间为Tsf_test(注意,Tsf_test为11位码元宽度的时间。),再通过Tsf_test计算波特率BAUD。如果不是,那么返回步骤1。
根据BAUD,分别计算9.5位码元宽度的时间T_9.5bits和13位码元宽度的时间T_13bits。判断测量的同步间隔段时间Tsbf_test是否大于等于T_9.5bits且小于等于T_13bits。如果是,说明同步间隔段和同步段都接收OK,那么进入步骤3。如果不是,那么返回步骤1。
步骤3: UART接收PID并根据PID奇偶校验算法校验PID数据是否正确。如果串口接收的第二个字节数据通过PID奇偶校验算法校验,那么认为PID接收正确。至此,帧头接收完毕!
如果不成立,那么返回步骤1。
小结:(1)LIN数据帧头看似简单,但是因为只有一根传输线,所以从机会收到自己、其他从机和主机的信号。如果没有严谨的接收逻辑,那么大概率会接收失败。(2)LIN从机因不知道主机波特率,成为准确接收主机数据的最大难题。(3)先使用GPIO中断模糊接收同步间隔段,不做对错判断。然后,在准确接收到同步段0x55后,先逆运算波特率,再返回判断同步间隔段是否正确。不失为一种很好的方法。(4)以上LIN从机动态识别帧头的方法,都必须基于IO复用功能和UART自动波特率功能。关于自动波特率的工作原理,本文不做赘述。-- The End --往期文章:
欢迎点分享、收藏、点赞、在看!谢谢!