@@ -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+
707754static 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