@@ -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+
707756static 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-
933922int rt_hw_can_init (void )
934923{
935924 struct can_configure config = CANDEFAULTCONFIG ;
0 commit comments