查看: 7436|回复: 12

[其他] lin通讯

[复制链接]

该用户从未签到

15

主题

72

帖子

0

新手上路

Rank: 1

积分
150
最后登录
1970-1-1
发表于 2012-9-16 06:54:37 | 显示全部楼层 |阅读模式
请教大家一个问题,LIN代码,发送检测函数的作用是什么,他是怎么检测的,是把自己发送的数据收回来,看看是不是和自己发送的数据一样?
/*************************************************************/
/*                       发送检测函数                        */
/*************************************************************/
Bool LINCheckSend(enum lin_state status, unsigned char val)
{
  // 等待串口数据接收到为止 
  while(frame_send.state < status)
     if(frame_send.error)
     return(FALSE);
   
  switch(status)
  {
    case _BREAK:
    case SYNCH:
      break;
     
    case PROTECTED_IDENTIFIER:
      if(frame_send.protected_id != val)
        return(FALSE);
      break;
       
    case DATA0:
    case DATA1:
    case DATA2:
    case DATA3:
    case DATA4:
    case DATA5:
    case DATA6:
    case DATA7:
      if(frame_send.data[status-DATA0] != val)
        return(FALSE);
      break;
       
    case CHECKSUM:
      if(frame_send.check != val)
        return(FALSE);
      break;
  }
  return(TRUE);

 
下面是发送代码,
/*************************************************************/
/*                     LIN发送信息函数                       */
/*************************************************************/
Bool LINSendMsg(void)
{
  unsigned char check_sum, parity_id, i;
 
  frame_send.error = 0;
 
    // 发送间隔场
    if(!LINSendbreak())
      return(FALSE);
    // 检查间隔场发送
    if(!LINCheckSend(_BREAK,0x00))
      return(FALSE);  
     
    // 发送同步场
    if(!LINSendChar(0x55))
      return(FALSE);
    // 检查同步场发送
    if(!LINCheckSend(SYNCH,0x55))
      return(FALSE); 
    // 计算奇偶校验
    parity_id=LINCalcParity(msg_send.identifier);
    // 发送标识符场
    if(!LINSendChar(parity_id))
      return(FALSE);
    // 检查标识符场发送
    if(!LINCheckSend(PROTECTED_IDENTIFIER, parity_id))
      return(FALSE); 
   
    for(i=0; i < 8; i++)
    {
      // 发送数据场
      if(!LINSendChar(msg_send.data))
        return(FALSE);
      // 检查数据场发送
      if(!LINCheckSend(DATA0+i, msg_send.data))
        return(FALSE);
    }
    check_sum = LINCalcChecksum(msg_send.data);
    // 发送校验和场
    if(!LINSendChar(check_sum))
      return(FALSE);
    // 检查校验和场发送
    if(!LINCheckSend(CHECKSUM, check_sum))
     return(FALSE); 
    frame_send.state = IDLE;
  return(TRUE);
}
 
我知道答案 目前已有11人回答
回复

使用道具 举报

该用户从未签到

0

主题

7

帖子

0

新手上路

Rank: 1

积分
12
最后登录
1970-1-1
发表于 2012-9-18 08:17:05 | 显示全部楼层

RE:lin通讯

标记一下
!!!
回复 支持 反对

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2012-9-18 08:52:18 | 显示全部楼层

    RE:lin通讯

    这里检测的主要是下面的代码,而对于其他的只是处理一下。
    // 等待串口数据接收到为止
      while(frame_send.state < status)
         if(frame_send.error)
         return(FALSE);
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    12
    最后登录
    1970-1-1
    发表于 2012-9-18 12:56:06 | 显示全部楼层

    回复:lin通讯

    回复第 3 楼 于2012-09-18 08:52:18发表:
    这里检测的主要是下面的代码,而对于其他的只是处理一下。
    // 等待串口数据接收到为止
    while(frame_send.state < status)
    if(frame_send.error)
    return(FALSE);
     
    这是是while循环,如果接收不到,岂不是就停在这了,比如LIN总线的12V没有供电的话
     
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    15

    主题

    72

    帖子

    0

    新手上路

    Rank: 1

    积分
    150
    最后登录
    1970-1-1
     楼主| 发表于 2012-9-18 14:37:52 | 显示全部楼层

    回复:lin通讯

    回复第 3 楼 于2012-09-18 08:52:18发表:
    这里检测的主要是下面的代码,而对于其他的只是处理一下。
    // 等待串口数据接收到为止
    while(frame_send.state < status)
    if(frame_send.error)
    return(FALSE);
     

    这个程序是发送,为什么还收啊,数据时从哪收来的,
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    11
    最后登录
    1970-1-1
    发表于 2012-9-19 19:48:36 | 显示全部楼层

    RE:lin通讯

    小弟菜鸟,我来回答你的问题吧,你现在发送函数式帧头,所以说,你这个ECU是主机呀,主机发送了帧头,从机发送帧相应了。这样就有数据了啊,所谓的检测应该是LIN中的增强校验。大概是这样子吧
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    11
    最后登录
    1970-1-1
    发表于 2012-9-19 19:49:54 | 显示全部楼层

    RE:lin通讯

    哥们你工作了呢,还是学生啊,交个朋友啊。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    15

    主题

    72

    帖子

    0

    新手上路

    Rank: 1

    积分
    150
    最后登录
    1970-1-1
     楼主| 发表于 2012-9-21 10:34:27 | 显示全部楼层

    回复:lin通讯

    回复第 7 楼 于2012-09-19 19:49:54发表:
    哥们你工作了呢,还是学生啊,交个朋友啊。 

    工作,你呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    15

    主题

    72

    帖子

    0

    新手上路

    Rank: 1

    积分
    150
    最后登录
    1970-1-1
     楼主| 发表于 2012-9-21 10:37:16 | 显示全部楼层

    回复:lin通讯

    回复第 6 楼 于2012-09-19 19:48:36发表:
    小弟菜鸟,我来回答你的问题吧,你现在发送函数式帧头,所以说,你这个ECU是主机呀,主机发送了帧头,从机发送帧相应了。这样就有数据了啊,所谓的检测应该是LIN中的增强校验。大概是这样子吧 

    我认为不是,TX和RX脚都接在LIN脚上所以,TX发送数据,必然RX脚上有数据,所以发生了中断接收,所以把收回来的数据和发送的数据比较一下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    11
    最后登录
    1970-1-1
    发表于 2012-9-28 14:54:19 | 显示全部楼层

    回复:lin通讯

    回复第 9 楼 于2012-09-21 10:37:16发表:
    回复第 6 楼 于2012-09-19 19:48:36发表:
    小弟菜鸟,我来回答你的问题吧,你现在发送函数式帧头,所以说,你这个ECU是主机呀,主机发送了帧头,从机发送帧相应了。这样就有数据了啊,所谓的检测应该是LIN中的增强校验。大概是这样子吧 

    我认为不是,TX和RX脚都接在LIN脚上所以,TX发送数据,必然RX脚上有数据,所以发生了中断接收,所以把收回来的数据和发送的数据比较一下
     

    这个你想多了
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-20 19:59 , Processed in 0.113713 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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