COM_CAN.c 3.29 KB
Newer Older
时昊's avatar
时昊 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131

//#include "UDS_Common.h"
#include "CAN_CH0_CAN_Communication_Matrix.h"
//#include "include.h"
//#include "UDS_Common.h"
//#include "IC_Configuration.h"

//#include "RTE_CAN.h"
//#include "TYW_stdint.h"
#include <string.h>
//#include <EOL_Para.h>
//#include <DataProcess_Common.h>
//#include <CAN_Signal_Select.h>
#include "g_includes.h"


#pragma alignvar(8)
static uint32_t pRXBuff[CAN_RX_MSG_Block * CAN_CH0_ID_TOTAL_MAX];
//#pragma alignvar(8)
//static uint32_t pTXBuff[CAN_TX_MSG_Block * CAN_CH0_ID_SEND_TOTAL];

uint32_t pRXBuff_CH0[CAN_RX_MSG_Block * CAN_CH0_ID_TOTAL_MAX];


uint8_t COM_APP_Process(st_CAN_Msg *Msg);

void COM_CAN_Init(void)
{
    memset(pRXBuff, 0, sizeof(pRXBuff));
    CAN_CH0_CanMsgOp.CAN_MSG_Analysis = ( st_CANMsgStruct * )pRXBuff;
    //CAN_CH0_CanMsgTxOp.CanMsg         = pTXBuff;
    Can_RX_BuffInit(&CAN_CH0_CanMsgOp, CAN_CH0_CAN_MSG_CONST_ARRAY, CAN_CH0_ID_TOTAL_MAX);
    //Can_TX_BuffInit(&CAN_CH0_CanMsgTxOp, CAN_CH0_CANSendAttr, CAN_CH0_ID_SEND_TOTAL, Can_Write);
    //CAN_TX_SetEnable(&CAN_CH0_CanMsgTxOp, CAN_N_TX_Disable);
    CAN_RX_SetEnable(&CAN_CH0_CanMsgOp, CAN_N_RX_Enable);


}

void COM_RX_Process(void)
{
    CanMSg_XMS_Analysis(&CAN_CH0_CanMsgOp, 5u);
}

uint8_t BusOffEvent;
/**
  *获取busoff状态
  *@return busoff状态 0正常,1异常
  */
uint8_t getBUS_OFF_Status(void)
{
    return BusOffEvent;
}
typedef enum
{
    BUSSOFF_CH_CH0,
    BUSSOFF_CH_SUM,
}BUSSSOFF_CH_enum;

static RSCAN0BusoffMonitorStruct     RSCAN0Busoff[BUSSOFF_CH_SUM];

void Can_CH0_BusOffRecover(void);
void Can_CH0_BusOff_Fun(void);


void Can_CH0_BusOff_Fun(void)
{
    if ((RSCAN0_CH0_Get_Busoff_Status() != 0U))
    {
        RSCAN0_CH0_Abort(0);
    
        if (RSCAN0Busoff[BUSSOFF_CH_CH0].Status == RSCAN0_BUS_STABLE)
        {
            RSCAN0Busoff[BUSSOFF_CH_CH0].Status = RSCAN0_BUS_OFF_LV1;
        }

        if (RSCAN0Busoff[BUSSOFF_CH_CH0].Status == RSCAN0_BUS_OFF_LV1)
        {
            RSCAN0Busoff[BUSSOFF_CH_CH0].Timer++;
            if (RSCAN0Busoff[BUSSOFF_CH_CH0].Timer >= (RSCAN0_BUS_OFF_LV1_RECOVERY_TIME / 10U))
            {
                RSCAN0Busoff[BUSSOFF_CH_CH0].Timer = 0U;

                RSCAN0Busoff[BUSSOFF_CH_CH0].Cnt++;
                if (RSCAN0Busoff[BUSSOFF_CH_CH0].Cnt >= 10U)
                {
               
                    RSCAN0Busoff[BUSSOFF_CH_CH0].Cnt = 0U;

                    RSCAN0Busoff[BUSSOFF_CH_CH0].Status = RSCAN0_BUS_OFF_LV2;
                }
                RSCAN0_CH0_Busoff_Recover( );
            }
        }
        else if (RSCAN0Busoff[BUSSOFF_CH_CH0].Status == RSCAN0_BUS_OFF_LV2)
        {
            RSCAN0Busoff[BUSSOFF_CH_CH0].Timer++;

            if (RSCAN0Busoff[BUSSOFF_CH_CH0].Timer >= (RSCAN0_BUS_OFF_LV2_RECOVERY_TIME / 10U))
            {
                RSCAN0Busoff[BUSSOFF_CH_CH0].Timer = 0U;
                RSCAN0_CH0_Busoff_Recover( );
            }
        }
        else
        {

        }
    }
    else                                          /* 总线正常,没有Bus-off发生/**/
    {
        Can_CH0_BusOffRecover();
    }
}

void Can_BusOff_Fun(void)
{
    Can_CH0_BusOff_Fun();
}

void Can_BusOffRecover(void)
{   
    Can_CH0_BusOffRecover();
}

void Can_CH0_BusOffRecover(void)
{
    RSCAN0Busoff[BUSSOFF_CH_CH0].Cnt = 0u;
    RSCAN0Busoff[BUSSOFF_CH_CH0].Status = 0u;
    RSCAN0Busoff[BUSSOFF_CH_CH0].Timer = 0u;
}