2025-04-26 16:03:23 +08:00

455 lines
10 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/** ##########################################################################
** 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_0_TX_MAILBOX_ID_MAX;i++)
{
//CAN_AbortTransmission(CAN0,CAN_TRANSMIT_SECONDARY); //mingyea
FL_CAN_DisableIT_TXOK(CAN);
}
#endif
}
else if(phy_id == CAN_ID_1)
{
#ifdef CAN_ID_1_EN
//for(i=0;i<CAN_ID_1_TX_MAILBOX_ID_MAX;i++)
{
//CAN_AbortTransmission(CAN1,CAN_TRANSMIT_SECONDARY);
}
#endif
}
#ifdef LS_NM_DEBUG_EN
g_ls_nm.test_buf[7]++;
#endif
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
static void can_nm_phy_busoff_trig(u8 phy_id)
{
if(phy_id>=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<ADPT_UDS_MAX_CAN_FRAME_SIZE;i++)
{
//l_buf[i] = CANTP_FRAME_PADDING_VALUE;
}
(void)Canif_Write(0u, 8, l_buf); //ADPT_UDS_TX_HANDLE=0u
}
#endif
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
static void can_nm_busoff_recovery_task(u8 phy_id)
{
u8 l_logic_id = CAN_ID_NULL;
//CAN_Type * const l_flexcanBasePtr[] = CAN_BASE_PTRS;
#ifdef CAN_LS_EN
l_logic_id = can_drive_get_logic_id(phy_id);
#else
l_logic_id = CAN_ID_0;
#endif
if((phy_id>=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();
}
}