diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c index 196cc94a529..040af5c7f24 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c @@ -472,10 +472,11 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg) argval = (rt_uint32_t) arg; if (argval == 0) { - HAL_CAN_Stop(&drv_can->CanHandle); + HAL_CAN_DeInit(&drv_can->CanHandle); } else { + _can_config(&drv_can->device, &drv_can->device.config); HAL_CAN_Start(&drv_can->CanHandle); } @@ -515,32 +516,32 @@ static int _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t (state == HAL_CAN_STATE_LISTENING)) { /*check select mailbox is empty */ + uint32_t mailbox_mask; + uint32_t tme_flag; + switch (1 << box_num) { case CAN_TX_MAILBOX0: - if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME0) != SET) - { - /* Return function status */ - return -RT_ERROR; - } + mailbox_mask = CAN_TX_MAILBOX0; + tme_flag = CAN_TSR_TME0; break; case CAN_TX_MAILBOX1: - if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME1) != SET) - { - /* Return function status */ - return -RT_ERROR; - } + mailbox_mask = CAN_TX_MAILBOX1; + tme_flag = CAN_TSR_TME1; break; case CAN_TX_MAILBOX2: - if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME2) != SET) - { - /* Return function status */ - return -RT_ERROR; - } + mailbox_mask = CAN_TX_MAILBOX2; + tme_flag = CAN_TSR_TME2; break; default: RT_ASSERT(0); - break; + return -RT_ERROR; + } + + if (HAL_IS_BIT_SET(hcan->Instance->TSR, tme_flag) != SET) + { + HAL_CAN_AbortTxRequest(hcan, mailbox_mask); + return -RT_ERROR; } if (RT_CAN_STDID == pmsg->ide)