|
|
@ -1,10 +1,11 @@
|
|
|
|
#include "CAN.h"
|
|
|
|
#include "CAN.h"
|
|
|
|
|
|
|
|
#include "DSP2833x_ECan.h"
|
|
|
|
#include <cstddef>
|
|
|
|
#include <cstddef>
|
|
|
|
|
|
|
|
|
|
|
|
namespace canSpace {
|
|
|
|
namespace canSpace {
|
|
|
|
|
|
|
|
|
|
|
|
CAN::CAN(){
|
|
|
|
CAN::CAN(){
|
|
|
|
// todo Make it impossible to create 2 CANA/CANB objects. Give CANA/CANB as a constructor parameter
|
|
|
|
// TODO Make it impossible to create 2 CANA/CANB objects. Give CANA/CANB as a constructor parameter
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CAN::initGpio(CAN_VARIANT canVarinat){
|
|
|
|
void CAN::initGpio(CAN_VARIANT canVarinat){
|
|
|
@ -40,9 +41,7 @@ void CAN::config(CAN_VARIANT canVarinat, Uint16 baudrate){
|
|
|
|
|
|
|
|
|
|
|
|
EALLOW; // EALLOW enables access to protected bits
|
|
|
|
EALLOW; // EALLOW enables access to protected bits
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// Configure eCAN RX and TX pins for CAN operation using eCAN regs
|
|
|
|
// Configure eCAN RX and TX pins for CAN operation using eCAN regs
|
|
|
|
//
|
|
|
|
|
|
|
|
CanShadow_.CANTIOC.all = p_CanRegs_->CANTIOC.all;
|
|
|
|
CanShadow_.CANTIOC.all = p_CanRegs_->CANTIOC.all;
|
|
|
|
CanShadow_.CANTIOC.bit.TXFUNC = 1;
|
|
|
|
CanShadow_.CANTIOC.bit.TXFUNC = 1;
|
|
|
|
p_CanRegs_->CANTIOC.all = CanShadow_.CANTIOC.all;
|
|
|
|
p_CanRegs_->CANTIOC.all = CanShadow_.CANTIOC.all;
|
|
|
@ -51,15 +50,14 @@ void CAN::config(CAN_VARIANT canVarinat, Uint16 baudrate){
|
|
|
|
CanShadow_.CANRIOC.bit.RXFUNC = 1;
|
|
|
|
CanShadow_.CANRIOC.bit.RXFUNC = 1;
|
|
|
|
p_CanRegs_->CANRIOC.all = CanShadow_.CANRIOC.all;
|
|
|
|
p_CanRegs_->CANRIOC.all = CanShadow_.CANRIOC.all;
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// Configure eCAN for HECC mode - (reqd to access mailboxes 16 thru 31)
|
|
|
|
// Configure eCAN for HECC mode - (reqd to access mailboxes 16 thru 31)
|
|
|
|
// HECC mode also enables time-stamping feature
|
|
|
|
// HECC mode also enables time-stamping feature
|
|
|
|
//
|
|
|
|
|
|
|
|
CanShadow_.CANMC.all = p_CanRegs_->CANMC.all;
|
|
|
|
CanShadow_.CANMC.all = p_CanRegs_->CANMC.all;
|
|
|
|
CanShadow_.CANMC.bit.SCB = 1;
|
|
|
|
CanShadow_.CANMC.bit.SCB = 1;
|
|
|
|
p_CanRegs_->CANMC.all = CanShadow_.CANMC.all;
|
|
|
|
p_CanRegs_->CANMC.all = CanShadow_.CANMC.all;
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// Initialize all bits of 'Master Control Field' to zero
|
|
|
|
// Initialize all bits of 'Master Control Field' to zero
|
|
|
|
// Some bits of MSGCTRL register come up in an unknown state. For proper
|
|
|
|
// Some bits of MSGCTRL register come up in an unknown state. For proper
|
|
|
|
// operation, all bits (including reserved bits) of MSGCTRL must be
|
|
|
|
// operation, all bits (including reserved bits) of MSGCTRL must be
|
|
|
@ -96,10 +94,9 @@ void CAN::config(CAN_VARIANT canVarinat, Uint16 baudrate){
|
|
|
|
p_CanMBoxes_->MBOX29.MSGCTRL.all = 0x00000000;
|
|
|
|
p_CanMBoxes_->MBOX29.MSGCTRL.all = 0x00000000;
|
|
|
|
p_CanMBoxes_->MBOX30.MSGCTRL.all = 0x00000000;
|
|
|
|
p_CanMBoxes_->MBOX30.MSGCTRL.all = 0x00000000;
|
|
|
|
p_CanMBoxes_->MBOX31.MSGCTRL.all = 0x00000000;
|
|
|
|
p_CanMBoxes_->MBOX31.MSGCTRL.all = 0x00000000;
|
|
|
|
//
|
|
|
|
|
|
|
|
// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
|
|
|
|
// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
|
|
|
|
// as a matter of precaution.
|
|
|
|
// as a matter of precaution.
|
|
|
|
//
|
|
|
|
|
|
|
|
p_CanRegs_->CANTA.all = 0xFFFFFFFF; // Clear all TAn bits
|
|
|
|
p_CanRegs_->CANTA.all = 0xFFFFFFFF; // Clear all TAn bits
|
|
|
|
|
|
|
|
|
|
|
|
p_CanRegs_->CANRMP.all = 0xFFFFFFFF; // Clear all RMPn bits
|
|
|
|
p_CanRegs_->CANRMP.all = 0xFFFFFFFF; // Clear all RMPn bits
|
|
|
@ -107,9 +104,8 @@ void CAN::config(CAN_VARIANT canVarinat, Uint16 baudrate){
|
|
|
|
p_CanRegs_->CANGIF0.all = 0xFFFFFFFF; // Clear all interrupt flag bits
|
|
|
|
p_CanRegs_->CANGIF0.all = 0xFFFFFFFF; // Clear all interrupt flag bits
|
|
|
|
p_CanRegs_->CANGIF1.all = 0xFFFFFFFF;
|
|
|
|
p_CanRegs_->CANGIF1.all = 0xFFFFFFFF;
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// Configure bit timing parameters for eCANA
|
|
|
|
// Configure bit timing parameters for eCANA
|
|
|
|
//
|
|
|
|
|
|
|
|
CanShadow_.CANMC.all = p_CanRegs_->CANMC.all;
|
|
|
|
CanShadow_.CANMC.all = p_CanRegs_->CANMC.all;
|
|
|
|
CanShadow_.CANMC.bit.CCR = 1 ; // Set CCR = 1
|
|
|
|
CanShadow_.CANMC.bit.CCR = 1 ; // Set CCR = 1
|
|
|
|
p_CanRegs_->CANMC.all = CanShadow_.CANMC.all;
|
|
|
|
p_CanRegs_->CANMC.all = CanShadow_.CANMC.all;
|
|
|
@ -117,7 +113,7 @@ void CAN::config(CAN_VARIANT canVarinat, Uint16 baudrate){
|
|
|
|
do { CanShadow_.CANES.all = p_CanRegs_->CANES.all; }
|
|
|
|
do { CanShadow_.CANES.all = p_CanRegs_->CANES.all; }
|
|
|
|
while(CanShadow_.CANES.bit.CCE != 1 ); // Wait for CCE bit to be set
|
|
|
|
while(CanShadow_.CANES.bit.CCE != 1 ); // Wait for CCE bit to be set
|
|
|
|
|
|
|
|
|
|
|
|
// CanShadow_.CANMC.all = p_CanRegs_->CANMC.all; //todo удалить
|
|
|
|
// CanShadow_.CANMC.all = p_CanRegs_->CANMC.all; //TODO delete
|
|
|
|
// CanShadow_.CANMC.bit.DBO = 1 ; // Set DBO = 1
|
|
|
|
// CanShadow_.CANMC.bit.DBO = 1 ; // Set DBO = 1
|
|
|
|
// p_CanRegs_->CANMC.all = CanShadow_.CANMC.all;
|
|
|
|
// p_CanRegs_->CANMC.all = CanShadow_.CANMC.all;
|
|
|
|
|
|
|
|
|
|
|
@ -125,7 +121,6 @@ void CAN::config(CAN_VARIANT canVarinat, Uint16 baudrate){
|
|
|
|
|
|
|
|
|
|
|
|
// The following block for all 150 MHz SYSCLKOUT
|
|
|
|
// The following block for all 150 MHz SYSCLKOUT
|
|
|
|
// (75 MHz CAN clock) - default. Bit rate = 1 Mbps / 500 kbps / 250 kbps / 100 kbps
|
|
|
|
// (75 MHz CAN clock) - default. Bit rate = 1 Mbps / 500 kbps / 250 kbps / 100 kbps
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch (baudrate) {
|
|
|
|
switch (baudrate) {
|
|
|
|
case 1000:
|
|
|
|
case 1000:
|
|
|
@ -159,25 +154,19 @@ void CAN::config(CAN_VARIANT canVarinat, Uint16 baudrate){
|
|
|
|
p_CanRegs_->CANBTC.all = CanShadow_.CANBTC.all;
|
|
|
|
p_CanRegs_->CANBTC.all = CanShadow_.CANBTC.all;
|
|
|
|
|
|
|
|
|
|
|
|
CanShadow_.CANMC.all = p_CanRegs_->CANMC.all;
|
|
|
|
CanShadow_.CANMC.all = p_CanRegs_->CANMC.all;
|
|
|
|
CanShadow_.CANMC.bit.CCR = 0 ; // Set CCR = 0
|
|
|
|
CanShadow_.CANMC.bit.CCR = 0 ;
|
|
|
|
p_CanRegs_->CANMC.all = CanShadow_.CANMC.all;
|
|
|
|
p_CanRegs_->CANMC.all = CanShadow_.CANMC.all;
|
|
|
|
|
|
|
|
|
|
|
|
do { CanShadow_.CANES.all = p_CanRegs_->CANES.all; }
|
|
|
|
do { CanShadow_.CANES.all = p_CanRegs_->CANES.all; }
|
|
|
|
while(CanShadow_.CANES.bit.CCE != 0 ); // Wait for CCE bit to be cleared
|
|
|
|
while(CanShadow_.CANES.bit.CCE != 0 ); // Wait for CCE bit to be cleared
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// Disable all Mailboxes
|
|
|
|
// Disable all Mailboxes
|
|
|
|
//
|
|
|
|
|
|
|
|
p_CanRegs_->CANME.all = 0; // Required before writing the MSGIDs
|
|
|
|
p_CanRegs_->CANME.all = 0; // Required before writing the MSGIDs
|
|
|
|
|
|
|
|
|
|
|
|
CanShadow_.CANTRR.all = p_CanRegs_->CANTRR.all;
|
|
|
|
// Reset all transmittions
|
|
|
|
CanShadow_.CANTRR.bit.TRR0 = 1;
|
|
|
|
p_CanRegs_->CANTRR.all = 0xFFFFFFFF; // 0x1111_1111
|
|
|
|
p_CanRegs_->CANTRR.all = CanShadow_.CANTRR.all;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CanShadow_.CANTRS.all = p_CanRegs_->CANTRS.all;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
do {CanShadow_.CANTRS.all = p_CanRegs_->CANTRS.all;}
|
|
|
|
do {CanShadow_.CANTRS.all = p_CanRegs_->CANTRS.all;}
|
|
|
|
while(CanShadow_.CANTRS.bit.TRS0 != 0); // Wait for TRS bit to be cleared
|
|
|
|
while(CanShadow_.CANTRS.all != 0); // Wait for TRS bit to be cleared
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// Debug feature
|
|
|
|
// Debug feature
|
|
|
@ -191,54 +180,130 @@ void CAN::config(CAN_VARIANT canVarinat, Uint16 baudrate){
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CAN::configTxMBoxes(){
|
|
|
|
// void CAN::configTxMBoxes(){
|
|
|
|
|
|
|
|
|
|
|
|
// Write to the MSGID field
|
|
|
|
// // Write to the MSGID field
|
|
|
|
p_CanMBoxes_->MBOX1.MSGID.all = 0x0; // IDE-0, AME-0, AAM-0
|
|
|
|
// p_CanMBoxes_->MBOX1.MSGID.all = 0x0; // IDE-0, AME-0, AAM-0
|
|
|
|
p_CanMBoxes_->MBOX1.MSGID.bit.STDMSGID = 0xAAA;
|
|
|
|
// p_CanMBoxes_->MBOX1.MSGID.bit.STDMSGID = 0xAAA;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// p_CanMBoxes_->MBOX1.MSGCTRL.bit.DLC = 8; // Data length in bytes (0-8)
|
|
|
|
|
|
|
|
// p_CanMBoxes_->MBOX1.MSGCTRL.bit.RTR = 0; // Remote Transmission Request
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// CanShadow_.CANMD.all = p_CanRegs_->CANMD.all;
|
|
|
|
|
|
|
|
// CanShadow_.CANMD.bit.MD1 = 0; // Mailbox direction - transmit
|
|
|
|
|
|
|
|
// p_CanRegs_->CANMD.all = CanShadow_.CANMD.all;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// CanShadow_.CANME.all = p_CanRegs_->CANME.all;
|
|
|
|
|
|
|
|
// CanShadow_.CANME.bit.ME1 = 1;
|
|
|
|
|
|
|
|
// p_CanRegs_->CANME.all = CanShadow_.CANME.all;
|
|
|
|
|
|
|
|
// } // TODO delete
|
|
|
|
|
|
|
|
|
|
|
|
p_CanMBoxes_->MBOX1.MSGCTRL.bit.DLC = 8; // Data length in bytes (0-8)
|
|
|
|
void CAN::configTxMBox(Uint16 boxNumber, const ConfigMBox& configData){
|
|
|
|
p_CanMBoxes_->MBOX1.MSGCTRL.bit.RTR = 0; // Remote Transmission Request
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
volatile MBOX* p_MailBox(NULL);
|
|
|
|
|
|
|
|
p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Uint32 mboxControl(0);
|
|
|
|
|
|
|
|
mboxControl = 1ul << boxNumber;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Reset transmittion
|
|
|
|
|
|
|
|
CanShadow_.CANTRR.all = p_CanRegs_->CANTRR.all;
|
|
|
|
|
|
|
|
CanShadow_.CANTRR.all |= mboxControl;
|
|
|
|
|
|
|
|
p_CanRegs_->CANTRR.all = CanShadow_.CANTRR.all;
|
|
|
|
|
|
|
|
do {CanShadow_.CANTRS.all = p_CanRegs_->CANTRS.all;}
|
|
|
|
|
|
|
|
while((CanShadow_.CANTRS.all & mboxControl) != 0); // Wait for TRS bit to be cleared
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Mailbox disable
|
|
|
|
|
|
|
|
CanShadow_.CANME.all = p_CanRegs_->CANME.all;
|
|
|
|
|
|
|
|
CanShadow_.CANME.all &= ~(mboxControl);
|
|
|
|
|
|
|
|
p_CanRegs_->CANME.all = CanShadow_.CANME.all;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Write to the MSGID field
|
|
|
|
|
|
|
|
p_MailBox->MSGID.all = configData.msgID.all;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Mailbox direction - transmit
|
|
|
|
CanShadow_.CANMD.all = p_CanRegs_->CANMD.all;
|
|
|
|
CanShadow_.CANMD.all = p_CanRegs_->CANMD.all;
|
|
|
|
CanShadow_.CANMD.bit.MD1 = 0; // Mailbox direction - transmit
|
|
|
|
CanShadow_.CANMD.all &= ~(mboxControl);
|
|
|
|
p_CanRegs_->CANMD.all = CanShadow_.CANMD.all;
|
|
|
|
p_CanRegs_->CANMD.all = CanShadow_.CANMD.all;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Write to RTR and TPL field in control reg
|
|
|
|
|
|
|
|
p_MailBox->MSGCTRL.bit.RTR = configData.msgCtrlReg.bit.RTR;
|
|
|
|
|
|
|
|
// p_MailBox->MSGCTRL.bit.TPL = configData.msgCtrlReg.bit.TPL; // enable if you need to set msg priority lvl
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Mailbox enable
|
|
|
|
CanShadow_.CANME.all = p_CanRegs_->CANME.all;
|
|
|
|
CanShadow_.CANME.all = p_CanRegs_->CANME.all;
|
|
|
|
CanShadow_.CANME.bit.ME1 = 1;
|
|
|
|
CanShadow_.CANME.all |= mboxControl;
|
|
|
|
p_CanRegs_->CANME.all = CanShadow_.CANME.all;
|
|
|
|
p_CanRegs_->CANME.all = CanShadow_.CANME.all;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CAN::configRxMBoxes(){
|
|
|
|
// void CAN::configRxMBoxes(){ // TODO make this method with parameters
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // Write to the MSGID field
|
|
|
|
|
|
|
|
// p_CanMBoxes_->MBOX25.MSGID.all = 0x0;
|
|
|
|
|
|
|
|
// p_CanMBoxes_->MBOX25.MSGID.bit.STDMSGID = 0xAAA;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // Write to DLC field in Master Control reg
|
|
|
|
|
|
|
|
// p_CanMBoxes_->MBOX25.MSGCTRL.bit.DLC = 8;
|
|
|
|
|
|
|
|
// p_CanMBoxes_->MBOX25.MSGCTRL.bit.RTR = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// //
|
|
|
|
|
|
|
|
// // Configure Mailbox under test as a Receive mailbox
|
|
|
|
|
|
|
|
// //
|
|
|
|
|
|
|
|
// CanShadow_.CANMD.all = p_CanRegs_->CANMD.all;
|
|
|
|
|
|
|
|
// CanShadow_.CANMD.bit.MD25 = 1;
|
|
|
|
|
|
|
|
// p_CanRegs_->CANMD.all = CanShadow_.CANMD.all;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // Overwrite protection
|
|
|
|
|
|
|
|
// // CanShadow_.CANOPC.all = p_CanRegs_->CANOPC.all;
|
|
|
|
|
|
|
|
// // CanShadow_.CANOPC.bit.OPC1 = 1; // Should be one more mailbox to store 'overflow' messages
|
|
|
|
|
|
|
|
// // p_CanRegs_->CANOPC.all = CanShadow_.CANOPC.all;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // Enable Mailbox
|
|
|
|
|
|
|
|
// CanShadow_.CANME.all = p_CanRegs_->CANME.all;
|
|
|
|
|
|
|
|
// CanShadow_.CANME.bit.ME25 = 1;
|
|
|
|
|
|
|
|
// p_CanRegs_->CANME.all = CanShadow_.CANME.all;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // Write to the mailbox RAM field
|
|
|
|
|
|
|
|
// p_CanMBoxes_->MBOX25.MDL.all = 0x55555555;
|
|
|
|
|
|
|
|
// p_CanMBoxes_->MBOX25.MDH.all = 0x55555555;
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CAN::configRxMBoxes(Uint16 boxNumber, const ConfigMBox& configData){
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
volatile MBOX* p_MailBox(NULL);
|
|
|
|
|
|
|
|
p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Uint32 mboxControl(0);
|
|
|
|
|
|
|
|
mboxControl = 1ul << boxNumber;
|
|
|
|
|
|
|
|
|
|
|
|
// Write to the MSGID field
|
|
|
|
// Write to the MSGID field
|
|
|
|
p_CanMBoxes_->MBOX25.MSGID.all = 0x0;
|
|
|
|
p_MailBox->MSGID.all = 0x0;
|
|
|
|
p_CanMBoxes_->MBOX25.MSGID.bit.STDMSGID = 0xAAA;
|
|
|
|
p_MailBox->MSGID.all = configData.msgID.all;
|
|
|
|
|
|
|
|
|
|
|
|
// Write to DLC field in Master Control reg
|
|
|
|
// Write to DLC and RTR field in control reg
|
|
|
|
p_CanMBoxes_->MBOX25.MSGCTRL.bit.DLC = 8;
|
|
|
|
p_MailBox->MSGCTRL.bit.DLC = configData.msgCtrlReg.bit.DLC;
|
|
|
|
p_CanMBoxes_->MBOX25.MSGCTRL.bit.RTR = 0;
|
|
|
|
p_MailBox->MSGCTRL.bit.RTR = configData.msgCtrlReg.bit.RTR;
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// Configure Mailbox under test as a Receive mailbox
|
|
|
|
// Configure Mailbox under test as a Receive mailbox
|
|
|
|
//
|
|
|
|
|
|
|
|
CanShadow_.CANMD.all = p_CanRegs_->CANMD.all;
|
|
|
|
CanShadow_.CANMD.all = p_CanRegs_->CANMD.all;
|
|
|
|
CanShadow_.CANMD.bit.MD25 = 1;
|
|
|
|
CanShadow_.CANMD.all |= mboxControl;
|
|
|
|
p_CanRegs_->CANMD.all = CanShadow_.CANMD.all;
|
|
|
|
p_CanRegs_->CANMD.all = CanShadow_.CANMD.all;
|
|
|
|
|
|
|
|
|
|
|
|
// Overwrite protection
|
|
|
|
// 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 = p_CanRegs_->CANOPC.all;
|
|
|
|
// CanShadow_.CANOPC.bit.OPC1 = 1; // 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.bit.ME25 = 1;
|
|
|
|
CanShadow_.CANME.all |= mboxControl;
|
|
|
|
p_CanRegs_->CANME.all = CanShadow_.CANME.all;
|
|
|
|
p_CanRegs_->CANME.all = CanShadow_.CANME.all;
|
|
|
|
|
|
|
|
|
|
|
|
// Write to the mailbox RAM field
|
|
|
|
// Write to the mailbox RAM field // TODO doesn't work when rx. Check for RTR
|
|
|
|
p_CanMBoxes_->MBOX25.MDL.all = 0x55555555;
|
|
|
|
// p_MailBox->MDL.all = 0x55555555;
|
|
|
|
p_CanMBoxes_->MBOX25.MDH.all = 0x55555555;
|
|
|
|
// p_MailBox->MDH.all = 0x55555555;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} //canSpace
|
|
|
|
} //canSpace
|
|
|
|