fix stm32 CAN的SCE中断中只在ACK错误检查发送完成导致小概率出错的问题 #10354
pkgs_test / change (push) Has been skipped
AutoTestCI / components/cpp11 (push) Has been cancelled
AutoTestCI / kernel/atomic (push) Has been cancelled
AutoTestCI / kernel/atomic/riscv64 (push) Has been cancelled
AutoTestCI / kernel/atomic_c11 (push) Has been cancelled
AutoTestCI / kernel/atomic_c11/riscv64 (push) Has been cancelled
AutoTestCI / kernel/device (push) Has been cancelled
AutoTestCI / kernel/ipc (push) Has been cancelled
AutoTestCI / kernel/irq (push) Has been cancelled
AutoTestCI / kernel/mem (push) Has been cancelled
AutoTestCI / kernel/mem/riscv64 (push) Has been cancelled
AutoTestCI / kernel/thread (push) Has been cancelled
AutoTestCI / kernel/timer (push) Has been cancelled
AutoTestCI / rtsmart/aarch64 (push) Has been cancelled
AutoTestCI / rtsmart/arm (push) Has been cancelled
AutoTestCI / rtsmart/riscv64 (push) Has been cancelled
AutoTestCI / components/utest (push) Has been cancelled
RT-Thread BSP Static Build Check / 🔍 Summary of Git Diff Changes (push) Has been cancelled
RT-Thread BSP Static Build Check / ${{ matrix.legs.RTT_BSP }} (push) Has been cancelled
RT-Thread BSP Static Build Check / collect-artifacts (push) Has been cancelled
utest_auto_run / AARCH64-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / A9-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / RISCV-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / XUANTIE-rtsmart :default.cfg (push) Has been cancelled
utest_auto_run / AARCH64 :default.cfg (push) Has been cancelled
utest_auto_run / A9 :default.cfg (push) Has been cancelled
utest_auto_run / A9-smp :default.cfg (push) Has been cancelled
utest_auto_run / RISCV :default.cfg (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / Infineon/psoc6-pioneerkit_modus (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / airm2m/air105 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / allwinner/d1 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / allwinner/d1s (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / amebaz (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / avr32uc3b0 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / bf533 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / bouffalo_lab/bl61x (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / bouffalo_lab/bl808/d0 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / bouffalo_lab/bl808/lp (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / bouffalo_lab/bl808/m0 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / ck802 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / core-v-mcu/core-v-cv32e40p (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / essemi/es32f0654 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / essemi/es32f365x (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / fm33lc026 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / ft2004 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / hc32l136 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / hk32/hk32f030c8-mini (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / imx/imx6ull-smart (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / imxrt/imxrt1170-nxp-evk/m7 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / juicevm (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / lpc43xx/M0 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / lpc43xx/M4 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / lpc54608-LPCXpresso (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / lpc824 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / m16c62p (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / microblaze (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / mini4020 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / mm32f327x (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / mm32l07x (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / nios_ii (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / nuclei/nuclei_fpga_eval (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / nv32f100x (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / phytium/aarch32 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / pic32ethernet (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / raspberry-pi/raspi2 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / rockchip/rk2108 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / rv32m1_vega/ri5cy (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / rx (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / samd21 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / sep6200 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / synopsys/boards (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / tae32f5300 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / taihu (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / thead-smart (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / ti/c28x/tms320f28379d (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / tkm32F499 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / tms320c6678 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / upd70f3454 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / w60x (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / wch/arm/ch579m (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / wch/risc-v/ch32v103r-evt (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / wch/risc-v/ch569w-evt (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / wh44b0 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / x86 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / xplorer4330/M0 (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / yichip/yc3121-pos (push) Has been cancelled
manual_trigger_scons_fail_bsp_all.yml / yichip/yc3122-pos (push) Has been cancelled

This commit is contained in:
unnamed2 authored and GitHub committed 2025-07-02 14:50:24 +08:00
1 parent 251910aa0e
commit a1e865171b
1 file changed
+50 -61
@@ -704,6 +704,55 @@ static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo)
}
}
static void _can_check_tx_complete(struct rt_can_device *can)
{
CAN_HandleTypeDef *hcan;
RT_ASSERT(can);
hcan = &((struct stm32_can *) can->parent.user_data)->CanHandle;
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP0))
{
if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0))
{
rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 0 << 8);
}
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0);
}
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1))
{
if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1))
{
rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 1 << 8);
}
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1);
}
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2))
{
if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2))
{
rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 2 << 8);
}
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2);
}
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR0))/*IF AutoRetransmission = ENABLE,ACK ERR handler*/
{
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);/*Abort the send request, trigger the TX interrupt,release completion quantity*/
}
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR1))
{
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1);
}
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR2))
{
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2);
}
}
static void _can_sce_isr(struct rt_can_device *can)
{
CAN_HandleTypeDef *hcan;
@@ -721,45 +770,6 @@ static void _can_sce_isr(struct rt_can_device *can)
break;
case RT_CAN_BUS_ACK_ERR:/* attention !!! test ack err's unit is transmit unit */
can->status.ackerrcnt++;
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP0))
{
if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0))
{
rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 0 << 8);
}
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0);
}
else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1))
{
if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1))
{
rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 1 << 8);
}
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1);
}
else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2))
{
if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2))
{
rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 2 << 8);
}
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2);
}
else
{
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR0))/*IF AutoRetransmission = ENABLE,ACK ERR handler*/
{
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);/*Abort the send request, trigger the TX interrupt,release completion quantity*/
}
else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR1))
{
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1);
}
else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR2))
{
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2);
}
}
break;
case RT_CAN_BUS_IMPLICIT_BIT_ERR:
case RT_CAN_BUS_EXPLICIT_BIT_ERR:
@@ -769,6 +779,7 @@ static void _can_sce_isr(struct rt_can_device *can)
can->status.crcerrcnt++;
break;
}
_can_check_tx_complete(can);
can->status.lasterrtype = errtype & 0x70;
can->status.rcverrcnt = errtype >> 24;
@@ -908,28 +919,6 @@ void CAN2_SCE_IRQHandler(void)
}
#endif /* BSP_USING_CAN2 */
/**
* @brief Error CAN callback.
* @param hcan pointer to a CAN_HandleTypeDef structure that contains
* the configuration information for the specified CAN.
* @retval None
*/
void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
{
__HAL_CAN_ENABLE_IT(hcan, CAN_IT_ERROR_WARNING |
CAN_IT_ERROR_PASSIVE |
CAN_IT_BUSOFF |
CAN_IT_LAST_ERROR_CODE |
CAN_IT_ERROR |
CAN_IT_RX_FIFO0_MSG_PENDING |
CAN_IT_RX_FIFO0_OVERRUN |
CAN_IT_RX_FIFO0_FULL |
CAN_IT_RX_FIFO1_MSG_PENDING |
CAN_IT_RX_FIFO1_OVERRUN |
CAN_IT_RX_FIFO1_FULL |
CAN_IT_TX_MAILBOX_EMPTY);
}
int rt_hw_can_init(void)
{
struct can_configure config = CANDEFAULTCONFIG;