YTM32MC03 MCAL LIN Slave 发送回环测试异常
-
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 */
}
}
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...





