Merge updated branch 'feature/baseCAN' into dev

feature/CAN_timeOut
Oleg 2 months ago
commit dbbd22524b

@ -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;

@ -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;

@ -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

@ -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;
}

Loading…
Cancel
Save