HDG/ECU_APP/user/appTask.c

497 lines
10 KiB
C
Raw Normal View History

2024-05-26 11:13:55 +08:00
#include "appTask.h"
2024-05-26 08:08:32 +08:00
#include "iodefine.h"
#include "extern.h"
#include "r_cg_adc.h"
#include "r_cg_intc.h"
#include "PINdef.h"
#include "hwCtrl.h"
#include "crc.h"
#include "pfdl.h"
u8 can_data_init_flag = 0;
unsigned long Can_1ms_count_alive;
2024-05-26 11:13:55 +08:00
unsigned char IGN_Voltage_error_flag;
uint16_t IGN_Voltage_error_count;
2024-05-26 08:08:32 +08:00
unsigned char Timer_1ms_flag;
unsigned char Timer_5ms_flag;
unsigned char Timer_10ms_flag;
unsigned char Timer_20ms_flag;
unsigned char Timer_50ms_flag;
unsigned char Timer_1000ms_flag;
unsigned int CAN_LostCount;
unsigned char key_count, key_last;
unsigned char IGN_Lost, IGN_Lost_Count;
unsigned char IGN_On, IGN_On_Count;
/********************* Network Manage ****************************/
unsigned char ucIgnStus;
unsigned int uiBusOffCnt; // ms
unsigned char ucBusOffModeState; // 0:Normal 1~4:Fast Rec 5:Slow Rec
unsigned char BusoffFlag;
/***************************************************/
uint16_t VehicleSpeedRaw,VehicleSpeed;
uint8_t nouse;//Relocation value is odd number
void Apply_task(void)
{
// DiagnosticSession_Present=MngDcm_GetDiagnosticSession();
2024-05-26 11:13:55 +08:00
2024-05-26 08:08:32 +08:00
// DiagnosticSession_Present=MngDcm_GetDiagnosticSession();
if(CAN_STB == 0 && ucBusOffModeState == 0)//Tx enable
{
TxServe();
}
if (Timer_1ms_flag == 1)
{
Timer_1ms_flag = 0;
MngDcm_MainFunction();
MngCanTp_MainFunction();
2024-05-26 11:13:55 +08:00
App28sTxRxStatus = GetNormalMsgSts();
Nw28sTxRxStatus = GetNetworkMsgSts();
2024-05-26 08:08:32 +08:00
if (BusOff_Detect_delay_count == 0 /*&& (ad_voltage_fact[2]>=85 && ad_voltage_fact[2]<=165)*/)
{
BusOff_Detect();
}
KeyScan();
2024-05-26 11:13:55 +08:00
//IGN_Detect();
//CanNwHandle();
2024-05-26 08:08:32 +08:00
}
if (Timer_5ms_flag == 1)
{
Timer_5ms_flag = 0;
CAN_RX_Data_Handle();
2024-05-26 11:13:55 +08:00
// IGN_Detect();
2024-05-26 08:08:32 +08:00
}
if (Timer_10ms_flag == 1)
{
Timer_10ms_flag = 0;
2024-05-26 11:13:55 +08:00
KeyPro();
Can_Msg_Change();
2024-05-26 08:08:32 +08:00
}
if (Timer_20ms_flag == 1)
{
Timer_20ms_flag = 0;
2024-05-26 11:13:55 +08:00
2024-05-26 08:08:32 +08:00
IGN_Voltage_Detect();
}
if (Timer_50ms_flag == 1)
{
Timer_50ms_flag = 0;
2024-05-26 11:13:55 +08:00
BL_Ctrl(1);
//TxTestMsg();
2024-05-26 08:08:32 +08:00
//SleepDetect();//TODO
}
}
2024-05-26 11:13:55 +08:00
void KeyPro(void)
2024-05-26 08:08:32 +08:00
{
2024-05-26 11:13:55 +08:00
//按下
if (getKeyPressFlag(SIGID_SW_LOCK_IN) == KEY_PRESSED)
2024-05-26 08:08:32 +08:00
{
2024-05-26 11:13:55 +08:00
2024-05-26 08:08:32 +08:00
}
2024-05-26 11:13:55 +08:00
if (getKeyPressFlag(SIGID_SW_L_IN) == KEY_PRESSED)
2024-05-26 08:08:32 +08:00
{
2024-05-26 11:13:55 +08:00
2024-05-26 08:08:32 +08:00
}
}
2024-05-26 11:13:55 +08:00
void Can_Msg_Change(void)
{
//CAN_45A.Msg_Part.SCM_PsngrSeatBeltWarnSts = sbrWarnState;
CAN_188.Msg_Part.SL_Fswitch = 0;
CAN_188.Msg_Part.SL_Hswitch = 0;
CAN_188.Msg_Part.SL_Lswitch = 0;
CAN_188.Msg_Part.SL_Nswitch = 0;
CAN_188.Msg_Part.SL_Rswitch = 0;
CAN_188.Msg_Part.err1 = 0;
CAN_188.Msg_Part.err2 = 0;
CAN_188.Msg_Part.err3 = 0;
CAN_188.Msg_Part.err4 = 0;
CAN_188.Msg_Part.err5 = 0;
CAN_188.Msg_Part.err6 = 0;
CAN_188.Msg_Part.err7 = 0;
CAN_188.Msg_Part.err8 = 0;
CAN_188.Msg_Part.CRC = CRC_Calc_Table(CAN_188.Msg_Byte,7);
}
2024-05-26 08:08:32 +08:00
void EEL_READ(void)
{
}
#define SC_500MS_PC_1MS 500
void EEL_WRITE(void)
{
}
void EEL_Write_Enable_Check(void)
{
2024-05-26 11:13:55 +08:00
//EEL_SAVE_ENABLE = 1;
2024-05-26 08:08:32 +08:00
}
void DID_data_save_init(void)
{
unsigned char DID_init_Buf[33], i;
ReadFlashData(DID_init_Buf, 0x000F1000 + 0x400, 1);
if (DID_init_Buf[0] == 0xff)
{
for (i = 0; i < 33; i++)
{
if (i < 8)
{
DID_init_Buf[i] = DID_0xF110_VehicleNetworkConfiguration[i];
}
else if (i < 25)
{
DID_init_Buf[i] = DID_0xF190_vehicleIdentificationNumber[i - 8];
}
else if (i < 33)
{
DID_init_Buf[i] = DID_0xF197_SystemNameOrEngineType[i - 25];
}
}
WriteDataflash(DID_init_Buf, 0x000F1000 + 0x400, 33);
}
ReadFlashData(DID_init_Buf, 0x000F1000 + 0x800, 1);
if (DID_init_Buf[0] == 0xff)
{
for (i = 0; i < 32; i++)
{
if (i < 16)
{
DID_init_Buf[i] = DID_0xF198_RepairShopCodeOrTesterSerialNumber[i];
}
else if (i < 20)
{
DID_init_Buf[i] = DID_0xF199_ProgrammingOrConfigurationDate[i - 16];
}
else if (i < 24)
{
DID_init_Buf[i] = DID_0xF19D_ECUInstallationDateDataIdentifier[i - 20];
}
else if (i < 32)
{
DID_init_Buf[i] = DID_0xF112_VehicleName[i - 24];
}
}
WriteDataflash(DID_init_Buf, 0x000F1000 + 0x800, 32);
}
}
unsigned char BusOffTimeCnt = 0;
unsigned short BusOff1msCnt = 0;
unsigned char CanBusOffPro(void)
{
unsigned char ret = 0;
if (C0ERFLLL & 0x08) // Bus-Off Stutas
{
ret = 1;
}
if ((C0CTRLL & 0x02) == 0x02) // Channal Halt Mode
{
if (C0ERFLLL & 0x08) // Bus-Off Stutas
{
BusOff1msCnt++;
ret = 1;
}
if ((BusOffTimeCnt < 10) && (BusOff1msCnt >= 100))
{
BusOffTimeCnt++;
BusOff1msCnt = 0;
C0ERFLL = 0;
C0CTRL &= ~0x03; /* CHMDC[1:0] = 00B change to communication mode. */
}
else if ((BusOffTimeCnt >= 10) && (BusOff1msCnt >= 1000))
{
BusOffTimeCnt = 10;
BusOff1msCnt = 0;
C0ERFLL = 0;
C0CTRL &= ~0x03; /* CHMDC[1:0] = 00B change to communication mode. */
}
}
return ret;
}
#define FAST_BUSOFF_THRESHOULD 100 // 100MS
#define SLOW_BUSOFF_THRESHOULD 1000 // 100MS
void BusOff_Recovery(void);
void BusOff_Detect(void)
{
if ((C0ERFLL & 0x08) && (R_CAN_ReadChStatus_CH0() & 0x02))
{
if (uiBusOffCnt == 0)
{
if (ucBusOffModeState == 0)
{
uiBusOffCnt = FAST_BUSOFF_THRESHOULD;
// BusOff_Recovery();
}
if ((ucBusOffModeState > 0) && (ucBusOffModeState < 5))
{
BusOff_Recovery();
uiBusOffCnt = FAST_BUSOFF_THRESHOULD; //fast recover
}
else if (ucBusOffModeState >= 5)
{
BusOff_Recovery();
uiBusOffCnt = SLOW_BUSOFF_THRESHOULD; //soft recover
}
else
{
;
}
if (ucBusOffModeState < 5)
{
ucBusOffModeState++;
}
}
}
else
{
if (ucBusOffModeState > 0)
{
if (uiBusOffCnt == 0)
{
ucBusOffModeState = 0;
// 原来程序的标志位
}
}
else
{
;
}
BusOff_flag = 0;
}
}
void BusOff_Recovery(void)
{
CFCCL0L &= ~0x01;
NOP();
CFCCL0L |= 0x01;
if (C0ERFLL != 0)
{
C0ERFLL = 0;
}
C0CTRL &= 0xfffc; // bus off
}
uint16_t SupplyVoltage;
2024-05-26 11:13:55 +08:00
uint32_t IGN_Voltage;
void IGN_Voltage_Detect(void)//20ms
2024-05-26 08:08:32 +08:00
{
uint32_t adval;
adval = getAdval(ADCH_IGN);
2024-05-26 11:13:55 +08:00
SupplyVoltage = (adval*57*5)>>10; //100mV
//adval / 1024 * 5 * 5.7
IGN_Voltage = ((adval*57*500)>>10) + 700;//1mv
if (IGN_Voltage <= 8500 )
2024-05-26 08:08:32 +08:00
{
IGN_Voltage_error_count++;
if (IGN_Voltage_error_count >= 250)
{
2024-05-26 11:13:55 +08:00
IGN_Voltage_error_count = 250;
2024-05-26 08:08:32 +08:00
IGN_Voltage_error_flag = 1;
}
}
2024-05-26 11:13:55 +08:00
else if (IGN_Voltage >= 16500 )//16.5
2024-05-26 08:08:32 +08:00
{
IGN_Voltage_error_count++;
if (IGN_Voltage_error_count >= 250)
{
2024-05-26 11:13:55 +08:00
IGN_Voltage_error_count = 250;
2024-05-26 08:08:32 +08:00
IGN_Voltage_error_flag = 2;
}
}
2024-05-26 11:13:55 +08:00
else if (IGN_Voltage >= 9000 && IGN_Voltage <= 16000)
2024-05-26 08:08:32 +08:00
{
2024-05-26 11:13:55 +08:00
if (IGN_Voltage_error_count > 0)
{
IGN_Voltage_error_count--;
}
else
{
IGN_Voltage_error_count = 0;
IGN_Voltage_error_flag = 0;
}
2024-05-26 08:08:32 +08:00
}
if (IGN_Voltage_error_flag != 0)
{
// TAU0_Channel1_ChangeDuty(0);
}
}
void value_init(void)
{
2024-05-26 11:13:55 +08:00
2024-05-26 08:08:32 +08:00
CAN_LostCount = 500;
BusOff_Detect_delay_count = 2000;
ucIgnStus = IGN_OFF;
}
void CAN_RX_Data_Handle(void)
{
2024-05-26 11:13:55 +08:00
2024-05-26 08:08:32 +08:00
}
void SleepDetect(void)
{
// if(CAN_LostCount==0 && IGN_Lost == 1)
{
R_TAU0_Channel0_Stop();
// R_TAU0_Channel2_Stop();
// R_TAU0_Channel6_Stop();
// R_TAU1_Channel0_Stop();
TO0 = 0;
TO1 = 0;
TOE0 = 0;
TOE1 = 0;
TO0 = 0;
TO1 = 0;
// R_IICA0_Stop();
R_ADC_Stop();
ADCE = 0;
IICA0EN = 0;
TAU0EN = 0;
TAU1EN = 0;
P6_bit.no2 = 0;
P6_bit.no3 = 0;
P12_bit.no0 = 0;
P3_bit.no3 = 0;
P1_bit.no3 = 0;
P1_bit.no4 = 0;
P3_bit.no0 = 0;
CAN_STB = 1;
C0CTRL |= (uint16_t)(CAN_STP_BIT_ON);
GCTRL |= 0x01;
NOP();
GCTRL |= (uint16_t)(CAN_GLB_STP_BIT_ON);
PLLON = 0;
//R_INTC3_Start();
CAN0WUPIF = 0U;
CAN0WUPMK = 0U;
if (I_IGN_SIGN != IGN_ON)
STOP();
WakeUP();
}
}
void WakeUP(void)
{
// stop can and ex interrupt
CAN0WUPIF = 0U;
CAN0WUPMK = 1U;
//R_INTC3_Stop();
// WDTE = 0xff; //reset
CAN_STB = 0;
hdwinit();
R_MAIN_UserInit();
R_TAU0_Channel0_Start(); // timer
}
void Signal_Lost_Detect(unsigned char Pin,
unsigned char Lost_state,
unsigned char *Signal_Lost,
unsigned char *Signal_Lost_count,
unsigned char Lost_time)
{
if (Pin == Lost_state)
{
(*Signal_Lost_count)++;
if ((*Signal_Lost_count) >= Lost_time)
{
*Signal_Lost_count = 0;
*Signal_Lost = 1;
}
}
else
{
*Signal_Lost_count = 0;
*Signal_Lost = 0;
}
}
void IGN_Detect(void)
{
static unsigned char IGN_last;
Signal_Lost_Detect(I_IGN_SIGN, 1, &IGN_Lost, &IGN_Lost_Count, 5);
Signal_Lost_Detect(I_IGN_SIGN, 0, &IGN_On, &IGN_On_Count, 5);
if (IGN_On == 1)
{
ucIgnStus = IGN_ON;
}
else if (IGN_Lost == 1)
{
ucIgnStus = IGN_OFF;
PWN_KEY = 0;
}
if (IGN_last != ucIgnStus)
{
IGN_last = ucIgnStus;
if (IGN_ON == ucIgnStus)
C0CTRH &= ~0x0300; // 设置正常模式
}
}
/*****************diagnostic******************/
void getIGNVoltage(unsigned char* data)
{
data[0] = (uint8_t)SupplyVoltage;
}