注:
最近准备用STM32作为主机用来Lin通信,在网上查找资料的时候发现我需要的点都零散的分布在各个角落,所以这篇博客算是我的前期准备吧,将我所需要的知识点归纳一下,省的下次查找麻烦。
Lin的特征与优势
- 基于 UART/SCI 的半双工通信,低成本硬件接口;
- 单主机,多达 15 个从机,主机和从机数量遵循LIN协议推荐,以达到符合兼容性的响应;
- 典型的LIN总线中节点数目小于等于 12 个;在非标准设计中,节点数目可以大于 16 个;
- SNPD(Slave Node Position Detection)允许在上电后分配节点设备的地址;
- 通信速度 19.2Kbps @40m,在LIN v2.2中通信速度达 20Kbps(与EMC性能权衡的结果,在非标准设计中,速度到
100Kbps 也不成问题喔);- 传输介质为非屏蔽单根电子线;
- 确定性时延(Guarantee Lateny Time);
- 短消息传输,数据长度可选1, 2, 4, 8 字节;
- 基于时钟同步的广播接收,从机无需晶振或陶瓷谐振器;
- 数据校验和错误检测功能;
- 可侦测错误节点;
- 信号电压参考电池电压,在 12V 左右
- 方便使用,市场上有标准接口的模块;
- 相比 CAN 总线(及其它总线)设备成本低;
- 线束更加精简;
- 足够可靠的通信机制;
- 应用扩展简单;
- 不需要授权费用
原文链接
一、Lin总线的主从结构
LIN总线采用的是单线传输形式,应用了单主机多从机的概念,总线电平一般为12V,传输速率最高限制为20kbps。由于物理层的限制,一个LIN网络最多可以连接16个节点。
所以一个从机节点挂掉,只能影响这一节点的数据收发,但是若主机挂掉,则整个Lin总线就全部挂掉了。
二、Lin的帧结构
帧(Frame)包含帧头(Header)和应答(Response)两部分。主机任务负责发送帧头;从机任务接收帧头并对帧头所包含信息进行解析,然后决定是发送应答,还是接收应答,还是不作任何反应。
主机任务包括:
调度总线上帧的传输次序
监测数据,处理错误
提供总线上标准参考时钟
接收从机节点发出的总线唤醒命令
从机任务包括:
发送应答
接收应答
忽略应答
主机也可以将帧头和数据一并发到Lin网络上,数据可以是请求也可以是参数。
LIN的硬件比较简单,有些人认为LIN同RS232,485类似,直接用MCU的普通串口就能实现。但这是不对的,普通串口不完全能够支持LIN协议。因为LIN的帧结构中,对报文头的LIN Break时间长度有特别的要求:11bit长度的低电平. 然而用普通串口是怎么实现LIN Break的低电平长度的?发一个字节的0x00总共才8bit不够长,两个字节0x00又太长而且中间断开了不连续;就算切换低波特率来发送0x00,但是切换波特率比较耗时,高电平长度明显超过协议要求,不符合LIN协议要求。
因此普通串口作为LIN从模式还行,作为主模式完全不符合LIN的标准。作为主模式就必须使用增强型串口才能解决 LIN Break问题。
然后是软件问题,由于LIN总线是半双工通信的,通信效率低而且没有硬件过滤器,必然会对MCU的性能产生极大的影响。这种情况下采用RTOS必然是可选项,否则容易导致事件响应实时性问题。
原文链接
(1)同步间隔段
同步间隔段至少是由13位的显性电平组成,由于帧中的所有间隙或者总线空闲时总线均保持隐性电平状态。所以同步间隔段可以标志一个帧的开始。其中同步间隔段的间隔符至少为1位隐性电平。
STM32库函数有专门用来发送同步间隔段的函数: USART_SendBreak(USARTX)
(2)同步段
LIN同步以下降沿为判断标志,采用字节0x55(01010101b)进行同步。在从机节点上可以不采用高精度的时钟,由此带来的偏差,需要通过同步段来进行调整。
(3)PID段
受保护的ID的前6位叫做帧的ID,加上两个奇偶效验码后称作受保护的ID。帧ID的取值范围为0x00~0x3f总共64个,帧ID标识了帧的类别和目的地。从机任务会根据帧头ID作出反应(接收/发送/忽略应答)。其中P0与P1效验如下:
LIN总线根据帧ID号的不同,把报文分为信号携带帧、诊断帧、保留帧。
PS:从机应答帧是一个完整的帧,与帧结构中的“应答”不同!(4)数据段
数据段可以包含1-8个字节,其中包含有两种数据类型,信号(singal)和诊断消息(diagnostic
messages)。信号由信号携带帧传递,诊断消息由诊断帧传递。
协议中并没有规定哪一部分显示数据长度码的信息(这点与CAN总线不同),数据的内容与长度均是由系统设计者根据帧ID事先约定好的。总线上的数据是以广播形式发出,任何节点均可以收到,但并非对每个节点有用(与CAN相同)。具体到发布与接听是由哪个节点进行完成这个取决于应用层的软件配置,一般情况下,对于一个帧中的应答,总线上只存在一个发布节点,否则就会出现错误。事件触发帧例外,可能出现0,1,多个发布节点。
(5)效验和段
效验和段是为了对帧传输内容进行效验。效验分为标准型效验与增强型效验。采用标准型还是增强型是由主机节点管理,发布节点和收听节点根据帧ID来判断采用哪种效验和。
校验和分为标准型校验和(Classic Checksum)及增强型校验和(Enhanced Checksum)标准型校验和:校验数据段各字节
增强型校验和:数据段各字节以及受保护 ID
采用标准型校验和还是增强型校验和由主机节点管理,发布节点和各收听节点根据帧 ID 来判断采用哪种校验和。
校验方法为将校验对象的各字节作带进位二进制加法(每当结果大于等于256
时就减去255),并将所得最终的和逐位取反,以该结果作为要发送的校验和。接收方根据校验和类型,对接收数据作相同的带进位二进制加法,最终的和不取反,并将该和与接收到的校验和作加法,如果结果为0xFF,则校验和无误,这在一定程度上保证了数据传输的正确性。
例如:采用标准型校验和,Data1 = 0x4A,Data2 = 0x55,Data3 = 0x93,Data4 = 0xE5
原文链接
LIN总线波形
LIN总线的通讯上图展示的是LIN总线的通讯方式,可以看出无论什么时候帧头总是由主机节点发布,当主机节点想发布数据时,整个帧全部由主机节点发送。当从机节点想发布数据时,帧头部分由主机节点发布,应答部分由从机节点发布,这样其余节点都能收到一个完整的报文帧。可以很直接的观察到,LIN总线的通讯都是由主机节点发起的,只要合理的规定要每个节点的配置,这样就不会存在总线冲突的情况(事件触发帧冲突时采用采用冲突解决进度表)。
原文链接