跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YT MCAL
  4. MC03 LIN Slave Mode PID 非预期触发响应问题

MC03 LIN Slave Mode PID 非预期触发响应问题

已定时 已固定 已锁定 已移动 YT MCAL
1 帖子 1 发布者 19 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • KirkK 离线
    KirkK 离线
    Kirk YunTu
    编写于 最后由 编辑
    #1

    1. 问题背景

    1. 软件:MCAL_1_0_0 的客户代码
    2. 硬件:MC03 EVB
    3. 问题描述:
    • 客户 LIN 通信有 4 个从机节点,从节点 A 反馈报文的 CRC 校验和正好和从节点 B 的 PID 相同,就出现了从节点 B 异常反馈的情况。
      6a27b0af-885c-4e5d-bfa1-f08e15ef16bd-image.png

    • 0x8E 是 LIN 从节点 A 的校验和,正常从机响应的情况下应该是最后位,但由于 0x8E 是从节点 B 的 PID, 所以紧接着 0x8E 后面,从节点 B 又响应发送了 0xFF 和 0x3F ,此时从节点 B 就触发了LIN_ERR_RESP_STOPBIT 的错误。

    2. 问题分析

    2.1 环境搭建

    1. TSMaster 做为 LIN Master 发送 ID 为 0x0D 的从机响应
      c966ab9b-23af-48e8-b669-ebb14eca3bf8-image.png

    2. MC03 EVB Rev_A 作为从节点 A,基于 MCAL1_0_0 Lin_Slave_Demo 修改,响应 ID 为 0x0D 的报文,回复数据:0xFF, 0x7F, 0x00, 0x02, 0xE2, 0xFF, 0xFF, 0xFF,校验和为 0x8E
      4d34f150-2774-4cc4-bece-ff7c495ae4d1-image.png

    3. MC03 EVB Rev_B 作为从节点 B,直接烧入客户工程,响应 ID 为 0x0E(PID 为 0x8E) 的报文

    2.2 尝试复现

    1. 使用逻辑分析仪抓取总线的波形,波形呈现的情况跟客户现场情况一致,从节点 A 的校验和为 0x8E,与从节点 B 的 PID 相同,从而导致从节点 B 出现了异常响应
      1802c92f-e9e8-43c7-a136-6c796506b1d2-image.png

    2.3 根因分析

    1. 由于客户 LinIf_HeaderIndication 函数中,如果接收到的 PID 与代码设置响应的 PID 不一致,return RetVal 的值就是 E_NOT_OK,而驱动会对 LinIf_HeaderIndication 的返回值做判断,当 LinIf_HeaderIndication 返回值为 E_NOT_OK 的情况时,驱动不会做任何操作,状态机会一直停在接收 PID 的状态下,此时总线上的每一 Byte 都会被当作 PID 接收,因此从节点 A 的校验和 0x8E 就会被从节点 B 当初 PID 接收,并触发异常响应。之所以没有触发枕头超时错误,是因为状态机在接收 PID 模式的时候会关闭帧头超时检测。
    Std_ReturnType LinIf_HeaderIndication(NetworkHandleType Channel, Lin_PduType* PduPtr)/*PRQA S 1503 # Allow function defined but not used. Conform to design. -HaiLong*/
    {
      Std_ReturnType RetVal = E_NOT_OK;
      
      LinIf_SetReceivePID();
      LinIf_SetSendPID();
      LinIdleCounter = LIN_IDLE_HOLD;
      
      if(LinConf_LinChannel_LinChannel_0 == Channel)
      {
          if (SendConfigPid == PduPtr->Pid)
          {
              PduPtr->Cs = LIN_ENHANCED_CS;
              PduPtr->Dl = 8U;
              PduPtr->Drc = LIN_SLAVE_RESPONSE;
              PduPtr->SduPtr = ComLinFrame.ComSendType.ComSendData;
              SlaveResId = SendConfigPid;
              RetVal = E_OK;
          }
          if (RecvConfigPid == PduPtr->Pid)
          {
              PduPtr->Cs = LIN_ENHANCED_CS;
              PduPtr->Drc = LIN_MASTER_RESPONSE;
              MasterResId = RecvConfigPid;
              RetVal = E_OK;
          }
          if(LIN_Calculate_PID(0x3CU) == PduPtr->Pid)
          {
              PduPtr->Cs = LIN_CLASSIC_CS;
              PduPtr->Drc = LIN_MASTER_RESPONSE;
              MasterResId = 0x3C;
              RetVal = E_OK;          
          }
          if(LIN_Calculate_PID(0x3DU) == PduPtr->Pid)
          {
              PduPtr->Cs = LIN_CLASSIC_CS;
              PduPtr->Dl = 8U;
              PduPtr->Drc = LIN_SLAVE_RESPONSE;
              
              if(L_Data_Request(LinTpDiagData.ui8_LinTpDiagResponse) == E_OK)
              {
                PduPtr->SduPtr = LinTpDiagData.ui8_LinTpDiagResponse;
                RetVal = E_OK;
              }
              else
              {
                /*do nothing*/
              }
              SlaveResId = 0x3D;
          }
      }
      return RetVal;
    }
    

    2.4 解决方案

    1. MCAL_1_0_0 中 LinIf_HeaderIndication 函数的返回值必须 E_OK

    3. 补充说明

    1. MCAL_2_3_0 驱动已经修复了这个风险点

    1 条回复 最后回复
    0

  • 云途开发生态介绍

    快速上手云途开发生态

  • 云途论坛规则/Yuntu Forum Rules

    发帖前请查看

  • YT CONFIG TOOL调查问卷

    帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

  • can
    24
    demo
    21
    lin stack
    13
    uds
    13
    md14
    6
    fbl
    5
    yt-link
    5
    adc模块
    4
    Online Users
    abcdA
    abcd
    • 登录

    • 登录或注册以进行搜索。
    • 第一个帖子
      最后一个帖子
    0
    • 版块
    • 最新
    • 标签
    • 热门