Skip to content

Commit a1e8651

Browse files
authored
fix stm32 CAN的SCE中断中只在ACK错误检查发送完成导致小概率出错的问题 #10354
1 parent 251910a commit a1e8651

File tree

1 file changed

+50
-61
lines changed
  • bsp/stm32/libraries/HAL_Drivers/drivers

1 file changed

+50
-61
lines changed

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

Lines changed: 50 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,55 @@ static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo)
704704
}
705705
}
706706

707+
static void _can_check_tx_complete(struct rt_can_device *can)
708+
{
709+
CAN_HandleTypeDef *hcan;
710+
RT_ASSERT(can);
711+
hcan = &((struct stm32_can *) can->parent.user_data)->CanHandle;
712+
713+
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP0))
714+
{
715+
if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0))
716+
{
717+
rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 0 << 8);
718+
}
719+
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0);
720+
}
721+
722+
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1))
723+
{
724+
if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1))
725+
{
726+
rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 1 << 8);
727+
}
728+
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1);
729+
}
730+
731+
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2))
732+
{
733+
if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2))
734+
{
735+
rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 2 << 8);
736+
}
737+
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2);
738+
}
739+
740+
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR0))/*IF AutoRetransmission = ENABLE,ACK ERR handler*/
741+
{
742+
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);/*Abort the send request, trigger the TX interrupt,release completion quantity*/
743+
}
744+
745+
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR1))
746+
{
747+
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1);
748+
}
749+
750+
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR2))
751+
{
752+
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2);
753+
}
754+
}
755+
707756
static void _can_sce_isr(struct rt_can_device *can)
708757
{
709758
CAN_HandleTypeDef *hcan;
@@ -721,45 +770,6 @@ static void _can_sce_isr(struct rt_can_device *can)
721770
break;
722771
case RT_CAN_BUS_ACK_ERR:/* attention !!! test ack err's unit is transmit unit */
723772
can->status.ackerrcnt++;
724-
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP0))
725-
{
726-
if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK0))
727-
{
728-
rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 0 << 8);
729-
}
730-
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP0);
731-
}
732-
else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1))
733-
{
734-
if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1))
735-
{
736-
rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 1 << 8);
737-
}
738-
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1);
739-
}
740-
else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2))
741-
{
742-
if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2))
743-
{
744-
rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 2 << 8);
745-
}
746-
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2);
747-
}
748-
else
749-
{
750-
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR0))/*IF AutoRetransmission = ENABLE,ACK ERR handler*/
751-
{
752-
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);/*Abort the send request, trigger the TX interrupt,release completion quantity*/
753-
}
754-
else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR1))
755-
{
756-
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1);
757-
}
758-
else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR2))
759-
{
760-
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2);
761-
}
762-
}
763773
break;
764774
case RT_CAN_BUS_IMPLICIT_BIT_ERR:
765775
case RT_CAN_BUS_EXPLICIT_BIT_ERR:
@@ -769,6 +779,7 @@ static void _can_sce_isr(struct rt_can_device *can)
769779
can->status.crcerrcnt++;
770780
break;
771781
}
782+
_can_check_tx_complete(can);
772783

773784
can->status.lasterrtype = errtype & 0x70;
774785
can->status.rcverrcnt = errtype >> 24;
@@ -908,28 +919,6 @@ void CAN2_SCE_IRQHandler(void)
908919
}
909920
#endif /* BSP_USING_CAN2 */
910921

911-
/**
912-
* @brief Error CAN callback.
913-
* @param hcan pointer to a CAN_HandleTypeDef structure that contains
914-
* the configuration information for the specified CAN.
915-
* @retval None
916-
*/
917-
void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
918-
{
919-
__HAL_CAN_ENABLE_IT(hcan, CAN_IT_ERROR_WARNING |
920-
CAN_IT_ERROR_PASSIVE |
921-
CAN_IT_BUSOFF |
922-
CAN_IT_LAST_ERROR_CODE |
923-
CAN_IT_ERROR |
924-
CAN_IT_RX_FIFO0_MSG_PENDING |
925-
CAN_IT_RX_FIFO0_OVERRUN |
926-
CAN_IT_RX_FIFO0_FULL |
927-
CAN_IT_RX_FIFO1_MSG_PENDING |
928-
CAN_IT_RX_FIFO1_OVERRUN |
929-
CAN_IT_RX_FIFO1_FULL |
930-
CAN_IT_TX_MAILBOX_EMPTY);
931-
}
932-
933922
int rt_hw_can_init(void)
934923
{
935924
struct can_configure config = CANDEFAULTCONFIG;

0 commit comments

Comments
 (0)