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

YunTu Forum

YTMicro.com
  1. 主页
  2. Discussion & Question
  3. YT MCAL
  4. YTM32MC03 MCAL LIN Slave 发送回环测试异常

YTM32MC03 MCAL LIN Slave 发送回环测试异常

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

    现象:MCU 作为 LIN Slave,接收上位机报文正常(RX 通路完好),回复报文时底层回环测试失败——UART TX 引脚已通过示波器确认发出了正确的波形(19200bps,帧格式正确),但 MCU 内部 RX 未对该回环信号产生 RXIF 中断,导致 TX 状态机无法推进,TxConfirmation 回调永不触发。

    已确认:

    同一块硬件使用 SDK 工程可正常收发
    示波器实测 TX 引脚波形符合预期,排除 TX 未发出或比特率错误
    UART0_IRQHandler 在回环期间完全不触发,说明问题在 UART 硬件层面——RX 未识别到 RXD 引脚上的回环信号

    735ce842-b25a-4cdd-96eb-87f8cfdcf6e3-image.png

    1 条回复 最后回复
    0
    • RuiXuR 离线
      RuiXuR 离线
      RuiXu YunTu
      编写于 最后由 编辑
      #2

      在错误回调函数LinIf_LinErrorIndication中观察LIN是否报错

      1 条回复 最后回复
      0
      • RuiXuR 离线
        RuiXuR 离线
        RuiXu YunTu
        编写于 最后由 编辑
        #3

        用的MCAL哪个版本?

        lxhxssL 1 条回复 最后回复
        0
        • lxhxssL 离线
          lxhxssL 离线
          lxhxss
          编写于 最后由 编辑
          #4

          没有报错
          image.png
          image.png

          1 条回复 最后回复
          0
          • lxhxssL 离线
            lxhxssL 离线
            lxhxss
            回复了RuiXu 最后由 编辑
            #5

            RuiXu RuiXu RuiXu 2_3_0版本 回退了 1.0.0也一样

            1 条回复 最后回复
            0
            • RuiXuR 离线
              RuiXuR 离线
              RuiXu YunTu
              编写于 最后由 编辑
              #6

              我没有理解那两张图片的意思,可否详细说一下?

              lxhxssL 1 条回复 最后回复
              0
              • lxhxssL 离线
                lxhxssL 离线
                lxhxss
                编写于 最后由 编辑
                #7

                这个是函数 Lin_Lld_Uart_LocSlaveRxOk 每个状态进入的次数 进入一次就累计一次,累计发送了 27次 SLAVE 回复 MASTER 的相关报文

                1 条回复 最后回复
                0
                • lxhxssL 离线
                  lxhxssL 离线
                  lxhxss
                  回复了RuiXu 最后由 编辑
                  #8

                  RuiXu 这样说不知道有没有表达清楚 您有理解吗

                  1 条回复 最后回复
                  0
                  • RuiXuR 离线
                    RuiXuR 离线
                    RuiXu YunTu
                    编写于 最后由 编辑
                    #9

                    还是不是很清楚,收发流程是怎么样的,可以给我看看LIN收发的代码吗?

                    lxhxssL 2 条回复 最后回复
                    0
                    • lxhxssL 离线
                      lxhxssL 离线
                      lxhxss
                      回复了RuiXu 最后由 编辑
                      #10

                      RuiXu 主函数就是demo的

                      这是历程中的底层函数

                      uint8 temp2[22];

                      LIN_FUNC void Lin_Lld_Uart_LocSlaveRxOk(const uint8 Channel, volatile UART_Type Base, uint8 ResData)
                      {
                      #if (LIN_SLAVE_API_SUPPORT == STD_ON)
                      Lin_PduType TmpPduInfo;
                      #endif
                      if (LIN_DRV_HW_SYNC_FIELD == Lin_LocUartHwStatus[Channel])
                      {
                      /
                      check whether 0x55 /
                      if (LIN_CONST_SYNC_FIELD_DATA == ResData)
                      {
                      temp2[0]++; /
                      SYNC match → ID_FIELD /
                      /
                      start receive pid /
                      Lin_LocUartHwStatus[Channel] = LIN_DRV_HW_ID_FIELD;
                      }
                      else
                      {
                      temp2[1]++; /
                      SYNC mismatch → error + IDLE /
                      #if (LIN_SLAVE_API_SUPPORT == STD_ON)
                      LinIf_LinErrorIndication(Channel, LIN_ERR_HEADER);
                      #endif
                      /
                      enable break detect /
                      Lin_Lld_Uart_LocEnableLbkDtc(Base);
                      /
                      state idle /
                      Lin_LocUartHwStatus[Channel] = LIN_DRV_HW_IDLE_MODE;
                      }
                      }
                      else if (LIN_DRV_HW_ID_FIELD == Lin_LocUartHwStatus[Channel])
                      {
                      /
                      stop header res timeout tick /
                      Lin_Lld_Uart_LocStopToTicks(Channel);
                      #if (LIN_SLAVE_API_SUPPORT == STD_ON)
                      TmpPduInfo.Pid = ResData;
                      TmpPduInfo.SduPtr = &Lin_DrvUartFrameSdu[Channel][0];
                      TmpPduInfo.Dl = LIN_CONST_MAX_FRAME_BYTES_NUM;
                      TmpPduInfo.Drc = LIN_FRAMERESPONSE_IGNORE;
                      TmpPduInfo.Cs = LIN_ENHANCED_CS;
                      if (E_OK == LinIf_HeaderIndication(Channel, &TmpPduInfo))
                      {
                      temp2[2]++; /
                      ID_FIELD + HeaderIndication OK /
                      Lin_LocCurrentPdu[Channel].Pid = TmpPduInfo.Pid;
                      Lin_LocCurrentPdu[Channel].Drc = TmpPduInfo.Drc;
                      Lin_LocCurrentPdu[Channel].Cs = TmpPduInfo.Cs;
                      Lin_LocCurrentPdu[Channel].Dl = TmpPduInfo.Dl;
                      if ((0U == TmpPduInfo.Dl) || (8U < TmpPduInfo.Dl))
                      {
                      temp2[3]++; /
                      ID_FIELD + OK + invalid Dl /
                      Base->INTF = Base->INTF;
                      Lin_Lld_Uart_LocEnableLbkDtc(Base);
                      Lin_LocUartHwStatus[Channel] = LIN_DRV_HW_IDLE_MODE;
                      return;
                      }
                      if (LIN_FRAMERESPONSE_RX == TmpPduInfo.Drc)
                      {
                      temp2[4]++; /
                      ID_FIELD + OK + RX → DATA_FIELD /
                      /
                      start slave res timeout tick /
                      Lin_Lld_Uart_LocStartToTicks(Channel, LIN_DRV_TO_S_RECEIVE);
                      Lin_LocUartTimeoutType[Channel] = LIN_DRV_TO_S_RECEIVE;
                      Lin_DrvUartDataCount[Channel] = 0U;
                      Lin_LocUartHwStatus[Channel] = LIN_DRV_HW_DATA_FIELD;
                      }
                      else if (LIN_FRAMERESPONSE_TX == TmpPduInfo.Drc)
                      {
                      temp2[5]++; /
                      ID_FIELD + OK + TX → DATA_FIELD /
                      Base->CTRL0 = UART_CTRL0_RXEN_MASK | UART_CTRL0_TXEN_MASK;
                      Base->RXFIFO = UART_RXFIFO_RESET_MASK | UART_RXFIFO_EN_MASK;
                      Base->DATA = TmpPduInfo.SduPtr[0];
                      Lin_DrvUartSentData[Channel] = TmpPduInfo.SduPtr[0];
                      Lin_DrvUartDataCount[Channel] = 1U;
                      for (uint8 Index = 0u; Index < TmpPduInfo.Dl; ++Index)
                      {
                      Lin_DrvUartFrameSdu[Channel][Index] = TmpPduInfo.SduPtr[Index];
                      }
                      Lin_DrvUartFrameChecksum[Channel] = Lin_Lld_Uart_LocGetChecksumByte(&Lin_LocCurrentPdu[Channel]);
                      Lin_LocUartHwStatus[Channel] = LIN_DRV_HW_DATA_FIELD;
                      }
                      else /
                      slave to slave /
                      {
                      temp2[6]++; /
                      ID_FIELD + OK + IGNORE → IDLE /
                      Base->INTF = Base->INTF;
                      Lin_Lld_Uart_LocEnableLbkDtc(Base);
                      Lin_LocUartHwStatus[Channel] = LIN_DRV_HW_IDLE_MODE;
                      }
                      }
                      else
                      #endif
                      {
                      temp2[7]++; /
                      ID_FIELD + HeaderIndication NOT_OK → IDLE /
                      Base->INTF = Base->INTF;
                      Lin_Lld_Uart_LocEnableLbkDtc(Base);
                      Lin_LocUartHwStatus[Channel] = LIN_DRV_HW_IDLE_MODE;
                      }
                      }
                      else if (LIN_DRV_HW_DATA_FIELD == Lin_LocUartHwStatus[Channel])
                      {
                      if (LIN_FRAMERESPONSE_RX == Lin_LocCurrentPdu[Channel].Drc)
                      {
                      Lin_DrvUartFrameSdu[Channel][Lin_DrvUartDataCount[Channel]] = ResData;
                      ++Lin_DrvUartDataCount[Channel];
                      if (Lin_DrvUartDataCount[Channel] >= Lin_LocCurrentPdu[Channel].Dl)
                      {
                      temp2[8]++; /
                      DATA_FIELD + RX + last byte → CHECKSUM /
                      Lin_LocUartHwStatus[Channel] = LIN_DRV_HW_CHECKSUM_FIELD;
                      }
                      else
                      {
                      temp2[9]++; /
                      DATA_FIELD + RX + continue /
                      }
                      }
                      else if (LIN_FRAMERESPONSE_TX == Lin_LocCurrentPdu[Channel].Drc)
                      {
                      if (ResData == Lin_DrvUartSentData[Channel])
                      {
                      /
                      last data send success, start next*/
                      if (Lin_DrvUartDataCount[Channel] < Lin_LocCurrentPdu[Channel].Dl)
                      {
                      temp2[10]++; /* DATA_FIELD + TX + echo OK + continue send /
                      /
                      response not finish /
                      Base->DATA = Lin_DrvUartFrameSdu[Channel][Lin_DrvUartDataCount[Channel]];
                      Lin_DrvUartSentData[Channel] = Lin_DrvUartFrameSdu[Channel][Lin_DrvUartDataCount[Channel]];
                      ++Lin_DrvUartDataCount[Channel];
                      }
                      else /
                      response finish /
                      {
                      temp2[11]++; /
                      DATA_FIELD + TX + echo OK + last byte → CHECKSUM /
                      Lin_LocUartHwStatus[Channel] = LIN_DRV_HW_CHECKSUM_FIELD;
                      Base->DATA = Lin_DrvUartFrameChecksum[Channel];
                      Lin_DrvUartSentData[Channel] = Lin_DrvUartFrameChecksum[Channel];
                      }
                      }
                      else /
                      last data send fail*/
                      {
                      temp2[12]++; /* DATA_FIELD + TX + echo MISMATCH → BIT_ERROR /
                      Lin_LocChFrameErrorStates[Channel] = LIN_DRV_BIT_ERROR;
                      Lin_LocUartHwStatus[Channel] = LIN_DRV_HW_IDLE_MODE;
                      #if (LIN_SLAVE_API_SUPPORT == STD_ON)
                      LinIf_LinErrorIndication(Channel, LIN_ERR_RESP_DATABIT);
                      #endif
                      Base->INTF = Base->INTF;
                      /
                      enable break detect /
                      Lin_Lld_Uart_LocEnableLbkDtc(Base);
                      }
                      }
                      else
                      {
                      temp2[13]++; /
                      DATA_FIELD + else (can not be here) /
                      }
                      }
                      else if (LIN_DRV_HW_CHECKSUM_FIELD == Lin_LocUartHwStatus[Channel])
                      {
                      if (LIN_FRAMERESPONSE_RX == Lin_LocCurrentPdu[Channel].Drc)
                      {
                      if (ResData == Lin_Lld_Uart_LocGetChecksumByte(&Lin_LocCurrentPdu[Channel]))
                      {
                      temp2[14]++; /
                      CHECKSUM + RX + checksum OK /
                      #if (LIN_SLAVE_API_SUPPORT == STD_ON)
                      LinIf_RxIndication(Channel, &Lin_DrvUartFrameSdu[Channel][0]);
                      #endif
                      }
                      else
                      {
                      temp2[15]++; /
                      CHECKSUM + RX + checksum FAIL /
                      #if (LIN_SLAVE_API_SUPPORT == STD_ON)
                      LinIf_LinErrorIndication(Channel, LIN_ERR_RESP_CHKSUM);
                      #endif
                      }
                      }
                      else if (LIN_FRAMERESPONSE_TX == Lin_LocCurrentPdu[Channel].Drc)
                      {
                      if (ResData == Lin_DrvUartFrameChecksum[Channel])
                      {
                      temp2[16]++; /
                      CHECKSUM + TX + checksum OK → TxConfirmation /
                      /
                      send checksum success /
                      Lin_LocUartHwStatus[Channel] = LIN_DRV_HW_IDLE_MODE;
                      LinIf_TxConfirmation(Channel);
                      }
                      else
                      {
                      temp2[17]++; /
                      CHECKSUM + TX + checksum FAIL → BIT_ERROR /
                      /
                      send checksum fail /
                      Lin_LocChFrameErrorStates[Channel] = LIN_DRV_BIT_ERROR;
                      Lin_LocUartHwStatus[Channel] = LIN_DRV_HW_IDLE_MODE;
                      #if (LIN_SLAVE_API_SUPPORT == STD_ON)
                      LinIf_LinErrorIndication(Channel, LIN_ERR_RESP_DATABIT);
                      #endif
                      Base->INTF = Base->INTF;
                      Lin_Lld_Uart_LocEnableLbkDtc(Base);
                      }
                      }
                      else
                      {
                      temp2[18]++; /
                      CHECKSUM + else (can not be here) /
                      }
                      /
                      stop slave res timeout tick /
                      Lin_Lld_Uart_LocStopToTicks(Channel);
                      /
                      enable break detect /
                      Lin_Lld_Uart_LocEnableLbkDtc(Base);
                      }
                      else if (LIN_DRV_HW_WAKEUP_FIELD == Lin_LocUartHwStatus[Channel])
                      {
                      /
                      check wakeup signal /
                      if (ResData == Lin_LocUartWakeupByte[Channel])
                      {
                      temp2[19]++; /
                      WAKEUP + match → CH_READY /
                      /
                      Update LIN channel frame operation status /
                      Lin_LocChFrameStates[Channel] = LIN_DRV_CH_READY;
                      /
                      Reset frame error status /
                      Lin_LocChFrameErrorStates[Channel] = LIN_DRV_NO_ERROR;
                      Lin_ChStates[Channel] = LIN_DRV_CH_OPERATIONAL;
                      Lin_LocUartHwStatus[Channel] = LIN_DRV_HW_IDLE_MODE;
                      }
                      else
                      {
                      temp2[20]++; /
                      WAKEUP + mismatch → BIT_ERROR /
                      /
                      wakeup signal send fail /
                      Lin_LocChFrameErrorStates[Channel] = LIN_DRV_BIT_ERROR;
                      Lin_LocUartHwStatus[Channel] = LIN_DRV_HW_IDLE_MODE;
                      #if (LIN_SLAVE_API_SUPPORT == STD_ON)
                      LinIf_LinErrorIndication(Channel, LIN_ERR_RESP_DATABIT);
                      #endif
                      Base->INTF = Base->INTF;
                      Lin_Lld_Uart_LocEnableLbkDtc(Base);
                      }
                      }
                      else
                      {
                      temp2[21]++; /
                      no matching state */
                      }
                      }

                      1 条回复 最后回复
                      0
                      • lxhxssL 离线
                        lxhxssL 离线
                        lxhxss
                        回复了RuiXu 最后由 编辑
                        #11

                        都是demo的代码 应该是没改动到什么东西 不过 demo 是 64PIN 我是 48PIN就是

                        1 条回复 最后回复
                        0
                        • RuiXuR 离线
                          RuiXuR 离线
                          RuiXu YunTu
                          编写于 最后由 编辑
                          #12

                          主程序是我们的demo?是Demo这样通信有问题?

                          lxhxssL 1 条回复 最后回复
                          0
                          • RuiXuR 离线
                            RuiXuR 离线
                            RuiXu YunTu
                            编写于 最后由 编辑
                            #13

                            确定LinIf_HeaderIndication已经进入了吗?

                            1 条回复 最后回复
                            0
                            • RuiXuR 离线
                              RuiXuR 离线
                              RuiXu YunTu
                              编写于 最后由 编辑
                              #14

                              TX 引脚发出数据段的第一个字节是图中示波器上的数据是吧?

                              1 条回复 最后回复
                              0
                              • lxhxssL 离线
                                lxhxssL 离线
                                lxhxss
                                回复了RuiXu 最后由 编辑
                                #15

                                对的 TX 引脚发出数据段的第一个字节是图中示波器上的数据

                                947bad02-c69e-420c-b661-f1bee9c11e1b-image.png

                                40160108-5b04-4c15-b7c7-d0456a675b2c-image.png

                                23059092-67ba-41ba-8944-7516f92f0021-image.png

                                关于硬件这块 我这里使用SDK 的 版本 是可以 进行LIN的正常收发的

                                1 条回复 最后回复
                                0
                                • RuiXuR 离线
                                  RuiXuR 离线
                                  RuiXu YunTu
                                  编写于 最后由 RuiXu 编辑
                                  #16

                                  抓一个完整波形看看,第一个数据是0xE9,示波器上面的似乎是PID段的波形。

                                  lxhxssL 1 条回复 最后回复
                                  0
                                  • RuiXuR 离线
                                    RuiXuR 离线
                                    RuiXu YunTu
                                    编写于 最后由 编辑
                                    #17

                                    还有demo里面没用LinIf_LinErrorIndication,加上这个函数,一定要保证没用报错。

                                    lxhxssL 1 条回复 最后回复
                                    0
                                    • lxhxssL 离线
                                      lxhxssL 离线
                                      lxhxss
                                      回复了RuiXu 最后由 编辑
                                      #18

                                      RuiXu 您好 我想问一个问题 MCAL 和 SDK 中 LIN 的协议栈是一样的吗?

                                      1 条回复 最后回复
                                      0
                                      • RuiXuR 离线
                                        RuiXuR 离线
                                        RuiXu YunTu
                                        编写于 最后由 编辑
                                        #19

                                        实现逻辑是不一样的

                                        lxhxssL 1 条回复 最后回复
                                        0
                                        • lxhxssL 离线
                                          lxhxssL 离线
                                          lxhxss
                                          回复了RuiXu 最后由 编辑
                                          #20

                                          RuiXu 只是实现逻辑不一样吗 ,从实现结果上来说是相同的吗

                                          RuiXuR 1 条回复 最后回复
                                          0

                                        • 云途开发生态介绍

                                          快速上手云途开发生态

                                        • 云途论坛规则/Yuntu Forum Rules

                                          发帖前请查看

                                        • YT CONFIG TOOL调查问卷

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

                                        • can
                                          28
                                          demo
                                          23
                                          uds
                                          14
                                          lin stack
                                          13
                                          md14
                                          6
                                          yt-link
                                          6
                                          fbl
                                          5
                                          adc模块
                                          4
                                          Online Users
                                          • 登录

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