From d8d96bd2424f5074f8a285b433f1ba960093dc57 Mon Sep 17 00:00:00 2001 From: a1012112796 <1012112796@qq.com> Date: Wed, 13 Nov 2024 15:39:03 +0800 Subject: [PATCH] =?UTF-8?q?413=20can=20=E5=BC=82=E5=B8=B8=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=80=BB=E8=BE=91=E5=B0=9D=E8=AF=95=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将仅在 ACT 异常处理结束发送等待改为所有异常均结束发送等待。 待测试验证。 Signed-off-by: a1012112796 <1012112796@qq.com> --- libraries/HAL_Drivers/drv_can.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/libraries/HAL_Drivers/drv_can.c b/libraries/HAL_Drivers/drv_can.c index 2f7a6eb..c105e8c 100644 --- a/libraries/HAL_Drivers/drv_can.c +++ b/libraries/HAL_Drivers/drv_can.c @@ -1088,13 +1088,13 @@ void CAN3_SCE_IRQHandler(void) break; case RT_CAN_BUS_ACK_ERR:/* attention !!! test ack err's unit is transmit unit */ drv_can3.device.status.ackerrcnt++; - if (!READ_BIT(drv_can3.CanHandle.Instance->TSR, CAN_FLAG_TXOK0)) - rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 0 << 8); - else if (!READ_BIT(drv_can3.CanHandle.Instance->TSR, CAN_FLAG_TXOK0)) - rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 1 << 8); - else if (!READ_BIT(drv_can3.CanHandle.Instance->TSR, CAN_FLAG_TXOK0)) - rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 2 << 8); - break; +// if (!READ_BIT(drv_can3.CanHandle.Instance->TSR, CAN_FLAG_TXOK0)) +// rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 0 << 8); +// else if (!READ_BIT(drv_can3.CanHandle.Instance->TSR, CAN_FLAG_TXOK0)) +// rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 1 << 8); +// else if (!READ_BIT(drv_can3.CanHandle.Instance->TSR, CAN_FLAG_TXOK0)) +// rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 2 << 8); +// break; case RT_CAN_BUS_IMPLICIT_BIT_ERR: case RT_CAN_BUS_EXPLICIT_BIT_ERR: drv_can3.device.status.biterrcnt++; @@ -1109,6 +1109,16 @@ void CAN3_SCE_IRQHandler(void) drv_can3.device.status.snderrcnt = (errtype >> 16 & 0xFF); drv_can3.device.status.errcode = errtype & 0x07; hcan->Instance->MSR |= CAN_MSR_ERRI; + + // 警告: 为了避免can 发送线程在异常情况被阻塞,在遇到异常时,强制异常结束发送逻辑 + // 本段代码待测试 !!!! + if (!READ_BIT(drv_can3.CanHandle.Instance->TSR, CAN_FLAG_TXOK0)) + rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 0 << 8); + else if (!READ_BIT(drv_can3.CanHandle.Instance->TSR, CAN_FLAG_TXOK0)) + rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 1 << 8); + else if (!READ_BIT(drv_can3.CanHandle.Instance->TSR, CAN_FLAG_TXOK0)) + rt_hw_can_isr(&drv_can3.device, RT_CAN_EVENT_TX_FAIL | 2 << 8); + rt_interrupt_leave(); } #endif /* BSP_USING_CAN3 */