//-------------------------------------------------------// // Project Code : V2H6K01-23-ENEMAN // File Name : CanCHAdeMO.cpp // Created on : 2023. 11. 15. // Description : // Author : KwonJeongMin // Last modified Date : //-------------------------------------------------------// #include "CommonLib.h" union uCanCHAdeMO CanCHAdeMO; struct sCanCHAdeMO CanCHAdeMORx; //CanBeRx.Mas = Master to Slave Data, CanBeRx.Slv = Slave to Master Data unsigned int CanCHAdeMORxStatus = 0; unsigned int CanCHAdeMORxIsrCnt = 0; unsigned int CanCHAdeMORxIsrErrCnt = 0; unsigned int CANCHADEMO_RxID_OFFSET = 0x0000; unsigned int CANCHADEMO_TxID_OFFSET = 0x0000; void InitCanCHAdeMO() { } interrupt void CanCHAdeMORxIsr(void) { CanCHAdeMORxStatus = CAN_getInterruptCause(CANCHADEMO); //수신용 메일박스 사용 숫자에 따라 변경할 것 if((CanCHAdeMORxStatus >= CANCHADEMO_RX_MBOX_START) && (CanCHAdeMORxStatus <= CANCHADEMO_RX_MBOX_END)) { CanRxMsg(CANCHADEMO, CanCHAdeMORxStatus, &CanCHAdeMORxMbox[CanCHAdeMORxStatus]); if (Status.bit.Master != 1) CanCHAdeMORx.Mas.DataArr[CanCHAdeMORxMbox[CanCHAdeMORxStatus].Id - CANCHADEMO_RxID_OFFSET] = CanCHAdeMORxMbox[CanCHAdeMORxStatus].Data.all; else CanCHAdeMORx.Slv.DataArr[CanCHAdeMORxMbox[CanCHAdeMORxStatus].Id - CANCHADEMO_RxID_OFFSET] = CanCHAdeMORxMbox[CanCHAdeMORxStatus].Data.all; } else { //0x8000 이면 에러.. //나머지는 미사용 메일박스 CanCHAdeMORxIsrErrCnt++; } CanCHAdeMORxIsrCnt++; CAN_clearInterruptStatus(CANCHADEMO, CanCHAdeMORxStatus); CAN_clearGlobalInterruptStatus(CANCHADEMO, CAN_GLOBAL_INT_CANINT0); Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9); } void CanCHAdeMORun_500us() { // CanCHAdeMO.Data.IDx00.bit.IbatRef = IbatRef; // CanCHAdeMO.Data.IDx00.bit.Status.all = Status.all; // // CanCHAdeMOTxMbox.Lenth = 8; // CanCHAdeMOTxMbox.Id = CANCHADEMO_TxID_OFFSET; // CanCHAdeMOTxMbox.Data.all = CanCHAdeMO.Data.IDx00.all; // // CanTxMsg(CANCHADEMO, 32, &CanCHAdeMOTxMbox); } unsigned int CanCHAdeMOTable[] = {0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,0x0008,0x0009,0x000A}; unsigned int CanCHAdeMOTxSeqTableSize = 0; unsigned int CanCHAdeMOTxSeqTableCnt = 0; void CanCHAdeMORun() { CanCHAdeMOTxUpdate(); //배열 크기 계산 CanCHAdeMOTxSeqTableSize = sizeof(CanCHAdeMOTable); if (CanCHAdeMOTxSeqTableCnt >= CanCHAdeMOTxSeqTableSize) CanCHAdeMOTxSeqTableCnt = 0; CanCHAdeMOTxMbox.Id = CanCHAdeMOTxSeqTable[CanCHAdeMOTxSeqTableCnt++]+CANCHADEMO_TxID_OFFSET; CanCHAdeMOTxMbox.Data.all = CanCHAdeMO.DataArr[CanCHAdeMOTxMbox.Id - CANCHADEMO_TxID_OFFSET]; CanTxMsg(CANCHADEMO, 32, &CanCHAdeMOTxMbox); } void CanCHAdeMOTxUpdate() { CanCHAdeMO.Data.IDx01.bit.HeartBeat ^= 1; CanCHAdeMO.Data.IDx01.bit.Mode = Status.bit.Master; // CanCHAdeMO.Data.IDx02.bit.FaultHW.all = Fault.Hw.all; CanCHAdeMO.Data.IDx02.bit.FaultSW1.all = Fault.Sw1.all; CanCHAdeMO.Data.IDx03.bit.FaultSW2.all = Fault.Sw2.all; CanCHAdeMO.Data.IDx03.bit.FaultSW3.all = Fault.Sw3.all; CanCHAdeMO.Data.IDx04.bit.Temp_AcSwHeatSink1 = Temp.AcSwHeatSink1; CanCHAdeMO.Data.IDx04.bit.Temp_AcSwHeatSink2 = Temp.AcSwHeatSink2; CanCHAdeMO.Data.IDx05.bit.Temp_DcSwHeatSink1 = Temp.DcSwHeatSink1; CanCHAdeMO.Data.IDx05.bit.Temp_DcSwHeatSink2 = Temp.DcSwHeatSink2; CanCHAdeMO.Data.IDx06.bit.Temp_Spare1 = Temp.Spare1; CanCHAdeMO.Data.IDx06.bit.Temp_Spare2 = Temp.Spare2; CanCHAdeMO.Data.IDx07.bit.Ibat = IbatAvg; CanCHAdeMO.Data.IDx07.bit.Vbat = VbatAvg; CanCHAdeMO.Data.IDx08.bit.Pbat = PbatAvg; CanCHAdeMO.Data.IDx08.bit.Vdc = VdcAvg; CanCHAdeMO.Data.IDx09.bit.Iqe = IqeAvg; CanCHAdeMO.Data.IDx09.bit.Vqe = VqeAvg; CanCHAdeMO.Data.IDx0A.bit.Pinv = PinvActiveAvg; }