查看: 15280|回复: 14

[原创] [TRK-KEA128 开发笔记]KEA128 LIN 总线状态机实现

[复制链接]
  • TA的每日心情

    2016-10-20 09:45
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    80

    主题

    1038

    帖子

    5

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2223
    最后登录
    2023-11-20
    发表于 2016-1-27 14:43:35 | 显示全部楼层 |阅读模式
    本帖最后由 花溪村长 于 2016-1-27 14:54 编辑

    LIN总线和KEA做主节点发送前面已经发帖说明了,可以在参考 KEA128汇总
    今天的开发笔记利用LIN状态机思想实现LIN的主从机通讯
    LIN的调度表,主节点来控制调度,总共有三种方式 调度表.png
    LIN状态机思想和实现,主节点发送报文或者报头,从节点根据报头来判断是接收数据还是发送数据或者不响应
    主节点状态机主要是进行调度,一般是如下,发送报头或者帧
    状态机.png
    从节点的状态机根据调度来进行处理
    slave State.png

    LIN协议的总体状态机思想


    State Machine.png

    主机作为发布节点时,发送报头和数据,此时从机只需要相应对应的ID,总线波形由主机控制

    Master Bus.png
    从机作为发布节点时,主机进行调度,发送报头,从机发送数据和校验和,总线波形由主机和从机进行控制

    slave bus.png
    KEA128实现LIN状态机思想
    利用UART中断来进行相应的处理

    定义LIN 总线的状态
    1. typedef enum
    2. {
    3.     IDLE =0 , _BREAK, SYNCH, PROTECTED_IDENTIFIER, DATA0, DATA1,
    4.     DATA2, DATA3, DATA4, DATA5, DATA6, DATA7, CHECKSUM
    5. }LIN_State ;
    复制代码
    从机中断任务,根据主节点的调度来进行相应处理
    1. void UART0_IRQHandler()
    2. {

    3.         while (UART0->S1 & UART_S1_RDRF_MASK)  //清除中断标志
    4.         {
    5.                   
    6.                 if(!LIN_GetChar(UART0))  //获取LIN接收信息
    7.     {
    8.       Frame_Receive.Error = 1; //接收错误
    9.       Frame_Receive.State = IDLE;
    10.     }
    11.                 else if(Frame_Receive.State == PROTECTED_IDENTIFIER) //判断接收到 PID
    12.                         {
    13.                                  if(Frame_Receive.PID == LIN_CalcParity(0x28)) //判断从节点接收或者响应
    14.                                  {
    15.                                                 
    16.                                                  Frame_Receive.State=IDLE;             //总线空闲
    17.                                             //从机发送应答信息
    18.                                                  _re_data.ID = Frame_Receive.PID ;
    19.                                                  _re_data.length = 8;
    20.                                                  LIN_Respond_Msg(UART0,&_re_data);
    21.                                                   GPIO_ToggleBit(PTC,GPIO_Pin_0);
    22.                                  }
    23.                         }
    24.                  else if(Frame_Receive.State == CHECKSUM)//判断LIN帧结束
    25.                          {
    26.                                  if(Frame_Receive.Check == LIN_Checksum(Frame_Receive.PID,Frame_Receive.Data,8)) //检测校验和
    27.                                  {
    28.                                          if(Frame_Receive.Data[0] == 0x80)  //接收数据响应
    29.                                                 GPIO_ToggleBit(PTC,GPIO_Pin_1|GPIO_Pin_2);
    30.                                          else
    31.                                          {
    32.                                                  GPIO_ResetBits(PTC,GPIO_Pin_1);
    33.                                                  GPIO_ToggleBit(PTC,GPIO_Pin_2);
    34.                                          }
    35.                                  }
    36.                                  Frame_Receive.State = IDLE; //总线空闲
    37.                         }                        
    38.         }
    39.         
    40. }
    复制代码
    主节点接收从节点数据
    1. void UART0_IRQHandler()
    2. {
    3.         while (UART0->S1 & UART_S1_RDRF_MASK)  //清除中断标志
    4.         {
    5.                 if(flag)
    6.                 {
    7.                         
    8.                         if(!LIN_GetChar(UART0))  //获取LIN接收信息
    9.                         {
    10.                                 Frame_Receive.Error = 1; //接收错误
    11.                                 Frame_Receive.State = IDLE;
    12.                         }
    13.                          else
    14.                          if(Frame_Receive.State == CHECKSUM)//判断LIN帧结束
    15.                          {
    16.                                  if(Frame_Receive.Check == LIN_Checksum(LIN_CalcParity(0x28) ,Frame_Receive.Data,8)) //检测校验和
    17.                                  {
    18.                                           if(Frame_Receive.Data[7] == 0xFF)
    19.                                                 {
    20.                                                         GPIO_ResetBits(PTC,GPIO_Pin_1);
    21.                                                   GPIO_ToggleBit(PTC,GPIO_Pin_2);
    22.                                                 }
    23.                                                 else if(Frame_Receive.Data[7] == 0xF0)
    24.                                                 {
    25.                                                         GPIO_ResetBits(PTC,GPIO_Pin_2);
    26.                                                   GPIO_ToggleBit(PTC,GPIO_Pin_1);
    27.                                                 }        
    28.                                  }
    29.                                  Frame_Receive.State = IDLE; //总线空闲
    30.                                  flag = 0 ;
    31.                         }                        
    32.                 }                        
    33.                
    34.         }
    35.         
    36. }
    复制代码

    任务中0x30为主节点发送的报文,通过按键来控制从节点上的LED
    0x28为从节点的相应,主节点发送报头,从节点通过按键控制主节点的LED

    实验环境Demo(ps 有木有发现有块板子的与众不同!2013的Demo板,没有外部晶振!)
    IMG_20160127_131525.jpg
    CANoe监测
    QQ截图20160128131700.png
    QQ截图20160128131727.png

    KEIL工程
    主节点
    TRK-KEA128 - LIN_Master_node.rar (173.19 KB, 下载次数: 346)
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16708
    最后登录
    1970-1-1
    发表于 2016-1-27 15:21:41 | 显示全部楼层
    村长资源挺丰富的嘛,学习一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2016-1-27 16:10:26 | 显示全部楼层
    谢谢村长的分享
    nxpic.org.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2017-4-27 10:34
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    507

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1450
    最后登录
    2020-8-3
    发表于 2016-1-27 16:12:03 | 显示全部楼层
    工具也很多
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    4
    最后登录
    2016-1-27
    发表于 2016-1-27 19:19:02 | 显示全部楼层
    村长厉害              
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-12 00:23
  • 签到天数: 745 天

    连续签到: 1 天

    [LV.9]以坛为家II

    27

    主题

    1万

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    6868
    最后登录
    2020-7-15
    发表于 2016-1-28 18:13:24 | 显示全部楼层
    村长高人!
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    2021-3-10 19:44
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    126

    主题

    525

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2018
    最后登录
    2023-12-25
    发表于 2016-1-30 15:07:18 | 显示全部楼层
    可以可以!思路很清晰~
    很开心
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    40

    主题

    500

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1089
    最后登录
    2025-1-13
    发表于 2016-3-20 12:17:13 | 显示全部楼层
    谢谢,分享!!!!!!
    xingxiny75@gmail.com.png
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    5

    帖子

    0

    新手上路

    Rank: 1

    积分
    18
    最后登录
    2016-10-10
    发表于 2016-8-25 16:59:11 | 显示全部楼层
    好资料,谢谢分享!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    37
    最后登录
    2020-1-14
    发表于 2018-4-11 10:32:07 | 显示全部楼层
    村长,slave node是要有外部晶振的吗,我的板子没有外部晶振,程序死在了时钟初始化里
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-25 11:05 , Processed in 0.101316 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表