/* ========================================================================= */ /* 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); }