@@ -704,6 +704,55 @@ static void _can_rx_isr(struct rt_can_device *can, rt_uint32_t fifo)
704
704
}
705
705
}
706
706
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
+
707
756
static void _can_sce_isr (struct rt_can_device * can )
708
757
{
709
758
CAN_HandleTypeDef * hcan ;
@@ -721,45 +770,6 @@ static void _can_sce_isr(struct rt_can_device *can)
721
770
break ;
722
771
case RT_CAN_BUS_ACK_ERR :/* attention !!! test ack err's unit is transmit unit */
723
772
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
- }
763
773
break ;
764
774
case RT_CAN_BUS_IMPLICIT_BIT_ERR :
765
775
case RT_CAN_BUS_EXPLICIT_BIT_ERR :
@@ -769,6 +779,7 @@ static void _can_sce_isr(struct rt_can_device *can)
769
779
can -> status .crcerrcnt ++ ;
770
780
break ;
771
781
}
782
+ _can_check_tx_complete (can );
772
783
773
784
can -> status .lasterrtype = errtype & 0x70 ;
774
785
can -> status .rcverrcnt = errtype >> 24 ;
@@ -908,28 +919,6 @@ void CAN2_SCE_IRQHandler(void)
908
919
}
909
920
#endif /* BSP_USING_CAN2 */
910
921
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
-
933
922
int rt_hw_can_init (void )
934
923
{
935
924
struct can_configure config = CANDEFAULTCONFIG ;
0 commit comments