398 lines
10 KiB
C
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*/
|
|
}
|
|
|
|
}
|