From ac023187cdc0fddc9a75ab7981e937916f09b89e Mon Sep 17 00:00:00 2001 From: Oleg Date: Tue, 4 Mar 2025 08:37:38 +0300 Subject: [PATCH 1/5] Overload "trasmitMsg" method --- Protocol/CAN.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ Protocol/CAN.h | 4 ++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/Protocol/CAN.cpp b/Protocol/CAN.cpp index 464b733..ec996bc 100644 --- a/Protocol/CAN.cpp +++ b/Protocol/CAN.cpp @@ -34,6 +34,69 @@ void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){ } +void 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 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 diff --git a/Protocol/CAN.h b/Protocol/CAN.h index 149a90b..d6fc14a 100644 --- a/Protocol/CAN.h +++ b/Protocol/CAN.h @@ -111,7 +111,9 @@ public: 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); From 182ada3bba0aa33781232238c6bd77e987f5e9f1 Mon Sep 17 00:00:00 2001 From: Oleg Date: Tue, 4 Mar 2025 14:17:33 +0300 Subject: [PATCH 2/5] Fix mistakes --- Protocol/CAN.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Protocol/CAN.cpp b/Protocol/CAN.cpp index ec996bc..639ce67 100644 --- a/Protocol/CAN.cpp +++ b/Protocol/CAN.cpp @@ -34,7 +34,7 @@ void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){ } -void transmitMsg(Uint16 boxNumber, const Uint32& message){ +void CAN::transmitMsg(Uint16 boxNumber, const Uint32& message){ if (boxNumber > 31) return; Uint32 mboxControl(0); @@ -65,7 +65,7 @@ void transmitMsg(Uint16 boxNumber, const Uint32& message){ } -void transmitMsg(Uint16 boxNumber, const Uint32& message, const Uint16 dlc){ +void CAN::transmitMsg(Uint16 boxNumber, const Uint32& message, const Uint16 dlc){ if (boxNumber > 31) return; Uint32 mboxControl(0); From b884754d938de60f0946836b5f41fa3b527d9579 Mon Sep 17 00:00:00 2001 From: Oleg Date: Thu, 6 Mar 2025 09:33:12 +0300 Subject: [PATCH 3/5] Add mbox interrupt handling --- Protocol/CAN.h | 2 +- Protocol/CANConfig.cpp | 13 +++++++++++++ main.cpp | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/Protocol/CAN.h b/Protocol/CAN.h index d6fc14a..dfd1c2f 100644 --- a/Protocol/CAN.h +++ b/Protocol/CAN.h @@ -106,7 +106,7 @@ 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); diff --git a/Protocol/CANConfig.cpp b/Protocol/CANConfig.cpp index 7817555..a83daec 100644 --- a/Protocol/CANConfig.cpp +++ b/Protocol/CANConfig.cpp @@ -269,4 +269,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..424531c 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); @@ -168,3 +173,35 @@ interrupt void canb_isr(void){ PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9; } + +interrupt void canb_box_isr(void){ + canBoxISRcounter++; + + // Just example + // + // boxNumberIsr = ECanbRegs.CANGIF1.bit.MIV1; + + // CANRMP_REG temp; + // temp.all = 0; + // temp.all = 1ul << 27; + // temp.all |= 1ul << 26; + + // 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; + + // MODBUS_COMM_CPU_Message26.mdh.all = ECanbMboxes.MBOX26.MDH.all; + // MODBUS_COMM_CPU_Message26.mdl.all = ECanbMboxes.MBOX26.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; +} \ No newline at end of file From 7cd6a2ea9eac7d7b0caeff665c0b491f54ccbfcb Mon Sep 17 00:00:00 2001 From: Oleg Date: Thu, 6 Mar 2025 09:43:00 +0300 Subject: [PATCH 4/5] Clean the code --- main.cpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/main.cpp b/main.cpp index 424531c..e63ac35 100644 --- a/main.cpp +++ b/main.cpp @@ -157,18 +157,14 @@ interrupt void canb_isr(void){ canISRcounter++; CANGIF0_REG CANGIF0_SHADOW; - volatile Uint32 resetBit; - CANGIF0_SHADOW.all = ECanbRegs.CANGIF0.all; 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; @@ -179,21 +175,18 @@ interrupt void canb_box_isr(void){ // Just example // + // volatile Uint32 boxNumberIsr; // boxNumberIsr = ECanbRegs.CANGIF1.bit.MIV1; // CANRMP_REG temp; // temp.all = 0; // temp.all = 1ul << 27; - // temp.all |= 1ul << 26; // 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; - // MODBUS_COMM_CPU_Message26.mdh.all = ECanbMboxes.MBOX26.MDH.all; - // MODBUS_COMM_CPU_Message26.mdl.all = ECanbMboxes.MBOX26.MDL.all; - // temp.all = ECanbRegs.CANRMP.all; // if (temp.bit.RMP25){ // temp.all = 1ul << 25; @@ -204,4 +197,4 @@ interrupt void canb_box_isr(void){ // } PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9; -} \ No newline at end of file +} From 07bb5edd57340995e06c32844a33ad1ad72681de Mon Sep 17 00:00:00 2001 From: Oleg Date: Thu, 6 Mar 2025 10:08:08 +0300 Subject: [PATCH 5/5] Change/add methods 1. Change receiveMsg. Now it returns int16 with error identification 2. Change CANMessage structure. Now it only has dataLenght variable instead of previos MsgCtrlReg union 3. Change MsgCtrlReg. Add an OPC flag in it 4. Change configRxMBox method. Overwrite protection enabling is added --- Protocol/CAN.cpp | 11 ++++++----- Protocol/CAN.h | 8 +++++--- Protocol/CANConfig.cpp | 8 +++++--- main.cpp | 5 ++++- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/Protocol/CAN.cpp b/Protocol/CAN.cpp index 639ce67..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; @@ -109,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; @@ -146,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); @@ -156,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; @@ -171,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 dfd1c2f..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; @@ -116,7 +118,7 @@ public: 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 a83daec..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; diff --git a/main.cpp b/main.cpp index e63ac35..7334870 100644 --- a/main.cpp +++ b/main.cpp @@ -88,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; @@ -157,9 +157,12 @@ interrupt void canb_isr(void){ canISRcounter++; CANGIF0_REG CANGIF0_SHADOW; + volatile Uint32 resetBit; + CANGIF0_SHADOW.all = ECanbRegs.CANGIF0.all; if (CANGIF0_SHADOW.bit.WLIF0){ + resetBit = 256; ECanbRegs.CANGIF0.all = 256ul; }