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

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
    回复了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
                        • lxhxssL 离线
                          lxhxssL 离线
                          lxhxss
                          回复了RuiXu 最后由 编辑
                          #21

                          RuiXu 这个就是 0xE9d8810611-0e2a-4d23-8473-edecb1af65f7-image.png

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

                            上位机怎么发送的报头?只发了0x29吗,时间间隔是多少?

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

                              我这边拿demo测试了一下是正常的。可以抓一下从break到数据的LIN总线上的完整波形。

                              1 条回复 最后回复
                              0
                              • RuiXuR 离线
                                RuiXuR 离线
                                RuiXu YunTu
                                回复了lxhxss 最后由 编辑
                                #24

                                lxhxss 在 YTM32MC03 MCAL LIN Slave 发送回环测试异常 中说:

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

                                结果肯定都是按照LIN协议规范来做的

                                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
                                • 版块
                                • 最新
                                • 标签
                                • 热门