在线时间352 小时
UID2053419
注册时间2014-11-27
NXP金币0
TA的每日心情 | 衰 2016-10-20 09:45 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
版主
  
- 积分
- 2223
- 最后登录
- 2023-11-20
|
本帖最后由 花溪村长 于 2016-1-27 14:54 编辑
LIN总线和KEA做主节点发送前面已经发帖说明了,可以在参考 KEA128汇总
今天的开发笔记利用LIN状态机思想实现LIN的主从机通讯
LIN的调度表,主节点来控制调度,总共有三种方式
LIN状态机思想和实现,主节点发送报文或者报头,从节点根据报头来判断是接收数据还是发送数据或者不响应
主节点状态机主要是进行调度,一般是如下,发送报头或者帧
从节点的状态机根据调度来进行处理
LIN协议的总体状态机思想
主机作为发布节点时,发送报头和数据,此时从机只需要相应对应的ID,总线波形由主机控制
从机作为发布节点时,主机进行调度,发送报头,从机发送数据和校验和,总线波形由主机和从机进行控制
KEA128实现LIN状态机思想
利用UART中断来进行相应的处理
定义LIN 总线的状态
- typedef enum
- {
- IDLE =0 , _BREAK, SYNCH, PROTECTED_IDENTIFIER, DATA0, DATA1,
- DATA2, DATA3, DATA4, DATA5, DATA6, DATA7, CHECKSUM
- }LIN_State ;
复制代码 从机中断任务,根据主节点的调度来进行相应处理
- void UART0_IRQHandler()
- {
- while (UART0->S1 & UART_S1_RDRF_MASK) //清除中断标志
- {
-
- if(!LIN_GetChar(UART0)) //获取LIN接收信息
- {
- Frame_Receive.Error = 1; //接收错误
- Frame_Receive.State = IDLE;
- }
- else if(Frame_Receive.State == PROTECTED_IDENTIFIER) //判断接收到 PID
- {
- if(Frame_Receive.PID == LIN_CalcParity(0x28)) //判断从节点接收或者响应
- {
-
- Frame_Receive.State=IDLE; //总线空闲
- //从机发送应答信息
- _re_data.ID = Frame_Receive.PID ;
- _re_data.length = 8;
- LIN_Respond_Msg(UART0,&_re_data);
- GPIO_ToggleBit(PTC,GPIO_Pin_0);
- }
- }
- else if(Frame_Receive.State == CHECKSUM)//判断LIN帧结束
- {
- if(Frame_Receive.Check == LIN_Checksum(Frame_Receive.PID,Frame_Receive.Data,8)) //检测校验和
- {
- if(Frame_Receive.Data[0] == 0x80) //接收数据响应
- GPIO_ToggleBit(PTC,GPIO_Pin_1|GPIO_Pin_2);
- else
- {
- GPIO_ResetBits(PTC,GPIO_Pin_1);
- GPIO_ToggleBit(PTC,GPIO_Pin_2);
- }
- }
- Frame_Receive.State = IDLE; //总线空闲
- }
- }
-
- }
复制代码 主节点接收从节点数据
- void UART0_IRQHandler()
- {
- while (UART0->S1 & UART_S1_RDRF_MASK) //清除中断标志
- {
- if(flag)
- {
-
- if(!LIN_GetChar(UART0)) //获取LIN接收信息
- {
- Frame_Receive.Error = 1; //接收错误
- Frame_Receive.State = IDLE;
- }
- else
- if(Frame_Receive.State == CHECKSUM)//判断LIN帧结束
- {
- if(Frame_Receive.Check == LIN_Checksum(LIN_CalcParity(0x28) ,Frame_Receive.Data,8)) //检测校验和
- {
- if(Frame_Receive.Data[7] == 0xFF)
- {
- GPIO_ResetBits(PTC,GPIO_Pin_1);
- GPIO_ToggleBit(PTC,GPIO_Pin_2);
- }
- else if(Frame_Receive.Data[7] == 0xF0)
- {
- GPIO_ResetBits(PTC,GPIO_Pin_2);
- GPIO_ToggleBit(PTC,GPIO_Pin_1);
- }
- }
- Frame_Receive.State = IDLE; //总线空闲
- flag = 0 ;
- }
- }
-
- }
-
- }
复制代码
任务中0x30为主节点发送的报文,通过按键来控制从节点上的LED
0x28为从节点的相应,主节点发送报头,从节点通过按键控制主节点的LED
实验环境Demo(ps 有木有发现有块板子的与众不同!2013的Demo板,没有外部晶振!)
CANoe监测
KEIL工程
主节点
TRK-KEA128 - LIN_Master_node.rar
(173.19 KB, 下载次数: 346)
|
|