Skip to content

Commit 3d82c43

Browse files
committed
Update drv_can.c
修复CAN总线在出错时没能处理的问题
1 parent 8525e08 commit 3d82c43

File tree

1 file changed

+49
-39
lines changed
  • bsp/stm32/libraries/HAL_Drivers/drivers

1 file changed

+49
-39
lines changed

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

Lines changed: 49 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,53 @@ 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+
else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP1))
722+
{
723+
if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK1))
724+
{
725+
rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 1 << 8);
726+
}
727+
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP1);
728+
}
729+
else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_RQCP2))
730+
{
731+
if (!__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TXOK2))
732+
{
733+
rt_hw_can_isr(can, RT_CAN_EVENT_TX_FAIL | 2 << 8);
734+
}
735+
SET_BIT(hcan->Instance->TSR, CAN_TSR_RQCP2);
736+
}
737+
else
738+
{
739+
if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR0))/*IF AutoRetransmission = ENABLE,ACK ERR handler*/
740+
{
741+
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0);/*Abort the send request, trigger the TX interrupt,release completion quantity*/
742+
}
743+
else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR1))
744+
{
745+
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1);
746+
}
747+
else if (__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_TERR2))
748+
{
749+
SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2);
750+
}
751+
}
752+
}
753+
707754
static void _can_sce_isr(struct rt_can_device *can)
708755
{
709756
CAN_HandleTypeDef *hcan;
@@ -715,51 +762,14 @@ static void _can_sce_isr(struct rt_can_device *can)
715762
{
716763
case RT_CAN_BUS_BIT_PAD_ERR:
717764
can->status.bitpaderrcnt++;
765+
_can_check_tx_complete(can);
718766
break;
719767
case RT_CAN_BUS_FORMAT_ERR:
720768
can->status.formaterrcnt++;
721769
break;
722770
case RT_CAN_BUS_ACK_ERR:/* attention !!! test ack err's unit is transmit unit */
723771
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-
}
772+
_can_check_tx_complete(can);
763773
break;
764774
case RT_CAN_BUS_IMPLICIT_BIT_ERR:
765775
case RT_CAN_BUS_EXPLICIT_BIT_ERR:

0 commit comments

Comments
 (0)