/** ########################################################################## ** Filename : ** Project : ** Module : ** Processor : ** Version : ** Compiler : ** Date/Time : ** Abstract : ** Contents : ** Note : ** ** (c) Copyright dmdz Co.,Ltd ** -------------------------------------------------------------------------- ** R E V I S I O N H I S T O R Y ** -------------------------------------------------------------------------- ** Date Ver Author Description ** -20230602- --V1.0-- --mingyea--- --修改-- ** #########################################################################*/ /*--------------------------------------------------------------------------- - I N C L U D E F I L E S ----------------------------------------------------------------------------*/ #include "common_types.h" #include "Cpu.h" #include "common_memory.h" #include "Ls_Nm.h" #if 0 #include "CanIf_Type.h" #include "CanTrcv.h" #include "CanIf.h" #include "Com.h" #include "wdog.h" #include "Demm.h" #include "can.h" #include "Com.h" #include "flexcan_hw_access.h" #include "Demm.h" #endif #include "bl_can.h" #include "bl_can_transceiver.h" #include "bl_can_if.h" #define CAN_LS_EN //临时用 /*--------------------------------------------------------------------------- - D E F I N E S / M A C R O S ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- - T Y P E D E F I N I T I O N S ----------------------------------------------------------------------------*/ /*busoff*/ typedef struct { u8 flag_busoff; nm_busoff_recovery_state_e state; //主状态--未busoff,快恢复,慢恢复 u16 timecount; u16 try_count; }can_nm_busoff_s; /**/ typedef struct { can_nm_busoff_s busoff[CAN_ID_TOTAL]; #ifdef LS_NM_DEBUG_EN u8 test_buf[15]; #endif }can_nm_s; static can_nm_s g_ls_nm; //static u8 g_nm_test1[10] ; /*--------------------------------------------------------------------------- - S T A T I C V A R I A B L E S ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- * G L O B A L V A R I A B L E S ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- - C O N S T A N T S ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- - F U N C T I O N P R O T O T Y P E ----------------------------------------------------------------------------*/ static void can_nm_phy_busoff_trig(u8 phy_id); static void can_nm_busoff_recovery_task(u8 phy_id); static void can_nm_busoff_recovery_successful(u8 phy_id); static void can_nm_phy_busoff_pre_trig(u8 phy_id); static void can_nm_busoff_recovery_op(u8 phy_id); /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description : ----------------------------------------------------------------------------*/ static void can_nm_phy_busoff_pre_trig(u8 phy_id) { //u8 i; if(phy_id == CAN_ID_0) { #ifdef CAN_ID_0_EN //for(i=0;i=CAN_ID_TOTAL) { return; } g_ls_nm.busoff[phy_id].flag_busoff=1u; } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : - |Input parameters : None |Output parameters : None |Return value : None |Description : 在busoff时重试 ----------------------------------------------------------------------------*/ static void can_nm_busoff_recovery_op(u8 phy_id) { u8 l_logic_id; #ifdef CAN_LS_EN l_logic_id = can_drive_get_logic_id(phy_id); #else l_logic_id = CAN_ID_0; #endif //wdog_task(); //__disable_irq(); LS_NM_TEST_IO_ON(); CanTrcv_Init(); //can_de_init(); //can_init(); Can_Deinit(); Can_Init(); LS_NM_TEST_IO_OFF(); //__enable_irq(); } #if 0 //用来测试主动发 void can_nm_test_tx(void) { bl_u8_t i; bl_u8_t l_buf[8u]; for(i=0;i<8;i++) { l_buf[i] = 0x11u; } //for(i=8;i=CAN_ID_TOTAL) || (l_logic_id==CAN_ID_NULL) ) { return; } if(g_ls_nm.busoff[phy_id].state == NM_BUSOFF_RECOVERY_STATE_NULL) { g_ls_nm.busoff[phy_id].timecount=0u; g_ls_nm.busoff[phy_id].try_count=0u; } else { g_ls_nm.busoff[phy_id].timecount++; if(g_ls_nm.busoff[phy_id].timecount >=NM_MAIN_BUSOFF_FAST_H) { g_ls_nm.busoff[phy_id].timecount=0u; #ifdef LS_NM_DEBUG_EN g_ls_nm.test_buf[2]++; #endif //g_ls_nm.busoff.sub_state=1u; can_nm_busoff_recovery_op(phy_id); } } } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description : ----------------------------------------------------------------------------*/ static void can_nm_busoff_recovery_successful(u8 phy_id) { if(phy_id>=CAN_ID_TOTAL) { return; } if(g_ls_nm.busoff[phy_id].state != NM_BUSOFF_RECOVERY_STATE_NULL) { g_ls_nm.busoff[phy_id].timecount =0; g_ls_nm.busoff[phy_id].try_count =0; g_ls_nm.busoff[phy_id].state =NM_BUSOFF_RECOVERY_STATE_NULL; #ifdef LS_NM_DEBUG_EN g_ls_nm.test_buf[10]++; #endif } } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description : ----------------------------------------------------------------------------*/ void ls_nm_Init(void) { common_memory_clear((u8*)&g_ls_nm,sizeof(g_ls_nm)); #ifdef CAN_LS_EN CanTrcv_Init(); #endif } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description : ----------------------------------------------------------------------------*/ void ls_nm_task(void) { NM_CPU_SR_ALLOC(); NM_ENTER_CRITICAL(); //can_nm_test_tx(); if(g_ls_nm.busoff[CAN_ID_0].flag_busoff == 1u) { g_ls_nm.busoff[CAN_ID_0].flag_busoff=0u; // if(g_ls_nm.busoff[CAN_ID_0].state == NM_BUSOFF_RECOVERY_STATE_NULL) { //g_ls_nm.busoff[CAN_ID_0].timecount=0u; g_ls_nm.busoff[CAN_ID_0].state = NM_BUSOFF_RECOVERY_STATE_QUICK; } } #ifdef CAN_ID_0_EN can_nm_busoff_recovery_task(CAN_ID_0); #endif NM_EXIT_CRITICAL(); } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description : ----------------------------------------------------------------------------*/ u8 CanNm_PhysErrorInd(u8 phy_id,nm_erro_source_e erro) { u8 retValue; NM_CPU_SR_ALLOC(); //g_nm_test1[1]++; if( erro == NM_DLL_BUS_OFF) { //g_nm_test1[2]++; NM_ENTER_CRITICAL(); can_nm_phy_busoff_trig(phy_id); NM_EXIT_CRITICAL(); } else if( erro == NM_DLL_ERROR_PASSIVE) { //g_nm_test1[3]++; } else if( erro == NM_DLL_ERROR_ACTIVE) { //g_nm_test1[4]++; } else if( erro == NM_DLL_BUS_OFF_PRE) { can_nm_phy_busoff_pre_trig(phy_id); } return retValue; } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description : ----------------------------------------------------------------------------*/ u8 CanNm_is_busoff(void) { u8 l_result = LS_NM_IS_NOT_BUSOFF; NM_CPU_SR_ALLOC(); NM_ENTER_CRITICAL(); #if 1 if( g_ls_nm.busoff[CAN_ID_0].state == NM_BUSOFF_RECOVERY_STATE_NULL ) { l_result = LS_NM_IS_NOT_BUSOFF; } else { l_result = LS_NM_IS_BUSOFF; } #else if( (g_ls_nm.state == NM_MAIN_STATE_ACTIVE) \ && (g_ls_nm.sub_state != NM_SUB_STATE_ACTIVE_BUSOFF) \ && (g_ls_nm.busoff[CAN_ID_0].state == NM_BUSOFF_RECOVERY_STATE_NULL) //&& (g_ls_nm.busoff[CAN_ID_1].state == NM_BUSOFF_RECOVERY_STATE_NULL) ) { l_result = LS_NM_IS_NOT_BUSOFF; } else { l_result = LS_NM_IS_BUSOFF; } #endif NM_EXIT_CRITICAL(); return l_result; } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description : ----------------------------------------------------------------------------*/ void CanNm_TxConfirmation_com(PduIdType canNmPduId,u8 phy_id) { NM_CPU_SR_ALLOC(); (void)canNmPduId; { //g_nm_test1[8]++; NM_ENTER_CRITICAL(); can_nm_busoff_recovery_successful(phy_id); NM_EXIT_CRITICAL(); } }