MC03 LIN Slave Mode PID 非预期触发响应问题
-
1. 问题背景
- 软件:MCAL_1_0_0 的客户代码
- 硬件:MC03 EVB
- 问题描述:
-
客户 LIN 通信有 4 个从机节点,从节点 A 反馈报文的 CRC 校验和正好和从节点 B 的 PID 相同,就出现了从节点 B 异常反馈的情况。

-
0x8E 是 LIN 从节点 A 的校验和,正常从机响应的情况下应该是最后位,但由于 0x8E 是从节点 B 的 PID, 所以紧接着 0x8E 后面,从节点 B 又响应发送了 0xFF 和 0x3F ,此时从节点 B 就触发了LIN_ERR_RESP_STOPBIT 的错误。
2. 问题分析
2.1 环境搭建
-
TSMaster 做为 LIN Master 发送 ID 为 0x0D 的从机响应

-
MC03 EVB Rev_A 作为从节点 A,基于 MCAL1_0_0 Lin_Slave_Demo 修改,响应 ID 为 0x0D 的报文,回复数据:0xFF, 0x7F, 0x00, 0x02, 0xE2, 0xFF, 0xFF, 0xFF,校验和为 0x8E

-
MC03 EVB Rev_B 作为从节点 B,直接烧入客户工程,响应 ID 为 0x0E(PID 为 0x8E) 的报文
2.2 尝试复现
- 使用逻辑分析仪抓取总线的波形,波形呈现的情况跟客户现场情况一致,从节点 A 的校验和为 0x8E,与从节点 B 的 PID 相同,从而导致从节点 B 出现了异常响应

2.3 根因分析
- 由于客户 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 驱动已经修复了这个风险点
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...