From 3a06eeec3c72c2e8ec48c42c6dbaf707cf5c648e Mon Sep 17 00:00:00 2001 From: Igor Biletksyy Date: Tue, 27 Jun 2023 16:03:43 -0700 Subject: [PATCH] bxCAN: check overrun flag on error irq --- board/drivers/bxcan.h | 11 ++++++----- board/stm32fx/llbxcan.h | 3 +++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/board/drivers/bxcan.h b/board/drivers/bxcan.h index cc8be6c6..523e68d6 100644 --- a/board/drivers/bxcan.h +++ b/board/drivers/bxcan.h @@ -74,6 +74,12 @@ void update_can_health_pkt(uint8_t can_number, uint32_t ir_reg) { if (ir_reg != 0U) { can_health[can_number].total_error_cnt += 1U; + + // RX message lost due to FIFO overrun + if ((CAN->RF0R & (CAN_RF0R_FOVR0)) != 0) { + can_health[can_number].total_rx_lost_cnt += 1U; + CAN->RF0R &= ~(CAN_RF0R_FOVR0); + } llcan_clear_send(CAN); } @@ -165,11 +171,6 @@ void can_rx(uint8_t can_number) { CAN_TypeDef *CAN = CANIF_FROM_CAN_NUM(can_number); uint8_t bus_number = BUS_NUM_FROM_CAN_NUM(can_number); - if ((CAN->RF0R & (CAN_RF0R_FOVR0)) != 0) { // RX message lost due to FIFO overrun - can_health[can_number].total_rx_lost_cnt += 1U; - CAN->RF0R &= ~(CAN_RF0R_FOVR0); - } - while ((CAN->RF0R & CAN_RF0R_FMP0) != 0) { can_health[can_number].total_rx_cnt += 1U; diff --git a/board/stm32fx/llbxcan.h b/board/stm32fx/llbxcan.h index 0fdfd398..91c0d5fc 100644 --- a/board/stm32fx/llbxcan.h +++ b/board/stm32fx/llbxcan.h @@ -110,6 +110,9 @@ bool llcan_init(CAN_TypeDef *CAN_obj) { // enable certain CAN interrupts register_set_bits(&(CAN_obj->IER), CAN_IER_TMEIE | CAN_IER_FMPIE0 | CAN_IER_ERRIE | CAN_IER_LECIE | CAN_IER_BOFIE | CAN_IER_EPVIE | CAN_IER_EWGIE | CAN_IER_FOVIE0 | CAN_IER_FFIE0); + // clear overrun flag on init + CAN_obj->RF0R &= ~(CAN_RF0R_FOVR0); + if (CAN_obj == CAN1) { NVIC_EnableIRQ(CAN1_TX_IRQn); NVIC_EnableIRQ(CAN1_RX0_IRQn);