Files
K2_DCU/Source/Comm.c
2026-04-14 00:43:29 +09:00

1437 lines
59 KiB
C

/* ========================================================================= */
/* 1. Includes */
/* ========================================================================= */
#include "main.h"
/* ========================================================================= */
/* 2. Local Macros & Constants (내부 전용 매크로 및 상수) */
/* ========================================================================= */
/* ========================================================================= */
/* 3. Local Typedefs & Structures (내부 전용 사용자 정의 자료형) */
/* ========================================================================= */
static CTx100 Tx100;
static CTx101 Tx101;
static CTx102 Tx102; // Command Data
static CTx103 Tx103; // Command Data
static CTx110 Tx110;
static CTx120 Tx120;
static CTx121 Tx121;
static CTx122 Tx122;
static CTx123 Tx123;
static CTx124 Tx124;
static CTx700 Tx700;
static CTx701 Tx701;
static CTx710 Tx710;
static CTx720 Tx720;
static CTx730 Tx730;
static CTx731 Tx731;
static CTx732 Tx732;
static CTx733 Tx733;
static CTx734 Tx734;
static CTx740 Tx740;
static CTx741 Tx741;
static CTx750 Tx750;
static CTx751 Tx751;
static CTx752 Tx752;
static CRx201 Rx201;
/* ========================================================================= */
/* 4. Internal Linkage Function Declarations (내부 동작용 Static 함수 선언) */
/* ========================================================================= */
static void CInitECanA(void);
static void CInitECanB(void);
static void CECanASetMbox(void);
static void CECanBSetMbox(void);
static void CInitECanStructure(void);
static inline Uint16 CPackBit(Uint16 data, Uint16 pos);
static inline Uint16 CPackField(Uint16 data, Uint16 mask, Uint16 pos);
/* ========================================================================= */
/* 5. Global Variables & Structure Initialization (전역 변수 및 구조체 초기화) */
/* ========================================================================= */
CCommCheck CommCheck;
// Rx - GCU
CRx200 Rx200;
CRx210 Rx210;
CRx220 Rx220;
CRx221 Rx221;
// Rx - ECU
CRx300 Rx300;
CRx301 Rx301;
CRx310 Rx310;
CRx320 Rx320;
CRx321 Rx321;
CRx322 Rx322;
#ifdef AUX_TEST
// Rx - For Aux Test
CRx400 Rx400;
#endif
/* ========================================================================= */
/* Function Definitions */
/* ========================================================================= */
interrupt void CECanInterruptA(void)
{
struct ECAN_REGS ECanShadow;
ECanShadow.CANRMP.all = ECanaRegs.CANRMP.all;
GeneralOperValue.Conection.CarComputer = 1U; // 한번이라도 통신이 수신되었다면 해당 장치가 연결되었다고 판단.
CommCheck.CarComputer = 0U; // 송신 시 타임아웃 카운트 클리어
ECanaRegs.CANRMP.all = ECanShadow.CANRMP.all;
}
static inline Uint32 CPackMboxData(Uint16 b0, Uint16 b1, Uint16 b2, Uint16 b3)
{
return (((Uint32)b0 << 24U) | ((Uint32)b1 << 16U) | ((Uint32)b2 << 8U) | (Uint32)b3);
}
void CSendECanDataA(void)
{
Uint16 uiTemp = 0U;
float32 fTemp = 0.0F;
// ---------------------------------------------------------
// [700h - MBOX0]
// ---------------------------------------------------------
Tx700.HeartBit = (Tx700.HeartBit + 1U) % 65535U;
// BYTE 0~1(HeartBit), BYTE 2(DCUversionMajor), BYTE 3(DCUversionMinor), BYTE 4(GCUversionMajor), BYTE 5(GCUversionMinor), BYTE 6(ECUversionMajor), BYTE 7(ECUversionMinor)
ECanaMboxes.MBOX0.MDL.all = CPackMboxData((Uint16)((Tx700.HeartBit >> 0U) & 0xFFU), (Uint16)((Tx700.HeartBit >> 8U) & 0xFFU),
(Uint16)FIRMWARE_VERSION_MAJOR, (Uint16)FIRMWARE_VERSION_MINOR);
ECanaMboxes.MBOX0.MDH.all = CPackMboxData(Rx200.VersionMajor, Rx200.VersionMinor, Rx300.VersionMajor, Rx300.VersionMinor);
// ---------------------------------------------------------
// [701h - MBOX1]
// ---------------------------------------------------------
Tx701.DcuPlayState = (Uint16)(GeneralOperValue.uiApuState & 0x7U);
uiTemp = 0U;
uiTemp |= CPackBit(GeneralOperValue.uiFaultOccured, 0U);
uiTemp |= CPackBit(GeneralOperValue.uiEmergency, 1U);
uiTemp |= CPackBit(KeyOperValue.KeyList.MainPower, 2U);
uiTemp |= CPackBit((GPIO_FAIL_SAFE_READ() == false) ? 1U : 0U, 3U);
Tx701.DcuState = uiTemp;
Tx701.GcuPlayState = Rx201.PlayState;
Tx701.GcuState = Rx201.State;
Tx701.EcuState = Rx301.State;
// BYTE 0(DcuPlayState), BYTE 1(DcuState), BYTE 2(GcuPlayState), BYTE 3(GcuState), BYTE 4(EcuState), BYTE 5~7(Rsvd)
ECanaMboxes.MBOX1.MDL.all = CPackMboxData(Tx701.DcuPlayState, Tx701.DcuState, Tx701.GcuPlayState, Tx701.GcuState);
ECanaMboxes.MBOX1.MDH.all = CPackMboxData(Tx701.EcuState, 0U, 0U, 0U);
// ---------------------------------------------------------
// [710h - MBOX5]
// ---------------------------------------------------------
Tx710.GcuWarning = Rx210.GcuWarning;
Tx710.EcuWarning = Rx310.EcuWarning;
// BYTE 0(GcuWarning), BYTE 1(EcuWarning), BYTE 2~7(Rsvd)
ECanaMboxes.MBOX5.MDL.all = CPackMboxData(Tx710.GcuWarning, Tx710.EcuWarning, 0U, 0U);
ECanaMboxes.MBOX5.MDH.all = CPackMboxData(0U, 0U, 0U, 0U);
// ---------------------------------------------------------
// [720h - MBOX10]
// ---------------------------------------------------------
Tx720.DcuFault0 = (Uint16)((ulDcuTotalAlarm >> 0U) & 0xFFU);
Tx720.DcuFault1 = (Uint16)((ulDcuTotalAlarm >> 8U) & 0xFFU);
Tx720.DcuFault2 = (Uint16)((ulDcuTotalAlarm >> 16U) & 0xFFU);
Tx720.DcuFault3 = (Uint16)((ulDcuTotalAlarm >> 24U) & 0xFFU);
Tx720.GcuFault0 = (Uint16)((Rx210.GcuFault >> 0U) & 0xFFU);
Tx720.GcuFault1 = (Uint16)((Rx210.GcuFault >> 8U) & 0xFFU);
Tx720.EcuFault = Rx310.EcuFault;
// BYTE 0~3(DcuFault0~3), BYTE 4~5(GcuFault0~1), BYTE 6(Rsvd), BYTE 7(EcuFault)
ECanaMboxes.MBOX10.MDL.all = CPackMboxData(Tx720.DcuFault0, Tx720.DcuFault1, Tx720.DcuFault2, Tx720.DcuFault3);
ECanaMboxes.MBOX10.MDH.all = CPackMboxData(Tx720.GcuFault0, Tx720.GcuFault1, 0U, Tx720.EcuFault);
// ---------------------------------------------------------
// [730h - MBOX15]
// ---------------------------------------------------------
Tx730.AuxState = (Uint16)GET_ALL_AUX_STATUS();
// BYTE 0(AuxState), BYTE 1~7(Rsvd)
ECanaMboxes.MBOX15.MDL.all = CPackMboxData(Tx730.AuxState, 0U, 0U, 0U);
ECanaMboxes.MBOX15.MDH.all = CPackMboxData(0U, 0U, 0U, 0U);
// ---------------------------------------------------------
// [731h - MBOX16]
// ---------------------------------------------------------
fTemp = Adc_EngineHeater_V.fLpfValue * 10.0F;
Tx731.EngineHeaterVoltage = (Uint16)fTemp;
fTemp = Adc_EngineHeater_I.fLpfValue * 10.0F;
Tx731.EngineHeaterCurrent = (Uint16)fTemp;
fTemp = Adc_GlowPlug_V.fLpfValue * 10.0F;
Tx731.GlowPlugVoltage = (Uint16)fTemp;
fTemp = Adc_GlowPlug_I.fLpfValue * 10.0F;
Tx731.GlowPlugCurrent = (Uint16)fTemp;
// BYTE 0~1(EngineHeaterVoltage), BYTE 2~3(EngineHeaterCurrent), BYTE 4~5(GlowPlugVoltage), BYTE 6~7(GlowPlugCurrent)
ECanaMboxes.MBOX16.MDL.all = CPackMboxData((Uint16)((Tx731.EngineHeaterVoltage >> 0U) & 0xFFU), (Uint16)((Tx731.EngineHeaterVoltage >> 8U) & 0xFFU),
(Uint16)((Tx731.EngineHeaterCurrent >> 0U) & 0xFFU), (Uint16)((Tx731.EngineHeaterCurrent >> 8U) & 0xFFU));
ECanaMboxes.MBOX16.MDH.all = CPackMboxData((Uint16)((Tx731.GlowPlugVoltage >> 0U) & 0xFFU), (Uint16)((Tx731.GlowPlugVoltage >> 8U) & 0xFFU),
(Uint16)((Tx731.GlowPlugCurrent >> 0U) & 0xFFU), (Uint16)((Tx731.GlowPlugCurrent >> 8U) & 0xFFU));
// ---------------------------------------------------------
// [732h - MBOX17]
// ---------------------------------------------------------
fTemp = Adc_Solenoid_V.fLpfValue * 10.0F;
Tx732.SolenoidVoltage = (Uint16)fTemp;
fTemp = Adc_Solenoid_I.fLpfValue * 10.0F;
Tx732.SolenoidCurrent = (Uint16)fTemp;
fTemp = Adc_FuelPump_V.fLpfValue * 10.0F;
Tx732.FuelPumpVoltage = (Uint16)fTemp;
fTemp = Adc_FuelPump_I.fLpfValue * 10.0F;
Tx732.FuelPumpCurrent = (Uint16)fTemp;
// BYTE 0~1(SolenoidVoltage), BYTE 2~3(SolenoidCurrent), BYTE 4~5(FuelPumpVoltage), BYTE 6~7(FuelPumpCurrent)
ECanaMboxes.MBOX17.MDL.all = CPackMboxData((Uint16)((Tx732.SolenoidVoltage >> 0U) & 0xFFU), (Uint16)((Tx732.SolenoidVoltage >> 8U) & 0xFFU),
(Uint16)((Tx732.SolenoidCurrent >> 0U) & 0xFFU), (Uint16)((Tx732.SolenoidCurrent >> 8U) & 0xFFU));
ECanaMboxes.MBOX17.MDH.all = CPackMboxData((Uint16)((Tx732.FuelPumpVoltage >> 0U) & 0xFFU), (Uint16)((Tx732.FuelPumpVoltage >> 8U) & 0xFFU),
(Uint16)((Tx732.FuelPumpCurrent >> 0U) & 0xFFU), (Uint16)((Tx732.FuelPumpCurrent >> 8U) & 0xFFU));
// ---------------------------------------------------------
// [733h - MBOX18]
// ---------------------------------------------------------
fTemp = Adc_CoolantPump_V.fLpfValue * 10.0F;
Tx733.CoolantPumpVoltage = (Uint16)fTemp;
fTemp = Adc_CoolantPump_I.fLpfValue * 10.0F;
Tx733.CoolantPumpCurrent = (Uint16)fTemp;
fTemp = Adc_Fan1_V.fLpfValue * 10.0F;
Tx733.Fan1Voltage = (Uint16)fTemp;
fTemp = Adc_Fan1_I.fLpfValue * 10.0F;
Tx733.Fan1Current = (Uint16)fTemp;
// BYTE 0~1(CoolantPumpVoltage), BYTE 2~3(CoolantPumpCurrent), BYTE 4~5(Fan1Voltage), BYTE 6~7(Fan1Current)
ECanaMboxes.MBOX18.MDL.all = CPackMboxData((Uint16)((Tx733.CoolantPumpVoltage >> 0U) & 0xFFU), (Uint16)((Tx733.CoolantPumpVoltage >> 8U) & 0xFFU),
(Uint16)((Tx733.CoolantPumpCurrent >> 0U) & 0xFFU), (Uint16)((Tx733.CoolantPumpCurrent >> 8U) & 0xFFU));
ECanaMboxes.MBOX18.MDH.all = CPackMboxData((Uint16)((Tx733.Fan1Voltage >> 0U) & 0xFFU), (Uint16)((Tx733.Fan1Voltage >> 8U) & 0xFFU),
(Uint16)((Tx733.Fan1Current >> 0U) & 0xFFU), (Uint16)((Tx733.Fan1Current >> 8U) & 0xFFU));
// ---------------------------------------------------------
// [734h - MBOX19]
// ---------------------------------------------------------
fTemp = Adc_Fan2_V.fLpfValue * 10.0F;
Tx734.Fan2Voltage = (Uint16)fTemp;
fTemp = Adc_Fan2_I.fLpfValue * 10.0F;
Tx734.Fan2Current = (Uint16)fTemp;
// BYTE 0~1(Fan2Voltage), BYTE 2~3(Fan2Current), BYTE 4~7(Rsvd)
ECanaMboxes.MBOX19.MDL.all = CPackMboxData((Uint16)((Tx734.Fan2Voltage >> 0U) & 0xFFU), (Uint16)((Tx734.Fan2Voltage >> 8U) & 0xFFU),
(Uint16)((Tx734.Fan2Current >> 0U) & 0xFFU), (Uint16)((Tx734.Fan2Current >> 8U) & 0xFFU));
ECanaMboxes.MBOX19.MDH.all = CPackMboxData(0U, 0U, 0U, 0U);
// ---------------------------------------------------------
// [740h - MBOX20]
// ---------------------------------------------------------
Tx740.Voltage = Rx220.DcVoltage;
Tx740.Current = Rx220.DcCurrent;
Tx740.Rpm = Rx220.Rpm;
Tx740.Power = Rx220.Power;
// BYTE 0~1(Voltage), BYTE 2~3(Current), BYTE 4~5(Rpm), BYTE 6~7(Power)
ECanaMboxes.MBOX20.MDL.all = CPackMboxData((Uint16)((Tx740.Voltage >> 0U) & 0xFFU), (Uint16)((Tx740.Voltage >> 8U) & 0xFFU),
(Uint16)((Tx740.Current >> 0U) & 0xFFU), (Uint16)((Tx740.Current >> 8U) & 0xFFU));
ECanaMboxes.MBOX20.MDH.all = CPackMboxData((Uint16)((Tx740.Rpm >> 0U) & 0xFFU), (Uint16)((Tx740.Rpm >> 8U) & 0xFFU),
(Uint16)((Tx740.Power >> 0U) & 0xFFU), (Uint16)((Tx740.Power >> 8U) & 0xFFU));
// ---------------------------------------------------------
// [741h - MBOX21]
// ---------------------------------------------------------
Tx741.PcbTemperature = Rx221.PcbTemperature;
Tx741.FetTemperature = Rx221.FetTemperature;
Tx741.Winding1Temperature = Rx221.GenTemperature1;
Tx741.Winding2Temperature = Rx221.GenTemperature2;
// BYTE 0(PcbTemperature), BYTE 1(FetTemperature), BYTE 2(Winding1Temperature), BYTE 3(Winding2Temperature), BYTE 4~7(Rsvd)
ECanaMboxes.MBOX21.MDL.all = CPackMboxData(Tx741.PcbTemperature, Tx741.FetTemperature, Tx741.Winding1Temperature, Tx741.Winding2Temperature);
ECanaMboxes.MBOX21.MDH.all = CPackMboxData(0U, 0U, 0U, 0U);
// ---------------------------------------------------------
// [750h - MBOX25]
// ---------------------------------------------------------
Tx750.ActualRpm = Rx320.ActualRpm;
Tx750.SetRpm = Rx320.SetRpm;
Tx750.ActualTorque = Rx320.ActualTorque;
Tx750.SetTorque = Rx320.SetTorque;
Tx750.SystemVoltage = Rx320.SystemVoltage;
// BYTE 0~1(ActualRpm), BYTE 2~3(SetRpm), BYTE 4(ActualTorque), BYTE 5(SetTorque), BYTE 6~7(SystemVoltage)
ECanaMboxes.MBOX25.MDL.all = CPackMboxData((Uint16)((Tx750.ActualRpm >> 0U) & 0xFFU), (Uint16)((Tx750.ActualRpm >> 8U) & 0xFFU),
(Uint16)((Tx750.SetRpm >> 0U) & 0xFFU), (Uint16)((Tx750.SetRpm >> 8U) & 0xFFU));
ECanaMboxes.MBOX25.MDH.all = CPackMboxData(Tx750.ActualTorque, Tx750.SetTorque,
(Uint16)((Tx750.SystemVoltage >> 0U) & 0xFFU), (Uint16)((Tx750.SystemVoltage >> 8U) & 0xFFU));
// ---------------------------------------------------------
// [751h - MBOX26]
// ---------------------------------------------------------
Tx751.CoolantTemperature = Rx321.CoolantTemperature;
Tx751.Fan1Speed = Rx321.Fan1Speed;
Tx751.Fan2Speed = Rx321.Fan2Speed;
Tx751.CoolantPumpSpeed = Rx321.CoolantPumpSpeed;
Tx751.Barometric = Rx321.BarometricPressure;
// BYTE 0(CoolantTemperature), BYTE 1(Fan1Speed), BYTE 2(Fan2Speed), BYTE 3(CoolantPumpSpeed), BYTE 4~5(Barometric), BYTE 6~7(Rsvd)
ECanaMboxes.MBOX26.MDL.all = CPackMboxData(Tx751.CoolantTemperature, Tx751.Fan1Speed, Tx751.Fan2Speed, Tx751.CoolantPumpSpeed);
ECanaMboxes.MBOX26.MDH.all = CPackMboxData((Uint16)((Tx751.Barometric >> 0U) & 0xFFU), (Uint16)((Tx751.Barometric >> 8U) & 0xFFU), 0U, 0U);
// ---------------------------------------------------------
// [752h - MBOX27]
// ---------------------------------------------------------
Tx752.OperationTimeL = Rx322.TotalOperTimeL;
Tx752.OperationTimeH = Rx322.TotalOperTimeH;
// BYTE 0~1(OperationTimeL), BYTE 2~3(OperationTimeH), BYTE 4~7(Rsvd)
ECanaMboxes.MBOX27.MDL.all = CPackMboxData((Uint16)((Tx752.OperationTimeL >> 0U) & 0xFFU), (Uint16)((Tx752.OperationTimeL >> 8U) & 0xFFU),
(Uint16)((Tx752.OperationTimeH >> 0U) & 0xFFU), (Uint16)((Tx752.OperationTimeH >> 8U) & 0xFFU));
ECanaMboxes.MBOX27.MDH.all = CPackMboxData(0U, 0U, 0U, 0U);
// ---------------------------------------------------------
// 송신 메일박스 마스크 설정 및 전송 트리거
// MBOX 마스크 (0, 1, 5, 10, 15, 16, 17, 18, 19, 20, 21, 25, 26, 27)
// ---------------------------------------------------------
Uint32 ulTxMask = 0x0E3F8423UL;
ECanaRegs.CANTRS.all = ulTxMask;
ECanaRegs.CANTA.all = ulTxMask;
}
static void CInitECanA(void)
{
/* Create a shadow register structure for the CAN control registers. This is
needed, since only 32-bit access is allowed to these registers. 16-bit access
to these registers could potentially corrupt the register contents or return
false data. This is especially true while writing to/reading from a bit
(or group of bits) among bits 16 - 31 */
struct ECAN_REGS ECanaShadow = {};
EALLOW; // EALLOW enables access to protected bits
/* Enable internal pull-up for the selected CAN pins */
// Pull-ups can be enabled or disabled by the user.
// This will enable the pullups for the specified pins.
// Comment out other unwanted lines.
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0x00U; // Enable pull-up CANRXA
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0x00U; // Enable pull-up CANTXA
/* Set qualification for selected CAN pins to asynch only */
// Inputs are synchronized to SYSCLKOUT by default.
// This will select asynch (no qualification) for the selected pins.
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 0x03U; // Asynch qual for CANRXA
/* Configure eCAN-A pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be eCAN functional pins.
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 0x03U; // Configure CANRXA operation
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0x03U; // Configure CANTXA operation
/* Configure eCAN RX and TX pins for CAN operation using eCAN regs*/
ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
ECanaShadow.CANTIOC.bit.TXFUNC = 1U;
ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;
ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
ECanaShadow.CANRIOC.bit.RXFUNC = 1U;
ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
/* Configure eCAN for HECC mode - (reqd to access mailboxes 16 thru 31) */
// HECC mode also enables time-stamping feature
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.SCB = 1;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
// as a matter of precaution.
ECanaRegs.CANTA.all = 0xFFFFFFFFU; /* Clear all TAn bits */
ECanaRegs.CANRMP.all = 0xFFFFFFFFU; /* Clear all RMPn bits */
ECanaRegs.CANGIF0.all = 0xFFFFFFFFU; /* Clear all interrupt flag bits */
ECanaRegs.CANGIF1.all = 0xFFFFFFFFU;
/* Configure bit timing parameters for eCANB*/
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 1U; // Set CCR = 1
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
} while(ECanaShadow.CANES.bit.CCE != 1U); // Wait for CCE bit to be set..
ECanaShadow.CANBTC.all = 0U;
// 250 [Kbps]
ECanaShadow.CANBTC.bit.BRPREG = 19U;
ECanaShadow.CANBTC.bit.TSEG1REG = 10U;
ECanaShadow.CANBTC.bit.TSEG2REG = 2U;
ECanaShadow.CANBTC.bit.SAM = 1U;
ECanaShadow.CANBTC.bit.SJWREG = 2U;
ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 0U;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
} while (ECanaShadow.CANES.bit.CCE != 0U); // Wait for CCE bit to be cleared..
/* Disable all Mailboxes */
ECanaRegs.CANME.all = 0U; // Required before writing the MSGIDs
EDIS;
CECanASetMbox();
}
static void CECanASetMbox(void)
{
struct ECAN_REGS ECanShadow = {};
/* Tx Can MBox */
ECanaMboxes.MBOX0.MSGID.bit.IDE = 0U; // ID ECANa 식별자 - 11bit ID 스탠다드
ECanaMboxes.MBOX0.MSGID.bit.STDMSGID = 0x700U;
ECanaMboxes.MBOX0.MSGID.bit.AME = 0U;
ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8U;
ECanaMboxes.MBOX0.MSGCTRL.bit.RTR = 0U;
ECanaMboxes.MBOX0.MDH.all = 0x00000000U;
ECanaMboxes.MBOX0.MDL.all = 0x00000000U;
ECanaMboxes.MBOX1.MSGID.bit.IDE = 0U;
ECanaMboxes.MBOX1.MSGID.bit.STDMSGID = 0x701U;
ECanaMboxes.MBOX1.MSGID.bit.AME = 0U;
ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8U;
ECanaMboxes.MBOX1.MSGCTRL.bit.RTR = 0U;
ECanaMboxes.MBOX1.MDH.all = 0x00000000U;
ECanaMboxes.MBOX1.MDL.all = 0x00000000U;
ECanaMboxes.MBOX5.MSGID.bit.IDE = 0U;
ECanaMboxes.MBOX5.MSGID.bit.STDMSGID = 0x710U;
ECanaMboxes.MBOX5.MSGID.bit.AME = 0U;
ECanaMboxes.MBOX5.MSGCTRL.bit.DLC = 8U;
ECanaMboxes.MBOX5.MSGCTRL.bit.RTR = 0U;
ECanaMboxes.MBOX5.MDH.all = 0x00000000U;
ECanaMboxes.MBOX5.MDL.all = 0x00000000U;
ECanaMboxes.MBOX10.MSGID.bit.IDE = 0U;
ECanaMboxes.MBOX10.MSGID.bit.STDMSGID = 0x720U;
ECanaMboxes.MBOX10.MSGID.bit.AME = 0U;
ECanaMboxes.MBOX10.MSGCTRL.bit.DLC = 8U;
ECanaMboxes.MBOX10.MSGCTRL.bit.RTR = 0U;
ECanaMboxes.MBOX10.MDH.all = 0x00000000U;
ECanaMboxes.MBOX10.MDL.all = 0x00000000U;
ECanaMboxes.MBOX15.MSGID.bit.IDE = 0U;
ECanaMboxes.MBOX15.MSGID.bit.STDMSGID = 0x730U;
ECanaMboxes.MBOX15.MSGID.bit.AME = 0U;
ECanaMboxes.MBOX15.MSGCTRL.bit.DLC = 8U;
ECanaMboxes.MBOX15.MSGCTRL.bit.RTR = 0U;
ECanaMboxes.MBOX15.MDH.all = 0x00000000U;
ECanaMboxes.MBOX15.MDL.all = 0x00000000U;
ECanaMboxes.MBOX16.MSGID.bit.IDE = 0U;
ECanaMboxes.MBOX16.MSGID.bit.STDMSGID = 0x731U;
ECanaMboxes.MBOX16.MSGID.bit.AME = 0U;
ECanaMboxes.MBOX16.MSGCTRL.bit.DLC = 8U;
ECanaMboxes.MBOX16.MSGCTRL.bit.RTR = 0U;
ECanaMboxes.MBOX16.MDH.all = 0x00000000U;
ECanaMboxes.MBOX16.MDL.all = 0x00000000U;
ECanaMboxes.MBOX17.MSGID.bit.IDE = 0U;
ECanaMboxes.MBOX17.MSGID.bit.STDMSGID = 0x732U;
ECanaMboxes.MBOX17.MSGID.bit.AME = 0U;
ECanaMboxes.MBOX17.MSGCTRL.bit.DLC = 8U;
ECanaMboxes.MBOX17.MSGCTRL.bit.RTR = 0U;
ECanaMboxes.MBOX17.MDH.all = 0x00000000U;
ECanaMboxes.MBOX17.MDL.all = 0x00000000U;
ECanaMboxes.MBOX18.MSGID.bit.IDE = 0U;
ECanaMboxes.MBOX18.MSGID.bit.STDMSGID = 0x733U;
ECanaMboxes.MBOX18.MSGID.bit.AME = 0U;
ECanaMboxes.MBOX18.MSGCTRL.bit.DLC = 8U;
ECanaMboxes.MBOX18.MSGCTRL.bit.RTR = 0U;
ECanaMboxes.MBOX18.MDH.all = 0x00000000U;
ECanaMboxes.MBOX18.MDL.all = 0x00000000U;
ECanaMboxes.MBOX19.MSGID.bit.IDE = 0U;
ECanaMboxes.MBOX19.MSGID.bit.STDMSGID = 0x734U;
ECanaMboxes.MBOX19.MSGID.bit.AME = 0U;
ECanaMboxes.MBOX19.MSGCTRL.bit.DLC = 8U;
ECanaMboxes.MBOX19.MSGCTRL.bit.RTR = 0U;
ECanaMboxes.MBOX19.MDH.all = 0x00000000U;
ECanaMboxes.MBOX19.MDL.all = 0x00000000U;
ECanaMboxes.MBOX20.MSGID.bit.IDE = 0U;
ECanaMboxes.MBOX20.MSGID.bit.STDMSGID = 0x740U;
ECanaMboxes.MBOX20.MSGID.bit.AME = 0U;
ECanaMboxes.MBOX20.MSGCTRL.bit.DLC = 8U;
ECanaMboxes.MBOX20.MSGCTRL.bit.RTR = 0U;
ECanaMboxes.MBOX20.MDH.all = 0x00000000U;
ECanaMboxes.MBOX20.MDL.all = 0x00000000U;
ECanaMboxes.MBOX21.MSGID.bit.IDE = 0U;
ECanaMboxes.MBOX21.MSGID.bit.STDMSGID = 0x741U;
ECanaMboxes.MBOX21.MSGID.bit.AME = 0U;
ECanaMboxes.MBOX21.MSGCTRL.bit.DLC = 8U;
ECanaMboxes.MBOX21.MSGCTRL.bit.RTR = 0U;
ECanaMboxes.MBOX21.MDH.all = 0x00000000U;
ECanaMboxes.MBOX21.MDL.all = 0x00000000U;
ECanaMboxes.MBOX25.MSGID.bit.IDE = 0U;
ECanaMboxes.MBOX25.MSGID.bit.STDMSGID = 0x750U;
ECanaMboxes.MBOX25.MSGID.bit.AME = 0U;
ECanaMboxes.MBOX25.MSGCTRL.bit.DLC = 8U;
ECanaMboxes.MBOX25.MSGCTRL.bit.RTR = 0U;
ECanaMboxes.MBOX25.MDH.all = 0x00000000U;
ECanaMboxes.MBOX25.MDL.all = 0x00000000U;
ECanaMboxes.MBOX26.MSGID.bit.IDE = 0U;
ECanaMboxes.MBOX26.MSGID.bit.STDMSGID = 0x751U;
ECanaMboxes.MBOX26.MSGID.bit.AME = 0U;
ECanaMboxes.MBOX26.MSGCTRL.bit.DLC = 8U;
ECanaMboxes.MBOX26.MSGCTRL.bit.RTR = 0U;
ECanaMboxes.MBOX26.MDH.all = 0x00000000U;
ECanaMboxes.MBOX26.MDL.all = 0x00000000U;
ECanaMboxes.MBOX27.MSGID.bit.IDE = 0U;
ECanaMboxes.MBOX27.MSGID.bit.STDMSGID = 0x752U;
ECanaMboxes.MBOX27.MSGID.bit.AME = 0U;
ECanaMboxes.MBOX27.MSGCTRL.bit.DLC = 8U;
ECanaMboxes.MBOX27.MSGCTRL.bit.RTR = 0U;
ECanaMboxes.MBOX27.MDH.all = 0x00000000U;
ECanaMboxes.MBOX27.MDL.all = 0x00000000U;
// Transe, Receive, 0 is Transe, 1 is Receive
ECanShadow.CANMD.all = ECanaRegs.CANMD.all;
ECanShadow.CANMD.all = 0x0U; // USE MBOX0, MBOX1, MBOX5, MBOX10, MBOX15, MBOX16, MBOX17, MBOX18, MBOX19, MBOX20, MBOX21, MBOX25, MBOX26, MBOX27
ECanaRegs.CANMD.all = ECanShadow.CANMD.all;
// MailBox Enable/Disable, 0 is Disable, 1 is Enable
ECanShadow.CANME.all = ECanaRegs.CANME.all;
ECanShadow.CANME.all = 0xE3F8413UL; // USE MBOX0, MBOX1, MBOX5, MBOX10, MBOX15, MBOX16, MBOX17, MBOX18, MBOX19, MBOX20, MBOX21, MBOX25, MBOX26, MBOX27
ECanaRegs.CANME.all = ECanShadow.CANME.all;
EALLOW;
ECanShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanShadow.CANMC.bit.STM = 0U; // '1' CAN Self-test Mode ¼³A¤
ECanShadow.CANMC.bit.ABO = 1U; // '1' CAN Auto Bus On
ECanaRegs.CANMC.all = ECanShadow.CANMC.all;
// Groble Interrupt
ECanShadow.CANGIM.all = ECanaRegs.CANGIM.all;
ECanShadow.CANGIM.bit.I0EN = 1U; // Line 0 Interrupt Enable
ECanShadow.CANGIM.bit.GIL = 0U; // All global interrupts are mapped to the ECAN0INT interrupt line.
ECanaRegs.CANGIM.all = ECanShadow.CANGIM.all;
EDIS;
}
interrupt void CECanInterruptB(void)
{
Uint32 ECanRMPbit;
Uint32 uiMBOXMdl = 0UL;
Uint32 uiMBOXMdh = 0UL;
ECanRMPbit = ECanbRegs.CANRMP.all;
// ---------------------------------------------------------
// MBOX15 - 200h
// ---------------------------------------------------------
if ((ECanRMPbit & (1UL << 15U)) != 0U)
{
GeneralOperValue.Conection.Gcu = 1U;
CommCheck.Gcu = 0U; // GCU 타임아웃 카운트 초기화
uiMBOXMdl = ECanbMboxes.MBOX15.MDL.all;
uiMBOXMdh = ECanbMboxes.MBOX15.MDH.all;
Uint16 uiByte0 = (Uint16)((uiMBOXMdl >> 24U) & 0xFFU);
Uint16 uiByte1 = (Uint16)((uiMBOXMdl >> 16U) & 0xFFU);
Rx200.HeartBit = uiByte0 | (uiByte1 << 8U);
Rx200.VersionMajor = (Uint16)((uiMBOXMdh >> 16U) & 0xFFU); // Byte 5
Rx200.VersionMinor = (Uint16)((uiMBOXMdh >> 8U) & 0xFFU); // Byte 6
Rx200.VersionPatch = (Uint16)((uiMBOXMdh >> 0U) & 0xFFU); // Byte 7
}
// ---------------------------------------------------------
// MBOX16 - 201h
// ---------------------------------------------------------
if ((ECanRMPbit & (1UL << 16U)) != 0U)
{
uiMBOXMdl = ECanbMboxes.MBOX16.MDL.all;
Rx201.PlayState = (Uint16)((uiMBOXMdl >> 24U) & 0x7U);
Rx201.State = (Uint16)((uiMBOXMdl >> 16U) & 0xFFU);
}
// ---------------------------------------------------------
// MBOX17 - 210h (비트 필드 매핑 반전)
// ---------------------------------------------------------
if ((ECanRMPbit & (1UL << 17U)) != 0U)
{
uiMBOXMdl = ECanbMboxes.MBOX17.MDL.all;
Rx210.GcuWarning = (Uint16)(((uiMBOXMdl >> 24U) & 0xFFU) | (((uiMBOXMdl >> 16U) & 0xFFU) << 8U));
Rx210.GcuFault = (Uint16)(((uiMBOXMdl >> 8U) & 0xFFU) | ((uiMBOXMdl & 0xFFU) << 8U));
}
// ---------------------------------------------------------
// MBOX18 - 220h
// ---------------------------------------------------------
if ((ECanRMPbit & (1UL << 18U)) != 0U)
{
uiMBOXMdl = ECanbMboxes.MBOX18.MDL.all;
uiMBOXMdh = ECanbMboxes.MBOX18.MDH.all;
// [Reverse]
// Byte 0(>>24), Byte 1(>>16)
Uint16 uiVoltL = (Uint16)((uiMBOXMdl >> 24U) & 0xFFU);
Uint16 uiVoltH = (Uint16)((uiMBOXMdl >> 16U) & 0xFFU);
Rx220.DcVoltage = uiVoltL | (uiVoltH << 8U);
// Byte 2(>>8), Byte 3(>>0)
Uint16 uiCurrL = (Uint16)((uiMBOXMdl >> 8U) & 0xFFU);
Uint16 uiCurrH = (Uint16)((uiMBOXMdl >> 0U) & 0xFFU);
Rx220.DcCurrent = uiCurrL | (uiCurrH << 8U);
// Byte 4(>>24), Byte 5(>>16)
Uint16 uiRpmL = (Uint16)((uiMBOXMdh >> 24U) & 0xFFU);
Uint16 uiRpmH = (Uint16)((uiMBOXMdh >> 16U) & 0xFFU);
Rx220.Rpm = uiRpmL | (uiRpmH << 8U);
// Byte 6(>>24), Byte 7(>>16)
Uint16 uiPwrL = (Uint16)((uiMBOXMdh >> 8U) & 0xFFU);
Uint16 uiPwrH = (Uint16)((uiMBOXMdh >> 0U) & 0xFFU);
Rx220.Power = uiPwrL | (uiPwrH << 8U);
}
// ---------------------------------------------------------
// MBOX19 - 221h
// ---------------------------------------------------------
if ((ECanRMPbit & (1UL << 19U)) != 0U)
{
uiMBOXMdl = ECanbMboxes.MBOX19.MDL.all;
// [Reverse] 0(24), 1(16), 2(8), 3(0)
Rx221.PcbTemperature = (Uint16)((uiMBOXMdl >> 24U) & 0xFFU);
Rx221.FetTemperature = (Uint16)((uiMBOXMdl >> 16U) & 0xFFU);
Rx221.GenTemperature1 = (Uint16)((uiMBOXMdl >> 8U) & 0xFFU);
Rx221.GenTemperature2 = (Uint16)((uiMBOXMdl >> 0U) & 0xFFU);
}
// ---------------------------------------------------------
// MBOX25 - 300h
// ---------------------------------------------------------
if ((ECanRMPbit & (1UL << 25U)) != 0U)
{
GeneralOperValue.Conection.Ecu = 1U;
CommCheck.Ecu = 0U; // ECU 타임아웃 카운트 초기화
uiMBOXMdl = ECanbMboxes.MBOX25.MDL.all;
// [Reverse]
Rx300.VersionMajor = (Uint8)((uiMBOXMdl >> 24U) & 0xFFU);
Rx300.VersionMinor = (Uint8)((uiMBOXMdl >> 16U) & 0xFFU);
Rx300.VersionPatch = (Uint8)((uiMBOXMdl >> 8U) & 0xFFU);
}
// ---------------------------------------------------------
// MBOX26 - 301h
// ---------------------------------------------------------
if ((ECanRMPbit & (1UL << 26U)) != 0U)
{
uiMBOXMdl = ECanbMboxes.MBOX26.MDL.all;
// [Reverse] Byte 0 -> >> 24U
Rx301.State = (Uint16)((uiMBOXMdl >> 24U) & 0xFFU);
}
// ---------------------------------------------------------
// MBOX27 - 310h
// ---------------------------------------------------------
if ((ECanRMPbit & (1UL << 27U)) != 0U)
{
uiMBOXMdl = ECanbMboxes.MBOX27.MDL.all;
// [Reverse] Byte 0 -> >> 24
Rx310.EcuWarning = (Uint16)((uiMBOXMdl >> 24U) & 0xFFU);
Rx310.EcuFault = (Uint16)((uiMBOXMdl >> 8U) & 0x3FU);
}
// ---------------------------------------------------------
// MBOX28 - 320h
// ---------------------------------------------------------
if ((ECanRMPbit & (1UL << 28U)) != 0U)
{
uiMBOXMdl = ECanbMboxes.MBOX28.MDL.all;
uiMBOXMdh = ECanbMboxes.MBOX28.MDH.all;
// [Reverse] Byte 0(>>24), 1(>>16)
Uint16 uiActRpmL = (Uint16)((uiMBOXMdl >> 24U) & 0xFFU);
Uint16 uiActRpmH = (Uint16)((uiMBOXMdl >> 16U) & 0xFFU);
Rx320.ActualRpm = uiActRpmL | (uiActRpmH << 8U);
// [Reverse] Byte 2(>>8), 3(>>0)
Uint16 uiSetRpmL = (Uint16)((uiMBOXMdl >> 8U) & 0xFFU);
Uint16 uiSetRpmH = (Uint16)((uiMBOXMdl >> 0U) & 0xFFU);
Rx320.SetRpm = uiSetRpmL | (uiSetRpmH << 8U);
// [Reverse] Byte 4(>>24), 5(>>16) (MDH)
Rx320.ActualTorque = (Uint16)((uiMBOXMdh >> 24U) & 0xFFU);
Rx320.SetTorque = (Uint16)((uiMBOXMdh >> 16U) & 0xFFU);
// [Reverse] Byte 6(>>8), 7(>>0)
Uint16 uiSysVoltL = (Uint16)((uiMBOXMdh >> 8U) & 0xFFU);
Uint16 uiSysVoltH = (Uint16)((uiMBOXMdh >> 0U) & 0xFFU);
Rx320.SystemVoltage = uiSysVoltL | (uiSysVoltH << 8U);
}
// ---------------------------------------------------------
// MBOX29 - 321h
// ---------------------------------------------------------
if ((ECanRMPbit & (1UL << 29U)) != 0U)
{
uiMBOXMdl = ECanbMboxes.MBOX29.MDL.all;
uiMBOXMdh = ECanbMboxes.MBOX29.MDH.all;
// [Reverse]
Rx321.CoolantTemperature = (Uint16)((uiMBOXMdl >> 24U) & 0xFFU);
Rx321.Fan1Speed = (Uint16)((uiMBOXMdl >> 16U) & 0xFFU);
Rx321.Fan2Speed = (Uint16)((uiMBOXMdl >> 8U) & 0xFFU);
Rx321.CoolantPumpSpeed = (Uint16)((uiMBOXMdl >> 0U) & 0xFFU);
// Byte 4(>>24), 5(>>16)
Uint16 uiBarL = (Uint16)((uiMBOXMdh >> 24U) & 0xFFU);
Uint16 uiBarH = (Uint16)((uiMBOXMdh >> 16U) & 0xFFU);
Rx321.BarometricPressure = uiBarL | (uiBarH << 8U);
}
// ---------------------------------------------------------
// MBOX30 - 322h
// ---------------------------------------------------------
if ((ECanRMPbit & (1UL << 30U)) != 0U)
{
uiMBOXMdl = ECanbMboxes.MBOX30.MDL.all;
// [Reverse] Byte 0(>>24), 1(>>16) -> TimeL
Uint16 uiTimeLL = (Uint16)((uiMBOXMdl >> 24U) & 0xFFU);
Uint16 uiTimeLH = (Uint16)((uiMBOXMdl >> 16U) & 0xFFU);
Rx322.TotalOperTimeL = uiTimeLL | (uiTimeLH << 8U);
// [Reverse] Byte 2(>>8), 3(>>0) -> TimeH
Uint16 uiTimeHL = (Uint16)((uiMBOXMdl >> 8U) & 0xFFU);
Uint16 uiTimeHH = (Uint16)((uiMBOXMdl >> 0U) & 0xFFU);
Rx322.TotalOperTimeH = uiTimeHL | (uiTimeHH << 8U);
}
#ifdef AUX_TEST
// ---------------------------------------------------------
// MBOX31 - 400h
// ---------------------------------------------------------
if ((ECanRMPbit & (1UL << 31U)) != 0U)
{
uiMBOXMdl = ECanbMboxes.MBOX31.MDL.all;
// [Reverse] Byte 0 -> >> 24
Rx400.AuxControl.EngineHeater = (Uint16)((uiMBOXMdl >> 24U) & 0x1U);
Rx400.AuxControl.GlowPlug = (Uint16)((uiMBOXMdl >> 25U) & 0x1U);
Rx400.AuxControl.Solenoid = (Uint16)((uiMBOXMdl >> 26U) & 0x1U);
Rx400.AuxControl.FuelPump = (Uint16)((uiMBOXMdl >> 27U) & 0x1U);
Rx400.AuxControl.CoolantPump = (Uint16)((uiMBOXMdl >> 28U) & 0x1U);
Rx400.AuxControl.Fan1 = (Uint16)((uiMBOXMdl >> 29U) & 0x1U);
Rx400.AuxControl.Fan2 = (Uint16)((uiMBOXMdl >> 30U) & 0x1U);
Rx400.AuxControl.AuxTestStart = (Uint16)((uiMBOXMdl >> 31U) & 0x1U);
}
#endif
ECanbRegs.CANRMP.all = ECanRMPbit;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
}
void CSendECanDataB(void)
{
struct ECAN_REGS ECanShadow;
static Uint16 uiTxDivid = 0U; // 분산 송신
float32 fTemp = 0.0F;
Uint16 uiTemp = 0U;
Uint16 EmergencySig = ((GeneralOperValue.uiEmergency > 0U) || (KeyOperValue.KeyList.Emergency > 0U)) ? 1U : 0U;
// 10ms
// [101h]
// --- BYTE 0 ---
Tx101.PlayState = GeneralOperValue.uiApuState;
// --- BYTE 1 ---
uiTemp = 0U;
uiTemp |= CPackBit(GeneralOperValue.uiFaultOccured, 0U);
uiTemp |= CPackBit(GeneralOperValue.uiEmergency, 1U);
uiTemp |= CPackBit(KeyOperValue.KeyList.MainPower, 2U);
uiTemp |= CPackBit((GPIO_FAIL_SAFE_READ() == false) ? 1U : 0U, 3U);
Tx101.DcuState = uiTemp;
ECanbMboxes.MBOX1.MDL.byte.BYTE0 = Tx101.PlayState;
ECanbMboxes.MBOX1.MDL.byte.BYTE1 = Tx101.DcuState;
ECanbMboxes.MBOX1.MDL.byte.BYTE2 = 0x0U;
ECanbMboxes.MBOX1.MDL.byte.BYTE3 = 0x0U;
ECanbMboxes.MBOX1.MDH.byte.BYTE4 = 0x0U;
ECanbMboxes.MBOX1.MDH.byte.BYTE5 = 0x0U;
ECanbMboxes.MBOX1.MDH.byte.BYTE6 = 0x0U;
ECanbMboxes.MBOX1.MDH.byte.BYTE7 = 0x0U;
// [102h]
// --- BYTE 0 ---
uiTemp = 0U;
uiTemp |= CPackField(GeneralOperValue.GcuCommand.PlayCmd, 0xFU, 0U);
uiTemp |= CPackBit(GeneralOperValue.uiAlarmReset, 4U);
uiTemp |= CPackBit(EmergencySig, 5U);
Tx102.GcuCommand = uiTemp;
ECanbMboxes.MBOX2.MDL.byte.BYTE0 = Tx102.GcuCommand;
ECanbMboxes.MBOX2.MDL.byte.BYTE1 = 0x0U;
ECanbMboxes.MBOX2.MDL.byte.BYTE2 = 0x0U;
ECanbMboxes.MBOX2.MDL.byte.BYTE3 = 0x0U;
ECanbMboxes.MBOX2.MDH.byte.BYTE4 = 0x0U;
ECanbMboxes.MBOX2.MDH.byte.BYTE5 = 0x0U;
ECanbMboxes.MBOX2.MDH.byte.BYTE6 = 0x0U;
ECanbMboxes.MBOX2.MDH.byte.BYTE7 = 0x0U;
// [103h]
// --- BYTE 0~7 ---
uiTemp = 0U;
Tx103.EngineStart = GeneralOperValue.EcuCommand.EngineStart;
Tx103.EngineStop = GeneralOperValue.EcuCommand.EngineStop;
Tx103.FaultReset = GeneralOperValue.uiAlarmReset;
Tx103.RpmSetpoint = GeneralOperValue.EcuCommand.RpmSetPoint;
Tx103.ActiveOverride = KeyOperValue.KeyList.BattleMode;
Tx103.EmergencyStop = EmergencySig;
ECanbMboxes.MBOX3.MDL.byte.BYTE0 = Tx103.EngineStart;
ECanbMboxes.MBOX3.MDL.byte.BYTE1 = Tx103.EngineStop;
ECanbMboxes.MBOX3.MDL.byte.BYTE2 = Tx103.FaultReset;
ECanbMboxes.MBOX3.MDL.byte.BYTE3 = 0x0U;
ECanbMboxes.MBOX3.MDH.byte.BYTE4 = ((Tx103.RpmSetpoint >> 0U) & 0xFFU);
ECanbMboxes.MBOX3.MDH.byte.BYTE5 = ((Tx103.RpmSetpoint >> 8U) & 0xFFU);
ECanbMboxes.MBOX3.MDH.byte.BYTE6 = Tx103.ActiveOverride;
ECanbMboxes.MBOX3.MDH.byte.BYTE7 = Tx103.EmergencyStop;
ECanShadow.CANTRS.all = ECanbRegs.CANTRS.all;
ECanShadow.CANTRS.bit.TRS1 = 1U; // 101h
ECanShadow.CANTRS.bit.TRS2 = 1U; // 102h
ECanShadow.CANTRS.bit.TRS3 = 1U; // 103h
ECanbRegs.CANTRS.all = ECanShadow.CANTRS.all;
ECanShadow.CANTA.all = ECanbRegs.CANTA.all;
ECanShadow.CANTA.bit.TA1 = 1U; // 101h
ECanShadow.CANTA.bit.TA2 = 1U; // 102h
ECanShadow.CANTA.bit.TA3 = 1U; // 103h
ECanbRegs.CANTA.all = ECanShadow.CANTA.all;
ECanShadow.CANTRS.all = ECanbRegs.CANTRS.all;
ECanShadow.CANTA.all = ECanbRegs.CANTA.all;
switch (uiTxDivid)
{
case 0U:
{
// [100h]
Tx100.Heartbit = (Tx100.Heartbit + 1U) % 65535U;
Tx100.VersionMajor = (Uint16)FIRMWARE_VERSION_MAJOR;
Tx100.VersionMinor = (Uint16)FIRMWARE_VERSION_MINOR;
Tx100.VersionPatch = (Uint16)FIRMWARE_VERSION_PATCH;
ECanbMboxes.MBOX0.MDL.byte.BYTE0 = ((Tx100.Heartbit >> 0U) & 0xFFU);
ECanbMboxes.MBOX0.MDL.byte.BYTE1 = ((Tx100.Heartbit >> 8U) & 0xFFU);
ECanbMboxes.MBOX0.MDL.byte.BYTE2 = 0x0U;
ECanbMboxes.MBOX0.MDL.byte.BYTE3 = 0x0U;
ECanbMboxes.MBOX0.MDH.byte.BYTE4 = 0x0U;
ECanbMboxes.MBOX0.MDH.byte.BYTE5 = Tx100.VersionMajor;
ECanbMboxes.MBOX0.MDH.byte.BYTE6 = Tx100.VersionMinor;
ECanbMboxes.MBOX0.MDH.byte.BYTE7 = Tx100.VersionPatch;
ECanShadow.CANTRS.bit.TRS0 = 1U;
ECanShadow.CANTA.bit.TA0 = 1U;
break;
}
case 1U:
{
// [110h]
Tx110.DcuFaultB0 = ((Uint16)(ulDcuTotalAlarm >> 0U) & 0xFFU); // Apu Fault Byte 0
Tx110.DcuFaultB1 = ((Uint16)(ulDcuTotalAlarm >> 8U) & 0xFFU); // Apu Fault Byte 1
Tx110.DcuFaultB2 = ((Uint16)(ulDcuTotalAlarm >> 16U) & 0xFFU); // Apu Fault Byte 2
Tx110.DcuFaultB3 = ((Uint16)(ulDcuTotalAlarm >> 24U) & 0xFFU); // Apu Fault Byte 3
ECanbMboxes.MBOX4.MDL.byte.BYTE0 = Tx110.DcuFaultB0;
ECanbMboxes.MBOX4.MDL.byte.BYTE1 = Tx110.DcuFaultB1;
ECanbMboxes.MBOX4.MDL.byte.BYTE2 = Tx110.DcuFaultB2;
ECanbMboxes.MBOX4.MDL.byte.BYTE3 = Tx110.DcuFaultB3;
ECanbMboxes.MBOX4.MDH.byte.BYTE4 = 0x0U;
ECanbMboxes.MBOX4.MDH.byte.BYTE5 = 0x0U;
ECanbMboxes.MBOX4.MDH.byte.BYTE6 = 0x0U;
ECanbMboxes.MBOX4.MDH.byte.BYTE7 = 0x0U;
ECanShadow.CANTRS.bit.TRS4 = 1U;
ECanShadow.CANTA.bit.TA4 = 1U;
break;
}
case 2U:
{
// [120h]
Tx120.AuxTotal = (Uint16)GET_ALL_AUX_STATUS();
ECanbMboxes.MBOX5.MDL.byte.BYTE0 = Tx120.AuxTotal;
ECanbMboxes.MBOX5.MDL.byte.BYTE1 = 0x0U;
ECanbMboxes.MBOX5.MDL.byte.BYTE2 = 0x0U;
ECanbMboxes.MBOX5.MDL.byte.BYTE3 = 0x0U;
ECanbMboxes.MBOX5.MDH.byte.BYTE4 = 0x0U;
ECanbMboxes.MBOX5.MDH.byte.BYTE5 = 0x0U;
ECanbMboxes.MBOX5.MDH.byte.BYTE6 = 0x0U;
ECanbMboxes.MBOX5.MDH.byte.BYTE7 = 0x0U;
ECanShadow.CANTRS.bit.TRS5 = 1U;
ECanShadow.CANTA.bit.TA5 = 1U;
break;
}
case 3U:
{
// [121h]
fTemp = Adc_EngineHeater_V.fLpfValue * 10.0F;
Tx121.EngHeatVoltage = (Uint16)fTemp;
fTemp = Adc_EngineHeater_I.fLpfValue * 10.0F;
Tx121.EngHeatCurrent = (Uint16)fTemp;
fTemp = Adc_GlowPlug_V.fLpfValue * 10.0F;
Tx121.GlowPlugVoltage = (Uint16)fTemp;
fTemp = Adc_GlowPlug_I.fLpfValue * 10.0F;
Tx121.GlowPlugCurrent = (Uint16)fTemp;
ECanbMboxes.MBOX6.MDL.byte.BYTE0 = ((Tx121.EngHeatVoltage >> 0U) & 0xFFU);
ECanbMboxes.MBOX6.MDL.byte.BYTE1 = ((Tx121.EngHeatVoltage >> 8U) & 0xFFU);
ECanbMboxes.MBOX6.MDL.byte.BYTE2 = ((Tx121.EngHeatCurrent >> 0U) & 0xFFU);
ECanbMboxes.MBOX6.MDL.byte.BYTE3 = ((Tx121.EngHeatCurrent >> 8U) & 0xFFU);
ECanbMboxes.MBOX6.MDH.byte.BYTE4 = ((Tx121.GlowPlugVoltage >> 0U) & 0xFFU);
ECanbMboxes.MBOX6.MDH.byte.BYTE5 = ((Tx121.GlowPlugVoltage >> 8U) & 0xFFU);
ECanbMboxes.MBOX6.MDH.byte.BYTE6 = ((Tx121.GlowPlugCurrent >> 0U) & 0xFFU);
ECanbMboxes.MBOX6.MDH.byte.BYTE7 = ((Tx121.GlowPlugCurrent >> 8U) & 0xFFU);
ECanShadow.CANTRS.bit.TRS6 = 1U;
ECanShadow.CANTA.bit.TA6 = 1U;
break;
}
case 4U:
{
// [122h]
fTemp = Adc_Solenoid_V.fLpfValue * 10.0F;
Tx122.SolenoidVoltage = (Uint16)fTemp;
fTemp = Adc_Solenoid_I.fLpfValue * 10.0F;
Tx122.SolenoidCurrent = (Uint16)fTemp;
fTemp = Adc_FuelPump_V.fLpfValue * 10.0F;
Tx122.FuelPumpVoltage = (Uint16)fTemp;
fTemp = Adc_FuelPump_I.fLpfValue * 10.0F;
Tx122.FuelPumpCurrent = (Uint16)fTemp;
ECanbMboxes.MBOX7.MDL.byte.BYTE0 = ((Tx122.SolenoidVoltage >> 0U) & 0xFFU);
ECanbMboxes.MBOX7.MDL.byte.BYTE1 = ((Tx122.SolenoidVoltage >> 8U) & 0xFFU);
ECanbMboxes.MBOX7.MDL.byte.BYTE2 = ((Tx122.SolenoidCurrent >> 0U) & 0xFFU);
ECanbMboxes.MBOX7.MDL.byte.BYTE3 = ((Tx122.SolenoidCurrent >> 8U) & 0xFFU);
ECanbMboxes.MBOX7.MDH.byte.BYTE4 = ((Tx122.FuelPumpVoltage >> 0U) & 0xFFU);
ECanbMboxes.MBOX7.MDH.byte.BYTE5 = ((Tx122.FuelPumpVoltage >> 8U) & 0xFFU);
ECanbMboxes.MBOX7.MDH.byte.BYTE6 = ((Tx122.FuelPumpCurrent >> 0U) & 0xFFU);
ECanbMboxes.MBOX7.MDH.byte.BYTE7 = ((Tx122.FuelPumpCurrent >> 8U) & 0xFFU);
ECanShadow.CANTRS.bit.TRS7 = 1U;
ECanShadow.CANTA.bit.TA7 = 1U;
break;
}
case 5U:
{
// [123h]
fTemp = Adc_CoolantPump_V.fLpfValue * 10.0F;
Tx123.CoolantPumpVoltage = (Uint16)fTemp;
fTemp = Adc_CoolantPump_I.fLpfValue * 10.0F;
Tx123.CoolantPumpCurrent = (Uint16)fTemp;
fTemp = Adc_Fan1_V.fLpfValue * 10.0F;
Tx123.Fan1Voltage = (Uint16)fTemp;
fTemp = Adc_Fan1_I.fLpfValue * 10.0F;
Tx123.Fan1Current = (Uint16)fTemp;
ECanbMboxes.MBOX8.MDL.byte.BYTE0 = ((Tx123.CoolantPumpVoltage >> 0U) & 0xFFU);
ECanbMboxes.MBOX8.MDL.byte.BYTE1 = ((Tx123.CoolantPumpVoltage >> 8U) & 0xFFU);
ECanbMboxes.MBOX8.MDL.byte.BYTE2 = ((Tx123.CoolantPumpCurrent >> 0U) & 0xFFU);
ECanbMboxes.MBOX8.MDL.byte.BYTE3 = ((Tx123.CoolantPumpCurrent >> 8U) & 0xFFU);
ECanbMboxes.MBOX8.MDH.byte.BYTE4 = ((Tx123.Fan1Voltage >> 0U) & 0xFFU);
ECanbMboxes.MBOX8.MDH.byte.BYTE5 = ((Tx123.Fan1Voltage >> 8U) & 0xFFU);
ECanbMboxes.MBOX8.MDH.byte.BYTE6 = ((Tx123.Fan1Current >> 0U) & 0xFFU);
ECanbMboxes.MBOX8.MDH.byte.BYTE7 = ((Tx123.Fan1Current >> 8U) & 0xFFU);
ECanShadow.CANTRS.bit.TRS8 = 1U;
ECanShadow.CANTA.bit.TA8 = 1U;
break;
}
default:
{
if (uiTxDivid == 6U)
{
// [124h]
fTemp = Adc_Fan2_V.fLpfValue * 10.0F;
Tx124.Fan2Voltage = (Uint16)fTemp;
fTemp = Adc_Fan2_I.fLpfValue * 10.0F;
Tx124.Fan2Current = (Uint16)fTemp;
ECanbMboxes.MBOX9.MDL.byte.BYTE0 = ((Tx124.Fan2Voltage >> 0U) & 0xFFU);
ECanbMboxes.MBOX9.MDL.byte.BYTE1 = ((Tx124.Fan2Voltage >> 8U) & 0xFFU);
ECanbMboxes.MBOX9.MDL.byte.BYTE2 = ((Tx124.Fan2Current >> 0U) & 0xFFU);
ECanbMboxes.MBOX9.MDL.byte.BYTE3 = ((Tx124.Fan2Current >> 8U) & 0xFFU);
ECanbMboxes.MBOX9.MDH.byte.BYTE4 = 0x0U;
ECanbMboxes.MBOX9.MDH.byte.BYTE5 = 0x0U;
ECanbMboxes.MBOX9.MDH.byte.BYTE6 = 0x0U;
ECanbMboxes.MBOX9.MDH.byte.BYTE7 = 0x0U;
ECanShadow.CANTRS.bit.TRS9 = 1U;
ECanShadow.CANTA.bit.TA9 = 1U;
}
break;
}
}
ECanbRegs.CANTRS.all = ECanShadow.CANTRS.all;
ECanbRegs.CANTA.all = ECanShadow.CANTA.all;
uiTxDivid = (uiTxDivid + 1U) % 10U;
}
static void CInitECanB(void)
{
/* Create a shadow register structure for the CAN control registers. This is
needed, since only 32-bit access is allowed to these registers. 16-bit access
to these registers could potentially corrupt the register contents or return
false data. This is especially true while writing to/reading from a bit
(or group of bits) among bits 16 - 31 */
struct ECAN_REGS ECanbShadow = {};
EALLOW; // EALLOW enables access to protected bits
/* Enable internal pull-up for the selected CAN pins */
// Pull-ups can be enabled or disabled by the user.
// This will enable the pullups for the specified pins.
// Comment out other unwanted lines.
GpioCtrlRegs.GPAPUD.bit.GPIO20 = 0x00U; // Enable pull-up CANTXB
GpioCtrlRegs.GPAPUD.bit.GPIO21 = 0x00U; // Enable pull-up CANRXB
/* Set qualification for selected CAN pins to asynch only */
// Inputs are synchronized to SYSCLKOUT by default.
// This will select asynch (no qualification) for the selected pins.
GpioCtrlRegs.GPAQSEL2.bit.GPIO21 = 0x03U; // Asynch qual for CANRXB
/* Configure eCAN-A pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be eCAN functional pins.
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 0x03U; // Configure CANTXB operation
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 0x03U; // Configure CANRXB operation
/* Configure eCAN RX and TX pins for CAN operation using eCAN regs*/
ECanbShadow.CANTIOC.all = ECanbRegs.CANTIOC.all;
ECanbShadow.CANTIOC.bit.TXFUNC = 1U;
ECanbRegs.CANTIOC.all = ECanbShadow.CANTIOC.all;
ECanbShadow.CANRIOC.all = ECanbRegs.CANRIOC.all;
ECanbShadow.CANRIOC.bit.RXFUNC = 1U;
ECanbRegs.CANRIOC.all = ECanbShadow.CANRIOC.all;
/* Configure eCAN for HECC mode - (reqd to access mailboxes 16 thru 31) */
// HECC mode also enables time-stamping feature
ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
ECanbShadow.CANMC.bit.SCB = 1;
ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
// as a matter of precaution.
ECanbRegs.CANTA.all = 0xFFFFFFFFU; /* Clear all TAn bits */
ECanbRegs.CANRMP.all = 0xFFFFFFFFU; /* Clear all RMPn bits */
ECanbRegs.CANGIF0.all = 0xFFFFFFFFU; /* Clear all interrupt flag bits */
ECanbRegs.CANGIF1.all = 0xFFFFFFFFU;
/* Configure bit timing parameters for eCANB*/
ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
ECanbShadow.CANMC.bit.CCR = 1U; // Set CCR = 1
ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
ECanbShadow.CANES.all = ECanbRegs.CANES.all;
do
{
ECanbShadow.CANES.all = ECanbRegs.CANES.all;
} while(ECanbShadow.CANES.bit.CCE != 1U); // Wait for CCE bit to be set..
ECanbShadow.CANBTC.all = 0U;
// 250 [kbps]
ECanbShadow.CANBTC.bit.BRPREG = 19U;
ECanbShadow.CANBTC.bit.TSEG1REG = 10U;
ECanbShadow.CANBTC.bit.TSEG2REG = 2U;
ECanbShadow.CANBTC.bit.SAM = 1U;
ECanbShadow.CANBTC.bit.SJWREG = 2U;
ECanbRegs.CANBTC.all = ECanbShadow.CANBTC.all;
ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
ECanbShadow.CANMC.bit.CCR = 0U;
ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
ECanbShadow.CANES.all = ECanbRegs.CANES.all;
do
{
ECanbShadow.CANES.all = ECanbRegs.CANES.all;
} while (ECanbShadow.CANES.bit.CCE != 0U); // Wait for CCE bit to be cleared..
/* Disable all Mailboxes */
ECanbRegs.CANME.all = 0U; // Required before writing the MSGIDs
EDIS;
CECanBSetMbox();
}
static void CECanBSetMbox(void)
{
struct ECAN_REGS ECanShadow = {};
/* Tx Can MBox */
ECanbMboxes.MBOX0.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX0.MSGID.bit.STDMSGID = 0x100U;
ECanbMboxes.MBOX0.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX0.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX0.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX0.MDH.all = 0x00000000U;
ECanbMboxes.MBOX0.MDL.all = 0x00000000U;
ECanbMboxes.MBOX1.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX1.MSGID.bit.STDMSGID = 0x101U;
ECanbMboxes.MBOX1.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX1.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX1.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX1.MDH.all = 0x00000000U;
ECanbMboxes.MBOX1.MDL.all = 0x00000000U;
ECanbMboxes.MBOX2.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX2.MSGID.bit.STDMSGID = 0x102U;
ECanbMboxes.MBOX2.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX2.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX2.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX2.MDH.all = 0x00000000U;
ECanbMboxes.MBOX2.MDL.all = 0x00000000U;
ECanbMboxes.MBOX3.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX3.MSGID.bit.STDMSGID = 0x103U;
ECanbMboxes.MBOX3.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX3.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX3.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX3.MDH.all = 0x00000000U;
ECanbMboxes.MBOX3.MDL.all = 0x00000000U;
ECanbMboxes.MBOX4.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX4.MSGID.bit.STDMSGID = 0x110U;
ECanbMboxes.MBOX4.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX4.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX4.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX4.MDH.all = 0x00000000U;
ECanbMboxes.MBOX4.MDL.all = 0x00000000U;
ECanbMboxes.MBOX5.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX5.MSGID.bit.STDMSGID = 0x120U;
ECanbMboxes.MBOX5.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX5.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX5.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX5.MDH.all = 0x00000000U;
ECanbMboxes.MBOX5.MDL.all = 0x00000000U;
ECanbMboxes.MBOX6.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX6.MSGID.bit.STDMSGID = 0x121U;
ECanbMboxes.MBOX6.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX6.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX6.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX6.MDH.all = 0x00000000U;
ECanbMboxes.MBOX6.MDL.all = 0x00000000U;
ECanbMboxes.MBOX7.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX7.MSGID.bit.STDMSGID = 0x122U;
ECanbMboxes.MBOX7.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX7.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX7.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX7.MDH.all = 0x00000000U;
ECanbMboxes.MBOX7.MDL.all = 0x00000000U;
ECanbMboxes.MBOX8.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX8.MSGID.bit.STDMSGID = 0x123U;
ECanbMboxes.MBOX8.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX8.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX8.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX8.MDH.all = 0x00000000U;
ECanbMboxes.MBOX8.MDL.all = 0x00000000U;
ECanbMboxes.MBOX9.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX9.MSGID.bit.STDMSGID = 0x124U;
ECanbMboxes.MBOX9.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX9.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX9.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX9.MDH.all = 0x00000000U;
ECanbMboxes.MBOX9.MDL.all = 0x00000000U;
/* Rx Can MBox(GCU)*/
ECanbMboxes.MBOX15.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX15.MSGID.bit.STDMSGID = 0x200U;
ECanbMboxes.MBOX15.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX15.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX15.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX15.MDH.all = 0x00000000U;
ECanbMboxes.MBOX15.MDL.all = 0x00000000U;
ECanbMboxes.MBOX16.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX16.MSGID.bit.STDMSGID = 0x201U;
ECanbMboxes.MBOX16.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX16.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX16.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX16.MDH.all = 0x00000000U;
ECanbMboxes.MBOX16.MDL.all = 0x00000000U;
ECanbMboxes.MBOX17.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX17.MSGID.bit.STDMSGID = 0x210U;
ECanbMboxes.MBOX17.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX17.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX17.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX17.MDH.all = 0x00000000U;
ECanbMboxes.MBOX17.MDL.all = 0x00000000U;
ECanbMboxes.MBOX18.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX18.MSGID.bit.STDMSGID = 0x220U;
ECanbMboxes.MBOX18.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX18.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX18.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX18.MDH.all = 0x00000000U;
ECanbMboxes.MBOX18.MDL.all = 0x00000000U;
ECanbMboxes.MBOX19.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX19.MSGID.bit.STDMSGID = 0x221U;
ECanbMboxes.MBOX19.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX19.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX19.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX19.MDH.all = 0x00000000U;
ECanbMboxes.MBOX19.MDL.all = 0x00000000U;
/* Rx Can MBox(ECU)*/
ECanbMboxes.MBOX25.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX25.MSGID.bit.STDMSGID = 0x300U;
ECanbMboxes.MBOX25.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX25.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX25.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX25.MDH.all = 0x00000000U;
ECanbMboxes.MBOX25.MDL.all = 0x00000000U;
ECanbMboxes.MBOX26.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX26.MSGID.bit.STDMSGID = 0x301U;
ECanbMboxes.MBOX26.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX26.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX26.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX26.MDH.all = 0x00000000U;
ECanbMboxes.MBOX26.MDL.all = 0x00000000U;
ECanbMboxes.MBOX27.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX27.MSGID.bit.STDMSGID = 0x310U;
ECanbMboxes.MBOX27.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX27.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX27.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX27.MDH.all = 0x00000000U;
ECanbMboxes.MBOX27.MDL.all = 0x00000000U;
ECanbMboxes.MBOX28.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX28.MSGID.bit.STDMSGID = 0x320U;
ECanbMboxes.MBOX28.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX28.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX28.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX28.MDH.all = 0x00000000U;
ECanbMboxes.MBOX28.MDL.all = 0x00000000U;
ECanbMboxes.MBOX29.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX29.MSGID.bit.STDMSGID = 0x321U;
ECanbMboxes.MBOX29.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX29.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX29.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX29.MDH.all = 0x00000000U;
ECanbMboxes.MBOX29.MDL.all = 0x00000000U;
ECanbMboxes.MBOX30.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX30.MSGID.bit.STDMSGID = 0x322U;
ECanbMboxes.MBOX30.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX30.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX30.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX30.MDH.all = 0x00000000U;
ECanbMboxes.MBOX30.MDL.all = 0x00000000U;
#ifdef AUX_TEST // ! Auxiliary Test
ECanbMboxes.MBOX31.MSGID.bit.IDE = 0U;
ECanbMboxes.MBOX31.MSGID.bit.STDMSGID = 0x400U;
ECanbMboxes.MBOX31.MSGID.bit.AME = 0U;
ECanbMboxes.MBOX31.MSGCTRL.bit.DLC = 8U;
ECanbMboxes.MBOX31.MSGCTRL.bit.RTR = 0U;
ECanbMboxes.MBOX31.MDH.all = 0x00000000U;
ECanbMboxes.MBOX31.MDL.all = 0x00000000U;
#endif
//0 is Transe, 1 is Receive
ECanShadow.CANMD.all = ECanbRegs.CANMD.all;
ECanShadow.CANMD.all = 0x7E0F8000UL; // USE MBOX15~19, 25~30 (31 제외)
#ifdef AUX_TEST // ! Auxiliary Test
ECanShadow.CANMD.bit.MD31 = 1U;
#endif
ECanbRegs.CANMD.all = ECanShadow.CANMD.all;
// MailBox Enable/Disable, 0 is Disable, 1 is Enable
ECanShadow.CANME.all = ECanbRegs.CANME.all;
ECanShadow.CANME.all = 0x7E0F83FFUL; // USE MBOX0~9, 15~19, 25~30 (31 제외)
#ifdef AUX_TEST // ! Auxiliary Test
ECanShadow.CANME.bit.ME31 = 1U;
#endif
ECanbRegs.CANME.all = ECanShadow.CANME.all;
EALLOW;
ECanShadow.CANMC.all = ECanbRegs.CANMC.all;
ECanShadow.CANMC.bit.STM = 0U; // '1' CAN Self-test Mode ¼³A¤
ECanShadow.CANMC.bit.ABO = 1U; // '1' CAN Auto Bus On
ECanbRegs.CANMC.all = ECanShadow.CANMC.all;
// Interrupt Enable(Receive Interrupt), 0 is Disable, 1 is Enable
ECanShadow.CANMIM.all = ECanbRegs.CANMIM.all;
ECanShadow.CANMIM.bit.MIM15 = 1U;
ECanShadow.CANMIM.bit.MIM16 = 1U;
ECanShadow.CANMIM.bit.MIM17 = 1U;
ECanShadow.CANMIM.bit.MIM18 = 1U;
ECanShadow.CANMIM.bit.MIM19 = 1U;
ECanShadow.CANMIM.bit.MIM25 = 1U;
ECanShadow.CANMIM.bit.MIM26 = 1U;
ECanShadow.CANMIM.bit.MIM27 = 1U;
ECanShadow.CANMIM.bit.MIM28 = 1U;
ECanShadow.CANMIM.bit.MIM29 = 1U;
ECanShadow.CANMIM.bit.MIM30 = 1U;
#ifdef AUX_TEST // ! Auxiliary Test
ECanShadow.CANMIM.bit.MIM31 = 1U;
#endif
ECanbRegs.CANMIM.all = ECanShadow.CANMIM.all;
// Groble Interrupt
ECanShadow.CANGIM.all = ECanbRegs.CANGIM.all;
ECanShadow.CANGIM.bit.I0EN = 1U; // Line 0 Interrupt Enable
ECanShadow.CANGIM.bit.GIL = 0U; // All global interrupts are mapped to the ECAN0INT interrupt line.
ECanbRegs.CANGIM.all = ECanShadow.CANGIM.all;
EDIS;
}
void CInitEcan(void)
{
CInitECanA();
CInitECanB();
CInitECanStructure();
}
static void CInitECanStructure(void)
{
// Tx
(void)memset(&Tx100, 0, sizeof(CTx100));
(void)memset(&Tx101, 0, sizeof(CTx101));
(void)memset(&Tx102, 0, sizeof(CTx102));
(void)memset(&Tx103, 0, sizeof(CTx103));
(void)memset(&Tx110, 0, sizeof(CTx110));
(void)memset(&Tx120, 0, sizeof(CTx120));
(void)memset(&Tx121, 0, sizeof(CTx121));
(void)memset(&Tx122, 0, sizeof(CTx122));
(void)memset(&Tx123, 0, sizeof(CTx123));
(void)memset(&Tx124, 0, sizeof(CTx124));
(void)memset(&Tx700, 0, sizeof(CTx700));
(void)memset(&Tx701, 0, sizeof(CTx701));
(void)memset(&Tx710, 0, sizeof(CTx710));
(void)memset(&Tx720, 0, sizeof(CTx720));
(void)memset(&Tx730, 0, sizeof(CTx730));
(void)memset(&Tx731, 0, sizeof(CTx731));
(void)memset(&Tx732, 0, sizeof(CTx732));
(void)memset(&Tx733, 0, sizeof(CTx733));
(void)memset(&Tx734, 0, sizeof(CTx734));
(void)memset(&Tx740, 0, sizeof(CTx740));
(void)memset(&Tx741, 0, sizeof(CTx741));
(void)memset(&Tx750, 0, sizeof(CTx750));
(void)memset(&Tx751, 0, sizeof(CTx751));
(void)memset(&Tx752, 0, sizeof(CTx752));
// Rx - GCU
(void)memset(&Rx200, 0, sizeof(CRx200));
(void)memset(&Rx201, 0, sizeof(CRx201));
(void)memset(&Rx210, 0, sizeof(CRx210));
(void)memset(&Rx220, 0, sizeof(CRx220));
(void)memset(&Rx221, 0, sizeof(CRx221));
// Rx - ECU
(void)memset(&Rx300, 0, sizeof(CRx300));
(void)memset(&Rx301, 0, sizeof(CRx301));
(void)memset(&Rx310, 0, sizeof(CRx310));
(void)memset(&Rx320, 0, sizeof(CRx320));
(void)memset(&Rx321, 0, sizeof(CRx321));
(void)memset(&Rx322, 0, sizeof(CRx322));
#ifdef AUX_TEST // ! Auxiliary Test
// Rx - Auxiliary Test
(void)memset(&Rx400, 0, sizeof(CRx400));
#endif
}
static inline Uint16 CPackBit(Uint16 data, Uint16 pos)
{
Uint16 result = (data != 0U) ? 1U : 0U;
return result << pos;
}
static inline Uint16 CPackField(Uint16 data, Uint16 mask, Uint16 pos)
{
return ((data & mask) << pos);
}