Lin通信点亮灯实验
通过STM32的串口发送数据,然后通过串口转换模块将数据转换成LIN(Local Interconnect Network)协议,最终控制点亮灯。需要工程和入门资料的可以私信我,看到了马上回。
入门书本推荐:
一、Lin协议 帧结构
二、代码讲解
这个结构写成代码如下:
同步间隔段(Break Field)
是至少(注1)持续 13 位(以主机节点的位速率为准)的显性(低电平)电平,直接用hal库自带的HAL_LIN_SendBreak函数就行啦;同步段(Sync Byte Field)
LIN 同步以下降沿为判断标志,采用字节 0x55(转换为二进制为 01010101b);受保护的ID
,是用函数计算出来的 把从厂家那得到的设备ID
,我这里是0X03,传入函数,计算得出受保护的ID;
数据段
,从厂家那得到的点灯报文0x01,0x10,0xFF,0xFF,0x10,0x05,0x05,0x05
(每种设备的不同);校验和段
,传入参数计算得到;
三、while函数
通过STM32的串口发送数据,然后通过串口转换模块将数据转换成LIN(Local Interconnect Network)协议,最终控制点亮灯。
四、注意点
1、Lin通信需要设置正确的波特率;
我是这么做的,在确保串口可以发送,Lin信息口有信号的(通信打通了)前提下,使用逻辑分析仪
(示波器也行),测出了它接收的波特率,然后设置对应串口波特率。
利用逻辑分析仪测波特率
波特率就是每秒能发送多少个位,计算器算一下 1÷53 差不多是 0.1887,而 1s = 10^6us,乘一下18870差不多,波特率就设为19200(有误差嘛)。然后我灯就点亮了。
测一下前面的显性电平的数量
四舍五入,没错,是13个。
2、间隔段的发送前要设置 显性电平数量;
HAL_LIN_Init()
中的13
就是设置13个显性电平
,我测过,没有这句,它只会产生10个,不符合要求,灯点不亮。这句是配合下面那个sendbreak 一起用的。