Merge branch 'feature/baseCAN' into dev

CAN module is added here. This is not the can protocol for communication
between CPU and COMM boards, but common CAN protocol that must be
extended in the future
feature/CAN_timeOut
Oleg 2 months ago
commit 714f0265cc

@ -1,13 +1,14 @@
#include "DSP2833x_Device.h" #include "CAN.h"
#include <cstddef>
namespace canSpace { namespace canSpace {
void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){ void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){
if (boxNumber > 31) return;
Uint32 mboxControl(0); Uint32 mboxControl(0);
mboxControl = 1ul << boxNumber; mboxControl = 1ul << boxNumber;
volatile MBOX* p_MailBox(NULL); volatile MBOX* p_MailBox(0);
p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber;
p_MailBox->MDH.all = 0x0; p_MailBox->MDH.all = 0x0;
@ -22,8 +23,9 @@ void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){
CanShadow_.CANTRS.all |= mboxControl; CanShadow_.CANTRS.all |= mboxControl;
p_CanRegs_->CANTRS.all = CanShadow_.CANTRS.all; p_CanRegs_->CANTRS.all = CanShadow_.CANTRS.all;
do { CanShadow_.CANTA.all = p_CanRegs_->CANTA.all; } // TODO add tx error somewhere here // Wait for TA bit to be set
while((CanShadow_.CANTA.all & mboxControl) == 0 );// 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) // Clear TA (transmit acknowledge bit)
CanShadow_.CANTA.all = 0; CanShadow_.CANTA.all = 0;
@ -38,7 +40,7 @@ void CAN::updateTXMessage(Uint16 boxNumber, const CANMessage& message){ // TODO
// then transmitted. // then transmitted.
if (boxNumber > 31) return; if (boxNumber > 31) return;
volatile MBOX* p_MailBox(NULL); volatile MBOX* p_MailBox(0);
p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber;
// Set change data request (CDR bit + MBOX number) // Set change data request (CDR bit + MBOX number)
@ -56,7 +58,7 @@ void CAN::updateTXMessage(Uint16 boxNumber, const CANMessage& message){ // TODO
void CAN::sendRemoteRequest(Uint16 boxNumber){ void CAN::sendRemoteRequest(Uint16 boxNumber){
if (boxNumber > 31) return; if (boxNumber > 31) return;
volatile MBOX* p_MailBox(NULL); volatile MBOX* p_MailBox(0);
p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber;
Uint32 mboxControl(0); Uint32 mboxControl(0);
@ -87,7 +89,7 @@ bool CAN::receiveMsg(Uint16 boxNumber, CANMessage& rxMessage){ // TODO faults ju
Uint32 mboxControl(0); Uint32 mboxControl(0);
mboxControl = 1ul << boxNumber; mboxControl = 1ul << boxNumber;
volatile MBOX* p_MailBox(NULL); volatile MBOX* p_MailBox(0);
p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber;
bool isNewMessageInBox = p_CanRegs_->CANRMP.all & mboxControl; bool isNewMessageInBox = p_CanRegs_->CANRMP.all & mboxControl;
@ -107,7 +109,6 @@ bool CAN::receiveMsg(Uint16 boxNumber, CANMessage& rxMessage){ // TODO faults ju
if(newMessage || lostMessage) { if(newMessage || lostMessage) {
return -1; return -1;
// set_fault();
} }
return 0; return 0;

@ -1,6 +1,5 @@
#pragma once #pragma once
#include "DSP2833x_Device.h"
#include "DSP28x_Project.h" #include "DSP28x_Project.h"
namespace canSpace { namespace canSpace {

@ -1,6 +1,4 @@
#include "DSP2833x_Device.h" #include "CAN.h"
#include "DSP2833x_ECan.h"
#include <cstddef>
namespace canSpace { namespace canSpace {
@ -185,7 +183,7 @@ void CAN::config(Uint16 baudrate, Uint16 flags){
void CAN::configTxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg& configCtrlReg){ void CAN::configTxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg& configCtrlReg){
if (boxNumber > 31) return; if (boxNumber > 31) return;
volatile MBOX* p_MailBox(NULL); volatile MBOX* p_MailBox(0);
p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber;
Uint32 mboxControl(0); Uint32 mboxControl(0);
@ -201,7 +199,6 @@ void CAN::configTxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg
while((CanShadow_.CANTRS.all & mboxControl) != 0); // Wait for TRS bit to be cleared while((CanShadow_.CANTRS.all & mboxControl) != 0); // Wait for TRS bit to be cleared
} }
// Mailbox disable // Mailbox disable
CanShadow_.CANME.all = p_CanRegs_->CANME.all; CanShadow_.CANME.all = p_CanRegs_->CANME.all;
CanShadow_.CANME.all &= ~(mboxControl); CanShadow_.CANME.all &= ~(mboxControl);
@ -217,7 +214,7 @@ void CAN::configTxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg
// Write to RTR and TPL field in control reg // Write to RTR and TPL field in control reg
p_MailBox->MSGCTRL.bit.RTR = configCtrlReg.bit.RTR; p_MailBox->MSGCTRL.bit.RTR = configCtrlReg.bit.RTR;
// p_MailBox->MSGCTRL.bit.TPL = configData.msgCtrlReg.bit.TPL; // enable if you need to set msg priority lvl p_MailBox->MSGCTRL.bit.TPL = configCtrlReg.bit.TPL;
// Mailbox enable // Mailbox enable
CanShadow_.CANME.all = p_CanRegs_->CANME.all; CanShadow_.CANME.all = p_CanRegs_->CANME.all;
@ -229,7 +226,7 @@ void CAN::configTxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg
void CAN::configRxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg& configCtrlReg){ void CAN::configRxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg& configCtrlReg){
if (boxNumber > 31) return; if (boxNumber > 31) return;
volatile MBOX* p_MailBox(NULL); volatile MBOX* p_MailBox(0);
p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber;
Uint32 mboxControl(0); Uint32 mboxControl(0);
@ -256,17 +253,13 @@ void CAN::configRxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg
// Overwrite protection // Overwrite protection
// If "ON" make sure that an additional mailbox is configured to store overflow messages. // If "ON" make sure that an additional mailbox is configured to store overflow messages.
// CanShadow_.CANOPC.all = p_CanRegs_->CANOPC.all; // CanShadow_.CANOPC.all = p_CanRegs_->CANOPC.all;
// CanShadow_.CANOPC.all |= mboxControl; // Should be one more mailbox to store 'overflow' messages // CanShadow_.CANOPC.all |= mboxControl; // Should be one more mailbox to store 'overflow' messages
// p_CanRegs_->CANOPC.all = CanShadow_.CANOPC.all; // p_CanRegs_->CANOPC.all = CanShadow_.CANOPC.all;
// Enable Mailbox // Enable Mailbox
CanShadow_.CANME.all = p_CanRegs_->CANME.all; CanShadow_.CANME.all = p_CanRegs_->CANME.all;
CanShadow_.CANME.all |= mboxControl; CanShadow_.CANME.all |= mboxControl;
p_CanRegs_->CANME.all = CanShadow_.CANME.all; p_CanRegs_->CANME.all = CanShadow_.CANME.all;
// Write to the mailbox RAM field // TODO doesn't work when rx. Check for RTR
// p_MailBox->MDL.all = 0x55555555;
// p_MailBox->MDH.all = 0x55555555;
} }

@ -47,7 +47,7 @@ void main()
PieVectTable.ECAN0INTB = &canb_isr; PieVectTable.ECAN0INTB = &canb_isr;
EDIS; EDIS;
// memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (Uint32)&RamfuncsLoadSize); // memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (Uint32)&RamfuncsLoadSize);
InitCpuTimers(); InitCpuTimers();
ConfigCpuTimer(&CpuTimer0, 150, 100000); ConfigCpuTimer(&CpuTimer0, 150, 100000);

Loading…
Cancel
Save