diff --git a/Protocol/CAN.cpp b/Protocol/CAN.cpp index 464b733..c2b1777 100644 --- a/Protocol/CAN.cpp +++ b/Protocol/CAN.cpp @@ -14,7 +14,7 @@ void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){ p_MailBox->MDH.all = 0x0; p_MailBox->MDL.all = 0x0; - p_MailBox->MSGCTRL.bit.DLC = message.msgctrl.bit.DLC; + p_MailBox->MSGCTRL.bit.DLC = message.dataLength; p_MailBox->MDH.all = message.mdh.all; p_MailBox->MDL.all = message.mdl.all; @@ -34,6 +34,69 @@ void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){ } +void CAN::transmitMsg(Uint16 boxNumber, const Uint32& message){ + if (boxNumber > 31) return; + + Uint32 mboxControl(0); + mboxControl = 1ul << boxNumber; + + volatile MBOX* p_MailBox(0); + p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; + + p_MailBox->MDH.all = 0x0; + p_MailBox->MDL.all = 0x0; + + p_MailBox->MDH.all = message >> 16; + p_MailBox->MDL.all = message; + + // Set TRS for mailbox + CanShadow_.CANTRS.all = 0; + CanShadow_.CANTRS.all |= mboxControl; + p_CanRegs_->CANTRS.all = CanShadow_.CANTRS.all; + + // Wait for TA bit to be set + do { CanShadow_.CANTA.all = p_CanRegs_->CANTA.all; } + while((CanShadow_.CANTA.all & mboxControl) == 0 ); + + // Clear TA (transmit acknowledge bit) + CanShadow_.CANTA.all = 0; + CanShadow_.CANTA.all |= mboxControl; + p_CanRegs_->CANTA.all = CanShadow_.CANTA.all; +} + + +void CAN::transmitMsg(Uint16 boxNumber, const Uint32& message, const Uint16 dlc){ + if (boxNumber > 31) return; + + Uint32 mboxControl(0); + mboxControl = 1ul << boxNumber; + + volatile MBOX* p_MailBox(0); + p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; + + p_MailBox->MDH.all = 0x0; + p_MailBox->MDL.all = 0x0; + + p_MailBox->MSGCTRL.bit.DLC = dlc; + p_MailBox->MDH.all = message >> 16; + p_MailBox->MDL.all = message; + + // Set TRS for mailbox + CanShadow_.CANTRS.all = 0; + CanShadow_.CANTRS.all |= mboxControl; + p_CanRegs_->CANTRS.all = CanShadow_.CANTRS.all; + + // Wait for TA bit to be set + do { CanShadow_.CANTA.all = p_CanRegs_->CANTA.all; } + while((CanShadow_.CANTA.all & mboxControl) == 0 ); + + // Clear TA (transmit acknowledge bit) + CanShadow_.CANTA.all = 0; + CanShadow_.CANTA.all |= mboxControl; + p_CanRegs_->CANTA.all = CanShadow_.CANTA.all; +} + + void CAN::updateTXMessage(Uint16 boxNumber, const CANMessage& message){ // TODO check trs bit and set it at the end if it was here. Once the TRS bit is set for a mailbox and then data is changed in the mailbox using the CDR // bit, the CAN module fails to transmit the new data and transmits the old data instead. To avoid this, // reset transmission in that mailbox using the TRRn bit and set the TRSn bit again. The new data is @@ -46,6 +109,7 @@ void CAN::updateTXMessage(Uint16 boxNumber, const CANMessage& message){ // TODO // Set change data request (CDR bit + MBOX number) p_CanRegs_->CANMC.all |= (128 + boxNumber); + // TODO Add lenght changing? p_MailBox->MDL.all = message.mdl.all; p_MailBox->MDH.all = message.mdh.all; @@ -83,7 +147,7 @@ void CAN::sendRemoteRequest(Uint16 boxNumber){ } -bool CAN::receiveMsg(Uint16 boxNumber, CANMessage& rxMessage){ // TODO faults just return -1 +int16 CAN::receiveMsg(Uint16 boxNumber, CANMessage& rxMessage){ // TODO faults just return -1 if (boxNumber > 31) { return -1; } Uint32 mboxControl(0); @@ -93,11 +157,11 @@ bool CAN::receiveMsg(Uint16 boxNumber, CANMessage& rxMessage){ // TODO faults ju p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; bool isNewMessageInBox = p_CanRegs_->CANRMP.all & mboxControl; - if(!isNewMessageInBox) return -1; + if(!isNewMessageInBox) return -2; p_CanRegs_->CANRMP.all &= mboxControl; - rxMessage.msgctrl.all = p_MailBox->MSGCTRL.all; + rxMessage.dataLength = p_MailBox->MSGCTRL.all; rxMessage.mdl.all = p_MailBox->MDL.all; rxMessage.mdh.all = p_MailBox->MDH.all; @@ -108,7 +172,7 @@ bool CAN::receiveMsg(Uint16 boxNumber, CANMessage& rxMessage){ // TODO faults ju lostMessage = p_CanRegs_->CANRML.all & mboxControl; if(newMessage || lostMessage) { - return -1; + return -3; } return 0; diff --git a/Protocol/CAN.h b/Protocol/CAN.h index 149a90b..f38226c 100644 --- a/Protocol/CAN.h +++ b/Protocol/CAN.h @@ -1,5 +1,6 @@ #pragma once +#include "DSP2833x_Device.h" #include "DSP28x_Project.h" namespace canSpace { @@ -36,7 +37,8 @@ enum configSystemIsrFlags{ struct MsgCtrlBits { // bits description Uint16 DLC:4; // 0:3 Uint16 RTR:1; // 4 - Uint16 rsvd1:3; // 7:5 reserved + Uint16 OPC:1; // 1 + Uint16 rsvd1:2; // 7:6 reserved Uint16 TPL:5; // 12:8 Uint16 rsvd2:3; // 15:13 reserved }; @@ -86,7 +88,7 @@ union MsgID { struct CANMessage { - union MsgCtrlReg msgctrl; + Uint16 dataLength; union CANMDL_REG mdl; union CANMDH_REG mdh; @@ -106,15 +108,17 @@ public: void configTxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg& configCtrlReg); void configRxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg& configCtrlReg); void configSystemIsr(Uint32 flags); - void configMBoxIsr(Uint16 boxNumber); // TODO not realized yet + void configMBoxIsr(Uint16 boxNumber); bool isNewMessage(); bool isNewMessage(Uint16 boxNumber); - void transmitMsg(Uint16 boxNumber, const CANMessage& message); + void transmitMsg(Uint16 boxNumber, const CANMessage& message); // TODO excessive method? + void transmitMsg(Uint16 boxNumber, const Uint32& message); + void transmitMsg(Uint16 boxNumber, const Uint32& message, const Uint16 dlc); void updateTXMessage(Uint16 boxNumber, const CANMessage& message); void sendRemoteRequest(Uint16 boxNumber); - bool receiveMsg(Uint16 boxNumber, CANMessage& rxMessage); + int16 receiveMsg(Uint16 boxNumber, CANMessage& rxMessage); private: CAN_VARIANT canPort; diff --git a/Protocol/CANConfig.cpp b/Protocol/CANConfig.cpp index 7817555..5eface1 100644 --- a/Protocol/CANConfig.cpp +++ b/Protocol/CANConfig.cpp @@ -252,9 +252,11 @@ void CAN::configRxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg // Overwrite protection // If "ON" make sure that an additional mailbox is configured to store ’overflow’ messages. - // CanShadow_.CANOPC.all = p_CanRegs_->CANOPC.all; - // CanShadow_.CANOPC.all |= mboxControl; // Should be one more mailbox to store 'overflow' messages - // p_CanRegs_->CANOPC.all = CanShadow_.CANOPC.all; + if(configCtrlReg.bit.OPC){ + CanShadow_.CANOPC.all = p_CanRegs_->CANOPC.all; + CanShadow_.CANOPC.all |= mboxControl; + p_CanRegs_->CANOPC.all = CanShadow_.CANOPC.all; + } // Enable Mailbox CanShadow_.CANME.all = p_CanRegs_->CANME.all; @@ -269,4 +271,17 @@ void CAN::configSystemIsr(Uint32 flags){ EDIS; } + +void CAN::configMBoxIsr(Uint16 boxNumber){ + if (boxNumber > 31) return; + + Uint32 mboxControl(0); + mboxControl = 1ul << boxNumber; + + EALLOW; + p_CanRegs_->CANMIL.all |= mboxControl; + p_CanRegs_->CANMIM.all |= mboxControl; + EDIS; +} + } //canSpace diff --git a/main.cpp b/main.cpp index b1eb785..7334870 100644 --- a/main.cpp +++ b/main.cpp @@ -13,7 +13,10 @@ void idle_loop(void); interrupt void cpu_timer0_isr(void); interrupt void canb_isr(void); +interrupt void canb_box_isr(void); + volatile Uint16 canISRcounter = 0; +volatile Uint16 canBoxISRcounter = 0; canSpace::CAN canTest(canSpace::CANB); Uint16 msgsSent = 0; @@ -45,6 +48,7 @@ void main() EALLOW; PieVectTable.TINT0 = &cpu_timer0_isr; PieVectTable.ECAN0INTB = &canb_isr; + PieVectTable.ECAN1INTB = &canb_box_isr; EDIS; // memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (Uint32)&RamfuncsLoadSize); @@ -57,6 +61,7 @@ void main() PieCtrlRegs.PIEIER1.bit.INTx7 = 1; PieCtrlRegs.PIEIER9.bit.INTx7 = 1; // from 5 to 8 + PieCtrlRegs.PIEIER9.bit.INTx8 = 1; canTest.initGpio(); canTest.config(100); @@ -83,7 +88,7 @@ void main() CpuTimer0.RegsAddr->TCR.bit.TSS = 0; - message.msgctrl.bit.DLC = 8; + message.dataLength = 8; message.mdl.byte.BYTE0 = 0x11; message.mdl.byte.BYTE1 = 0x22; message.mdl.byte.BYTE2 = 0x33; @@ -158,13 +163,41 @@ interrupt void canb_isr(void){ if (CANGIF0_SHADOW.bit.WLIF0){ resetBit = 256; - ECanbRegs.CANGIF0.all = resetBit; + ECanbRegs.CANGIF0.all = 256ul; } if (CANGIF0_SHADOW.bit.EPIF0){ - resetBit = 528; - ECanbRegs.CANGIF0.all = resetBit; + ECanbRegs.CANGIF0.all = 528ul; } PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9; } + +interrupt void canb_box_isr(void){ + canBoxISRcounter++; + + // Just example + // + // volatile Uint32 boxNumberIsr; + // boxNumberIsr = ECanbRegs.CANGIF1.bit.MIV1; + + // CANRMP_REG temp; + // temp.all = 0; + // temp.all = 1ul << 27; + + // ECanbRegs.CANRMP.all = temp.all; + + // MODBUS_COMM_CPU_Message27.mdh.all = ECanbMboxes.MBOX27.MDH.all; + // MODBUS_COMM_CPU_Message27.mdl.all = ECanbMboxes.MBOX27.MDL.all; + + // temp.all = ECanbRegs.CANRMP.all; + // if (temp.bit.RMP25){ + // temp.all = 1ul << 25; + // ECanbRegs.CANRMP.all = temp.all; + + // MODBUS_COMM_CPU_Message25.mdh.all = ECanbMboxes.MBOX25.MDH.all; + // MODBUS_COMM_CPU_Message25.mdl.all = ECanbMboxes.MBOX25.MDL.all; + // } + + PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9; +}