diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c index e12624a7098..da748590b08 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c @@ -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;