Commit 185cd29c authored by 何锐's avatar 何锐

feat:增加busoff恢复

parent af701743
......@@ -7,24 +7,157 @@
#include "RSCAN_Table.h"
#include "Check_Ctrl.h"
#define RSCAN0_BUS_OFF_LV1_RECOVERY_TIME 100U /* Bus-off ???100ms */
#define RSCAN0_BUS_OFF_LV2_RECOVERY_TIME 1000U /* Bus-off???1000ms */
void RSCAN0_CH4_Abort_All(void)
{
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_0);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_1);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_2);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_3);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_4);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_5);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_6);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_7);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_8);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_9);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_10);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_11);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_12);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_13);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_14);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_15);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_16);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_17);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_18);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_19);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_20);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_21);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_22);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_23);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_24);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_25);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_26);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_27);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_28);
RSCAN0_CH4_Abort(RSCAN_CHANNEL_BUF_29);
}
BusOffMonitorStruct BusOffMonitor; // BusOff监控结构体
static uint8_t BusOffCnt = 0u;
// static uint8_t BusOffCnt = 0u;
// //初始化Bus Off监控结构体
// void BusOff_Init(void)
// {
// //重置相关信息
// BusOffMonitor.Status = BUS_OFF_STATUS_STABLE;
// BusOffMonitor.Timer = 0;
// BusOffMonitor.Cnt = 0;
// BusOffCnt = 0;
// }
uint8_t UDS_DtcBusoffCnt;
static uint8_t BusOffCnt = 0u;
// OSEK BusOff的判断,只需判断无需进行恢复操作
//初始化Bus Off监控结构体
void BusOff_Init(void)
{
//重置相关信息
BusOffMonitor.Status = BUS_OFF_STATUS_STABLE;
BusOffMonitor.Timer = 0;
BusOffMonitor.Cnt = 0;
BusOffCnt = 0;
BusOffMonitor.Timer = 0;
BusOffMonitor.Cnt = 0;
BusOffCnt = 0;
UDS_DtcBusoffCnt = 0u;
// end
}
void Can_BusOffRecover(void)
{
BusOffMonitor.Cnt = 0u;
BusOffMonitor.Status = 0u;
BusOffMonitor.Timer = 0u;
UDS_DtcBusoffCnt = 0u;
}
uint8_t GetBusOffState(void)
{
uint8_t rscan_st;
rscan_st = RSCAN0_CH4_Get_Busoff_Status();
return rscan_st;
}
void CanBusoffRecover(void)
{
RSCAN0_CH4_Busoff_Recover();
}
// OSEK BusOff的判断,只需判断无需进行恢复操作
void BusOff_Service(void)
{
RSCAN0_CH4_Busoff_Recover( );
RSCAN0_CH1_Busoff_Recover( );
RSCAN0_CH2_Busoff_Recover( );
if (GetBusOffState() != 0u)
{
RSCAN0_CH4_Abort_All();
BusOffMonitor.RecoverCnt = 0u;
if (BusOffMonitor.Status == BUS_OFF_STATUS_STABLE)
{
BusOffMonitor.Status = BUS_OFF_STATUS_LV1;
}
if (BusOffMonitor.Status == BUS_OFF_STATUS_LV1)
{
BusOffMonitor.Timer++;
if (BusOffMonitor.Timer >= RSCAN0_BUS_OFF_LV1_RECOVERY_TIME / 10U)
{
BusOffMonitor.Timer = 0U;
Can_QuickTimer_Init();
CanBusoffRecover();
if(UDS_DtcBusoffCnt <= 100u)
{
UDS_DtcBusoffCnt ++;
}
BusOffMonitor.Cnt++;
if (BusOffMonitor.Cnt >= 10U)
{
BusOffMonitor.Cnt = 0U;
BusOffMonitor.Status = BUS_OFF_STATUS_LV2;
}
}
}
else if (BusOffMonitor.Status == BUS_OFF_STATUS_LV2)
{
BusOffMonitor.Timer++;
if (BusOffMonitor.Timer >= RSCAN0_BUS_OFF_LV2_RECOVERY_TIME / 10U)
{
BusOffMonitor.Timer = 0U;
Can_QuickTimer_Init();
CanBusoffRecover();
if(UDS_DtcBusoffCnt <= 100u)
{
UDS_DtcBusoffCnt ++;
}
}
}
}
else
{
if(BusOffMonitor.RecoverCnt < 2u)
{
BusOffMonitor.RecoverCnt ++;
}
else
{
BusOffMonitor.Cnt = 0u;
BusOffMonitor.Status = 0u;
BusOffMonitor.Timer = 0u;
UDS_DtcBusoffCnt = 0u;
}
}
}
/***Middle***/
void Can_Init(void)
......@@ -199,3 +332,13 @@ void Can_Confirm(uint32_t Identifier, uint8_t TransferStatus)
{
}
}
void Can_QuickTimer_Init(void)
{
uint32_t i = 0u;
for ( i = 0u; i < CAN_CH4_ID_SEND_TOTAL; i++ )
{
// Can_Msg_TX_FastInitCycle(&CAN_CH4_CanMsgTxOp, i, CAN_CH4_CANSendAttr [ i ].u32MsgCycleOffset);
}
}
......@@ -8,6 +8,7 @@ typedef struct
uint8_t Status; //当前所处Bus Off 状态
uint8_t Timer; // Bus Off计时器
uint8_t Cnt; // Bus Off尝试恢复次数
uint8_t RecoverCnt;
} BusOffMonitorStruct;
typedef enum
{
......@@ -77,4 +78,5 @@ void Can_SetTx_St(Can_SendType Status);
void Can_SetRx_St(Can_ReceiveType Status);
void Can_Abort_All(void);
void Can_Uds_Abort(void);
void Can_QuickTimer_Init(void);
#endif
......@@ -90,7 +90,7 @@ uint8_t sartigon = 0;
uint8_t sendflag = 0;
void Sys_Run_Mode_10ms_Tasks_Group(void)
{
// BusOff_Service( );
BusOff_Service( );
Key_Service( );
Recv_Byte();
}
......
......@@ -93,6 +93,7 @@
#define RSCAN_125K_NSJW ((RSCAN0_125K_SJW - 1U) << 11U)
#define RSCAN_125K_NBRP (RSCAN_125K_BIT_RATE_DIV - 1U)
#define RSCAN_TIME_OUT_MAX 0X0000FFFFUL
/*RCFDCnCFDCFCCk*/
/*Transmit/Receive FIFO Buffer Depth Configuration*/
......@@ -1708,141 +1709,144 @@ RSCAN_SetState RSCAN0_CH5_Set_TXBUF_Data(RSCAN_Channel_Buf_en_t enBufIndex, CAN_
return enRSCANStatus;
}
/********************************************************/
/*
0: Not in bus off state
1: In bus off state
*/
uint8_t RSCAN0_CH0_Get_Busoff_Status(void)
{
uint8_t u8BusoffStatus = 0U;
if (RCFDC0CFDC0ERFL & 0x08UL)
{
u8BusoffStatus = 1U;
}
return u8BusoffStatus;
uint8_t u8BusoffStatus = 0U;
if (RCFDC0CFDC0ERFL & 0x08UL)
{
u8BusoffStatus = 1U;
}
return u8BusoffStatus;
}
uint8_t RSCAN0_CH1_Get_Busoff_Status(void)
{
uint8_t u8BusoffStatus = 0U;
if (RCFDC0CFDC1ERFL & 0x08UL)
{
u8BusoffStatus = 1U;
}
return u8BusoffStatus;
uint8_t u8BusoffStatus = 0U;
if (RCFDC0CFDC1ERFL & 0x08UL)
{
u8BusoffStatus = 1U;
}
return u8BusoffStatus;
}
uint8_t RSCAN0_CH2_Get_Busoff_Status(void)
{
uint8_t u8BusoffStatus = 0U;
if (RCFDC0CFDC2ERFL & 0x08UL)
{
u8BusoffStatus = 1U;
}
return u8BusoffStatus;
uint8_t u8BusoffStatus = 0U;
if (RCFDC0CFDC2ERFL & 0x08UL)
{
u8BusoffStatus = 1U;
}
return u8BusoffStatus;
}
uint8_t RSCAN0_CH3_Get_Busoff_Status(void)
{
uint8_t u8BusoffStatus = 0U;
if (RCFDC0CFDC3ERFL & 0x08UL)
{
u8BusoffStatus = 1U;
}
return u8BusoffStatus;
uint8_t u8BusoffStatus = 0U;
if (RCFDC0CFDC3ERFL & 0x08UL)
{
u8BusoffStatus = 1U;
}
return u8BusoffStatus;
}
uint8_t RSCAN0_CH4_Get_Busoff_Status(void)
{
uint8_t u8BusoffStatus = 0U;
if (RCFDC0CFDC4ERFL & 0x08UL)
{
u8BusoffStatus = 1U;
}
return u8BusoffStatus;
uint8_t u8BusoffStatus = 0U;
if (RCFDC0CFDC4ERFL & 0x08UL)
{
u8BusoffStatus = 1U;
}
return u8BusoffStatus;
}
uint8_t RSCAN0_CH5_Get_Busoff_Status(void)
{
uint8_t u8BusoffStatus = 0U;
if (RCFDC0CFDC5ERFL & 0x08UL)
{
u8BusoffStatus = 1U;
}
return u8BusoffStatus;
uint8_t u8BusoffStatus = 0U;
if (RCFDC0CFDC5ERFL & 0x08UL)
{
u8BusoffStatus = 1U;
}
return u8BusoffStatus;
}
void RSCAN0_CH0_Busoff_Recover(void)
{
if (RSCAN0_CH0_Get_Busoff_Status())
{
RCFDC0CFDC0ERFL &= 0xFFFFFFF7UL;
RCFDC0CFDC0CTR &= 0xFFFFFFF8UL; /* CommunicationMode */
while ((RCFDC0CFDC0STS & 0x87UL) != 0x80UL)
{
}
}
if (RSCAN0_CH0_Get_Busoff_Status())
{
uint32_t u32RSCANTimeCount;
RCFDC0CFDC0ERFL &= 0xFFFFFFF7UL;
RCFDC0CFDC0CTR &= 0xFFFFFFF8UL;
u32RSCANTimeCount = 0UL;
while (((RCFDC0CFDC0STS & 0x07UL) != 0x0UL) && (u32RSCANTimeCount < RSCAN_TIME_OUT_MAX))
{
u32RSCANTimeCount++;
}
}
}
void RSCAN0_CH1_Busoff_Recover(void)
{
if (RSCAN0_CH1_Get_Busoff_Status())
{
RCFDC0CFDC1ERFL &= 0xFFFFFFF7UL;
RCFDC0CFDC1CTR &= 0xFFFFFFF8UL; /* CommunicationMode */
while ((RCFDC0CFDC1STS & 0x87UL) != 0x80UL)
{
}
}
if (RSCAN0_CH1_Get_Busoff_Status())
{
uint32_t u32RSCANTimeCount;
RCFDC0CFDC1ERFL &= 0xFFFFFFF7UL;
RCFDC0CFDC1CTR &= 0xFFFFFFF8UL;
u32RSCANTimeCount = 0UL;
while (((RCFDC0CFDC1STS & 0x07UL) != 0x0UL) && (u32RSCANTimeCount < RSCAN_TIME_OUT_MAX))
{
u32RSCANTimeCount++;
}
}
}
void RSCAN0_CH2_Busoff_Recover(void)
{
if (RSCAN0_CH2_Get_Busoff_Status())
{
RCFDC0CFDC2ERFL &= 0xFFFFFFF7UL;
RCFDC0CFDC2CTR &= 0xFFFFFFF8UL; /* CommunicationMode */
while ((RCFDC0CFDC2STS & 0x87UL) != 0x80UL)
{
}
}
if (RSCAN0_CH2_Get_Busoff_Status())
{
uint32_t u32RSCANTimeCount;
RCFDC0CFDC2ERFL &= 0xFFFFFFF7UL;
RCFDC0CFDC2CTR &= 0xFFFFFFF8UL;
u32RSCANTimeCount = 0UL;
while (((RCFDC0CFDC2STS & 0x07UL) != 0x0UL) && (u32RSCANTimeCount < RSCAN_TIME_OUT_MAX))
{
u32RSCANTimeCount++;
}
}
}
void RSCAN0_CH3_Busoff_Recover(void)
{
if (RSCAN0_CH3_Get_Busoff_Status())
{
RCFDC0CFDC3ERFL &= 0xFFFFFFF7UL;
RCFDC0CFDC3CTR &= 0xFFFFFFF8UL; /* CommunicationMode */
while ((RCFDC0CFDC3STS & 0x87UL) != 0x80UL)
{
}
}
if (RSCAN0_CH3_Get_Busoff_Status())
{
uint32_t u32RSCANTimeCount;
RCFDC0CFDC3ERFL &= 0xFFFFFFF7UL;
RCFDC0CFDC3CTR &= 0xFFFFFFF8UL;
u32RSCANTimeCount = 0UL;
while (((RCFDC0CFDC3STS & 0x07UL) != 0x0UL) && (u32RSCANTimeCount < RSCAN_TIME_OUT_MAX))
{
u32RSCANTimeCount++;
}
}
}
void RSCAN0_CH4_Busoff_Recover(void)
{
if (RSCAN0_CH4_Get_Busoff_Status())
{
RCFDC0CFDC4ERFL &= 0xFFFFFFF7UL;
RCFDC0CFDC4CTR &= 0xFFFFFFF8UL; /* CommunicationMode */
while ((RCFDC0CFDC4STS & 0x87UL) != 0x80UL)
{
}
}
if (RSCAN0_CH4_Get_Busoff_Status())
{
uint32_t u32RSCANTimeCount;
RCFDC0CFDC4ERFL &= 0xFFFFFFF7UL;
RCFDC0CFDC4CTR &= 0xFFFFFFF8UL;
u32RSCANTimeCount = 0UL;
while (((RCFDC0CFDC4STS & 0x07UL) != 0x0UL) && (u32RSCANTimeCount < RSCAN_TIME_OUT_MAX))
{
u32RSCANTimeCount++;
}
}
}
void RSCAN0_CH5_Busoff_Recover(void)
{
if (RSCAN0_CH5_Get_Busoff_Status())
{
RCFDC0CFDC5ERFL &= 0xFFFFFFF7UL;
RCFDC0CFDC5CTR &= 0xFFFFFFF8UL; /* CommunicationMode */
while ((RCFDC0CFDC5STS & 0x87UL) != 0x80UL)
{
}
}
if (RSCAN0_CH5_Get_Busoff_Status())
{
uint32_t u32RSCANTimeCount;
RCFDC0CFDC5ERFL &= 0xFFFFFFF7UL;
RCFDC0CFDC5CTR &= 0xFFFFFFF8UL;
u32RSCANTimeCount = 0UL;
while (((RCFDC0CFDC5STS & 0x07UL) != 0x0UL) && (u32RSCANTimeCount < RSCAN_TIME_OUT_MAX))
{
u32RSCANTimeCount++;
}
}
}
void RSCAN0_CH0_Abort(RSCAN_Channel_Buf_en_t enBufIndex)
{
uint32_t u32RSCANBufIndexP = (enBufIndex + 32UL * 0UL);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment