summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwdfk-prog <[email protected]>2025-11-13 10:55:15 +0800
committerR b b666 <[email protected]>2025-11-13 15:31:05 +0800
commitec27e09df897dbdf396d25550fc599b5a4d75c90 (patch)
treeb5ec6ac59b27b02e812cd31302894ed60e91a443
parentf56875fff5b5f4b7e57f027660427e7bf8535af5 (diff)
feat:[stm32][can]: enhance control logic and refactor sendmsg
-rw-r--r--bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c47
1 files changed, 29 insertions, 18 deletions
diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c
index 73a9ac8f50..5022c37a81 100644
--- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c
+++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c
@@ -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)