455 lines
10 KiB
C
455 lines
10 KiB
C
|
/** ##########################################################################
|
|||
|
** 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();
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|