mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2025-12-13 19:46:36 +08:00
feat:[stm32][can]: enhance control logic and refactor sendmsg
This commit is contained in:
@@ -472,11 +472,23 @@ 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);
|
||||
if (HAL_CAN_DeInit(&drv_can->CanHandle) != HAL_OK)
|
||||
{
|
||||
LOG_E("CAN deinitialization failed");
|
||||
return -RT_ERROR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
HAL_CAN_Start(&drv_can->CanHandle);
|
||||
rt_err_t result = _can_config(&drv_can->device, &drv_can->device.config);
|
||||
if (result != RT_EOK)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
if (HAL_CAN_Start(&drv_can->CanHandle) != HAL_OK)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -515,32 +527,31 @@ static rt_ssize_t _can_sendmsg(struct rt_can_device *can, const void *buf, rt_ui
|
||||
(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)
|
||||
{
|
||||
return -RT_ERROR;
|
||||
}
|
||||
|
||||
if (RT_CAN_STDID == pmsg->ide)
|
||||
|
||||
Reference in New Issue
Block a user