Skip to content

Commit d88047a

Browse files
committed
fix(drv_can): resolve issues with reopening after close and TX mailbox blockage
1 parent fa6f86e commit d88047a

File tree

1 file changed

+18
-17
lines changed
  • bsp/stm32/libraries/HAL_Drivers/drivers

1 file changed

+18
-17
lines changed

bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -472,10 +472,11 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg)
472472
argval = (rt_uint32_t) arg;
473473
if (argval == 0)
474474
{
475-
HAL_CAN_Stop(&drv_can->CanHandle);
475+
HAL_CAN_DeInit(&drv_can->CanHandle);
476476
}
477477
else
478478
{
479+
_can_config(&drv_can->device, &drv_can->device.config);
479480
HAL_CAN_Start(&drv_can->CanHandle);
480481
}
481482

@@ -515,32 +516,32 @@ static int _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t
515516
(state == HAL_CAN_STATE_LISTENING))
516517
{
517518
/*check select mailbox is empty */
519+
uint32_t mailbox_mask;
520+
uint32_t tme_flag;
521+
518522
switch (1 << box_num)
519523
{
520524
case CAN_TX_MAILBOX0:
521-
if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME0) != SET)
522-
{
523-
/* Return function status */
524-
return -RT_ERROR;
525-
}
525+
mailbox_mask = CAN_TX_MAILBOX0;
526+
tme_flag = CAN_TSR_TME0;
526527
break;
527528
case CAN_TX_MAILBOX1:
528-
if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME1) != SET)
529-
{
530-
/* Return function status */
531-
return -RT_ERROR;
532-
}
529+
mailbox_mask = CAN_TX_MAILBOX1;
530+
tme_flag = CAN_TSR_TME1;
533531
break;
534532
case CAN_TX_MAILBOX2:
535-
if (HAL_IS_BIT_SET(hcan->Instance->TSR, CAN_TSR_TME2) != SET)
536-
{
537-
/* Return function status */
538-
return -RT_ERROR;
539-
}
533+
mailbox_mask = CAN_TX_MAILBOX2;
534+
tme_flag = CAN_TSR_TME2;
540535
break;
541536
default:
542537
RT_ASSERT(0);
543-
break;
538+
return -RT_ERROR;
539+
}
540+
541+
if (HAL_IS_BIT_SET(hcan->Instance->TSR, tme_flag) != SET)
542+
{
543+
HAL_CAN_AbortTxRequest(hcan, mailbox_mask);
544+
return -RT_ERROR;
544545
}
545546

546547
if (RT_CAN_STDID == pmsg->ide)

0 commit comments

Comments
 (0)