summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrcitach <[email protected]>2026-07-01 07:54:53 +0000
committerRbb666 <[email protected]>2026-07-05 16:00:12 +0800
commit313e159031295beec80cf7bfb0336d5e29e58c23 (patch)
tree73911d1d1a6a95f476cba5d41bda63ffd3bd959d
parent2b75ff3463c5531ec607132bc99327434aa3b688 (diff)
Fix the CAN driver bug
-rw-r--r--bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_can.c17
1 files changed, 5 insertions, 12 deletions
diff --git a/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_can.c b/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_can.c
index db7699b7d5..88d46736e7 100644
--- a/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_can.c
+++ b/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_can.c
@@ -957,11 +957,6 @@ static const struct rt_can_ops _can_ops =
.sendmsg_nonblocking = _can_sendmsg_nonblocking,
};
-static uint32_t FLEXCANREG_GetMsgBufInterruptFlagAll(FLEXCANREG_TypeDef *obj)
-{
- return obj->IFLAG1 | obj->IFLAG2 | obj->IFLAG3 | obj->IFLAG4;
-}
-
static uint8_t FLEXCANREG_GetMsgBufInterruptMask (FLEXCANREG_TypeDef *obj, uint32_t msgBufferIdx)
{
uint32_t temp, temp1 = 0;
@@ -1007,10 +1002,10 @@ static void _can_tx_rx_isr(struct rt_can_device *can)
hcan = (ns800rt7_can *) can->parent.user_data;
RT_ASSERT(hcan);
- do
+ while (RT_TRUE)
{
/* For this implementation, we solve the Message with lowest MB index first. */
- for (result = 0; result < 128; result++)
+ for (result = 0; result < TOTAL_MB_COUNT; result++)
{
flag = FLEXCANDRV_GetMsgObjFlag(&(hcan->CanHandle), result);
mask = FLEXCANREG_GetMsgBufInterruptMask(hcan->CanHandle.flexCanReg, result);
@@ -1022,15 +1017,15 @@ static void _can_tx_rx_isr(struct rt_can_device *can)
}
/* Does not find Message to deal with. */
- if (result == 128)
+ if (result == TOTAL_MB_COUNT)
{
break;
}
if (result == 0U)
{
- rt_hw_can_isr(can, RT_CAN_EVENT_TX_DONE | (result << 8));
hcan->mbState[result] = StateIdle;
+ rt_hw_can_isr(can, RT_CAN_EVENT_TX_DONE | (result << 8));
}
else if (result >= TX_MB_COUNT && result < TOTAL_MB_COUNT)
{
@@ -1039,13 +1034,12 @@ static void _can_tx_rx_isr(struct rt_can_device *can)
msgObj.msgBufId = result;
FLEXCANDRV_GetRxMsg(&hcan->CanHandle, &msgObj);
rt_memcpy(&hcan->rx_frame[frame_idx], &msgObj, sizeof(msgObj));
- rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | (result << 8));
hcan->mbState[result] = StateIdle;
+ rt_hw_can_isr(can, RT_CAN_EVENT_RX_IND | (result << 8));
}
FLEXCANDRV_ClearMsgObjFlag(&(hcan->CanHandle), result);
}
- while((0 != FLEXCANREG_GetMsgBufInterruptFlagAll(hcan->CanHandle.flexCanReg)));
}
static void _can_err_isr(struct rt_can_device *can)
@@ -1217,4 +1211,3 @@ INIT_BOARD_EXPORT(rt_hw_can_init);
#endif /* BSP_USING_CAN */
/************************** end of file ******************/
-