static void HandleBusoffFastSlowRecovery(void) { static UInt8 u8McanBusOffCounter = INITIAL_ZERO; static UInt8 u8TxMsgNum = INITIAL_ZERO; static UInt8 u8BusoffToRecoveryFlg = INITIAL_ZERO; static UInt16 u16McanBusOffRecoveryTime = INITIAL_ZERO; static UInt16 u16McanBusOffEventStartTime = INITIAL_ZERO; static UInt8 u8McanBusOffStatus = INITIAL_ZERO; uint32 u32Temp = 0UL; if(TRUE == u8BusOffTimer1msFlg) { #if 0 u8McanBusOffStatus = ((*(uint32 *)(MCANA_DRIVER_BASE + MCAN_PSR) & 0x80u) >> 7u); u32Temp = ((*(uint32 *)(MCANA_DRIVER_BASE + MCAN_PSR) & 0x80u) >> 7u); u8McanBusOffStatus = (Uint8)u32Temp; #else u32Temp = (*(uint32 *)(MCANA_DRIVER_BASE + MCAN_PSR) & MCAN_PSR_BO_MASK) & 0xFFU; u8McanBusOffStatus = (Uint8)u32Temp; #endif if(u8McanBusOffStatus == 0x80u) { u8BusoffControlMsgFlg = 1u; /*cancel message transmit request in busoff*/ if(0u != MCAN_getTxBufReqPend(MCANA_DRIVER_BASE)) { for(u8TxMsgNum = 0u; u8TxMsgNum < (NUM_OF_MSG - 1U); u8TxMsgNum++) { MCAN_txBufCancellationReq(MCANA_DRIVER_BASE,u8TxMsgNum); } } u16McanBusOffEventStartTime++; if(u8McanBusOffCounter >= BUS_OFF_FAST_RECOVERY_COUNTER) { u16McanBusOffRecoveryTime = BUS_OFF_SLOW_RECOVERY_TIME; /*busoff slow recovery delay time*/ } else { u16McanBusOffRecoveryTime = BUS_OFF_FAST_RECOVERY_TIME; /*busoff fast recovery delay time*/ } if(u16McanBusOffEventStartTime > u16McanBusOffRecoveryTime) /*busoff fast recovery attempt counter*/ { u16McanBusOffEventStartTime = 0u; /*Once CCCR.INIT has been cleared by the CPU,the device will then wait for 129 occurrences of Bus Idle (129 * 11 consecutive recessive bits) before resuming normal operation*/ /*129 * 11 * 1 / 500k = 2.8ms*/ MCANConfiguration(); u8BusoffToRecoveryFlg = 1u; if(u8McanBusOffCounter < BUS_OFF_COUNTER_LIMIT) { u8McanBusOffCounter++; } } } else { /* Each Tx Buffer has its own Transmission Occurred bit. The bits are set when the corresponding TXBRP bit is cleared after a successful transmission. The bits are reset when a new transmission is requested by writing a '1' to the corresponding bit of register TXBAR. */ if(MCAN_getTxBufTransmissionStatus(MCANA_DRIVER_BASE) != 0U) { u8McanBusOffCounter = 0u; u16McanBusOffEventStartTime = 0u; } } u8BusOffTimer1msFlg = FALSE; } if((1u == u8BusoffToRecoveryFlg) && (0u == u8McanBusOffStatus)) { u8BusoffControlMsgFlg = 0u; /*Enable first frame send immediately - 20250620 LiuGaoSong*/ u8FirstMsgSendFlg = TRUE; u8BusoffToRecoveryFlg = 0u; } }