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

398 lines
10 KiB
C

/**********************************************************************************************************************
* COPYRIGHT
* -------------------------------------------------------------------------------------------------------------------
* \verbatim
* Copyright (c) 2007-2014 by Vector Informatik GmbH. All rights reserved.
*
* This software is copyright protected and proprietary to Vector Informatik GmbH.
* Vector Informatik GmbH grants to you only those rights as set out in the license conditions.
* All other rights remain with Vector Informatik GmbH.
* \endverbatim
* -------------------------------------------------------------------------------------------------------------------
* FILE DESCRIPTION
* -------------------------------------------------------------------------------------------------------------------
* File: CanNm.c
* Component: AUTOSAR CAN Network Management
* Module: AUTOSAR Network Management
* Generator: -
*
* Description: Source of AUTOSAR CAN Network Management
* AUTOSAR Release 3.0
*
*********************************************************************************************************************/
#include "Can_BusOff.h"
#include "CanIf.h"
#include "Can.h"
#include "Com_Cfg.h"
#include "CanNm.h"
#include "Com.h"
STATIC VAR(uint8_t, CAN_BUSOFF_PRIVATE_DATA) BusOffFlagAry[CAN_USED_CONTROLLER_NUM];
STATIC VAR(uint8, CAN_BUSOFF_PRIVATE_DATA) nubNmBusOffCntAry[CAN_USED_CONTROLLER_NUM];
STATIC VAR(uint8, CAN_BUSOFF_PRIVATE_DATA) nmStatusErrRestoringAry[CAN_USED_CONTROLLER_NUM];
STATIC VAR(uint8, CAN_BUSOFF_PRIVATE_DATA) nmStatusSlowRecoveryAry[CAN_USED_CONTROLLER_NUM];
STATIC VAR(uint8, CAN_BUSOFF_PRIVATE_DATA) NMBusErrorAry[CAN_USED_CONTROLLER_NUM];
STATIC VAR(nmTimerCntType, CAN_BUSOFF_PRIVATE_DATA) nmTimerCntTbusoffAry[CAN_USED_CONTROLLER_NUM];
static FUNC(void, CAN_BUSOFF_PRIVATE_CODE) NmCanBusOffCheckFun(const uint16_t CurChannel);
/* BEGIN_FUNCTION_HDR
********************************************************************************
* Function Name: CAN_BusOff_Init
*
* Description: bus-off
*
* Inputs: None
*
* Outputs: None
*
* Limitations: None
********************************************************************************
END_FUNCTION_HDR*/
void CAN_BusOff_Init(void)
{
uint8_t i;
for(i = 0; i < CAN_USED_CONTROLLER_NUM; i ++)
{
BusOffFlagAry[i] = 0;
nubNmBusOffCntAry[i] = 0;
nmStatusErrRestoringAry[i] = 0;
nmStatusSlowRecoveryAry[i] = 0;
NMBusErrorAry[i] = 0;
nmTimerCntTbusoffAry[i] = 0;
}
}
/* BEGIN_FUNCTION_HDR
********************************************************************************
* Function Name: ApplNmBusOff
*
* Description: bus-off
*
* Inputs: None
*
* Outputs: None
*
* Limitations: None
********************************************************************************
END_FUNCTION_HDR*/
void ApplNmBusOff(const uint16_t CurChannel)/*indicates bus off error occured*/
{
(void)CurChannel;
Com_TxStop();
Com_RxStop();
}
/* BEGIN_FUNCTION_HDR
********************************************************************************
* Function Name: ApplNmBusOffEnd
*
* Description: bus-off
*
* Inputs: None
*
* Outputs: None
*
* Limitations: None
********************************************************************************
END_FUNCTION_HDR*/
void ApplNmBusOffEnd(const uint16_t CurChannel)/*indicates bus off error occured*/
{
(void)CurChannel;
Com_TxStart();
Com_RxStart();
}
/* BEGIN_FUNCTION_HDR
********************************************************************************
* Function Name: Can_BusOff
*
* Description: bus-off
*
* Inputs: None
*
* Outputs: None
*
* Limitations: None
********************************************************************************
END_FUNCTION_HDR*/
FUNC(void, CAN_BUSOFF_PRIVATE_CODE) Can_BusOff(const uint16_t CanControllerId)
{
uint16_t CurChannel;
CurChannel = CanControllerId;
nmStatusNMBusOffFlag = 1u;
}
/*This callback function is performed when busOff recovery successed.*/
void ApplNmBusOffRecoverySuccess(const uint16_t nmChannelHandle)
{
uint16_t CurChannel;
CurChannel = nmChannelHandle;
if(1 == nmStatusErrRestoring)
{
/*OsekNm_008*/
nubNmBusOffCnt = 0;
nmStatusSlowRecovery = 0;
nmStatusErrRestoring = 0;
}
}
void ApplNmCanBusOffRecoveryFail(const uint16_t nmChannelHandle)
{
/*Bus Off recovery failed */
}
/* BEGIN_FUNCTION_HDR
********************************************************************************
* Function Name: BusErrorRecover
*
* Description: Process the NM when BusOff.
*
* Inputs: initMode
*
* Outputs: None
*
* Limitations: None
********************************************************************************
END_FUNCTION_HDR*/
STATIC FUNC(void, CAN_BUSOFF_PRIVATE_CODE) NmBusErrorRecover
(
const uint16_t CurChannel
)
{
/*OsekNm_008*/
(void)CanNm_PassiveStartUp(0);
nubNmBusOffCnt++;
nmStatusErrRestoring = 1u;
#if ( NM_BUSOFF_FAST_RECOVERY_ENABLE != STD_OFF)
if((nubNmBusOffCnt <= NM_BUSOFF_FAST_RECOVERY_TIMES)&&(0 == nmStatusSlowRecovery))
{
if(nubNmBusOffCnt == NM_BUSOFF_FAST_RECOVERY_TIMES)
{
/* 1:Fast recover will try last one time,Slow recover will be processed*/
nmStatusSlowRecovery = 1u;
nubNmBusOffCnt = 0;
}
else
{
}
nmTimerCntTbusoff = NM_COUNT_FAST_TBUSOFF;
/*CallBack function, inform Application Bus off*/
ApplNmBusOff(CurChannel);
}
else if(nubNmBusOffCnt <= NM_BUSOFF_SLOW_RECOVERY_TIMES)
#else
if(nubNmBusOffCnt <= NM_BUSOFF_SLOW_RECOVERY_TIMES)
#endif
{
/*OsekNm_006*/
nmTimerCntTbusoff = NM_COUNT_SLOW_TBUSOFF;
/*CallBack function, inform Application Bus off*/
ApplNmBusOff(CurChannel);
}
else
{
nubNmBusOffCnt = 0;
/*process fast recover first*/
nmStatusSlowRecovery = 0u;
ApplNmCanBusOffRecoveryFail(CurChannel);
}
}
/* BEGIN_FUNCTION_HDR
********************************************************************************
* Function Name: NmTerrTimeOutProc
*
* Description: Carry out this event Function when Time-out Terr
*
* Inputs: None
*
* Outputs: None
*
* Limitations: None
********************************************************************************
END_FUNCTION_HDR*/
STATIC FUNC(void, CAN_BUSOFF_PRIVATE_CODE) NmTerrTimeOutProc
(
const uint16_t CurChannel
)
{
Nm_StateType nmCurState_Par;
Nm_ModeType nmCurMode_Par;
uint32_t primask;
BusOffCanInterruptDisable();
/*OsekNm_004 end*/
if(1u == nmStatusNMBusError )
{
nmStatusNMBusError = 0;
/*clear CAN driver buffer*/
NmCanClearBuffer(CurChannel);
/*OsekNm_008 start*/
NMBusErrorCanInit(CurChannel);
NMBusErrorCanStart(CurChannel);
ApplNmBusOffEnd(CurChannel);
/* enable application communication (D_online) */
(void)NmCanTxOnline(CurChannel);
/*OsekNm_008 end*/
}
else
{
/*nothing to do*/
}
Com_Transmit(0,&COM_TxDataPtr[0]);
BusOffCanInterruptRestore();
}
/* BEGIN_FUNCTION_HDR
********************************************************************************
* Function Name: NmTbusOffRecoveryTimeOutProc
*
* Description: BusOff recovery process
*
* Inputs: None
*
* Outputs: None
*
* Limitations: None
********************************************************************************
END_FUNCTION_HDR*/
/*OsekNm_006*/
STATIC FUNC(void, CAN_BUSOFF_PRIVATE_CODE) NmTBusOffRecoveryTimeOutProc
(
const uint16_t CurChannel
)
{
NmTerrTimeOutProc(CurChannel);
}
/* BEGIN_FUNCTION_HDR
********************************************************************************
* Function Name: NmTimerTTxCntFun
*
* Description: bus-off timer function
*
* Inputs: None
*
* Outputs: None
*
* Limitations: None
********************************************************************************
END_FUNCTION_HDR*/
/*OsekNm_006*/
STATIC FUNC(void, CAN_BUSOFF_PRIVATE_CODE) NmTimerTBusOffCntFun
(
const uint16_t CurChannel
)
{
uint32_t primask;
BusOffCanInterruptDisable();
if(nmTimerCntTbusoff != 0)
{
nmTimerCntTbusoff--;
if(0 == nmTimerCntTbusoff)
{
NmTBusOffRecoveryTimeOutProc(CurChannel);
}
else
{
/* do nothing */
}
}
else
{
/* do nothing */
}
BusOffCanInterruptRestore();
}
/* BEGIN_FUNCTION_HDR
********************************************************************************
* Function Name: CanBusOffMainFunction
*
* Description: bus-off
*
* Inputs: None
*
* Outputs: None
*
* Limitations: None
********************************************************************************
END_FUNCTION_HDR*/
FUNC(void, CAN_BUSOFF_PRIVATE_CODE) CanBusOffMainFunction(void)
{
NmCanBusOffCheckFun(0);
NmTimerTBusOffCntFun(0);
}
/* BEGIN_FUNCTION_HDR
********************************************************************************
* Function Name: CanBusOffCheckFun
*
* Description: bus-off
*
* Inputs: None
*
* Outputs: None
*
* Limitations: None
********************************************************************************
END_FUNCTION_HDR*/
static FUNC(void, CAN_BUSOFF_PRIVATE_CODE) NmCanBusOffCheckFun(const uint16_t CurChannel)
{
uint32_t primask;
if(1 == nmStatusNMBusOffFlag)
{
BusOffCanInterruptDisable();
(void)NmCanTxOffline(CurChannel);
nmStatusNMBusOffFlag = 0;
nmStatusNMBusError = 1;
NmCanClearBuffer(CurChannel);
// NMBusErrorCanInit(CurChannel);
// NMBusErrorCanStart(CurChannel);
/*Bus off recovery*/
NmBusErrorRecover(CurChannel);
BusOffCanInterruptRestore();
}
else
{
/*do nothing*/
}
}