|  |  |  | @ -1,10 +1,11 @@ | 
		
	
		
			
				|  |  |  |  | #include "CAN.h" | 
		
	
		
			
				|  |  |  |  | #include "DSP2833x_ECan.h" | 
		
	
		
			
				|  |  |  |  | #include <cstddef> | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | namespace canSpace { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 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){ | 
		
	
	
		
			
				
					|  |  |  | @ -40,9 +41,7 @@ void CAN::config(CAN_VARIANT canVarinat, Uint16 baudrate){ | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     EALLOW;		// EALLOW enables access to protected bits
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     //
 | 
		
	
		
			
				|  |  |  |  |     // Configure eCAN RX and TX pins for CAN operation using eCAN regs
 | 
		
	
		
			
				|  |  |  |  |     //
 | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANTIOC.all = p_CanRegs_->CANTIOC.all; | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANTIOC.bit.TXFUNC = 1; | 
		
	
		
			
				|  |  |  |  |     p_CanRegs_->CANTIOC.all = CanShadow_.CANTIOC.all; | 
		
	
	
		
			
				
					|  |  |  | @ -51,15 +50,14 @@ void CAN::config(CAN_VARIANT canVarinat, Uint16 baudrate){ | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANRIOC.bit.RXFUNC = 1; | 
		
	
		
			
				|  |  |  |  |     p_CanRegs_->CANRIOC.all = CanShadow_.CANRIOC.all; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     //
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Configure eCAN for HECC mode - (reqd to access mailboxes 16 thru 31)
 | 
		
	
		
			
				|  |  |  |  |     // HECC mode also enables time-stamping feature
 | 
		
	
		
			
				|  |  |  |  |     //
 | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANMC.all = p_CanRegs_->CANMC.all; | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANMC.bit.SCB = 1; | 
		
	
		
			
				|  |  |  |  |     p_CanRegs_->CANMC.all = CanShadow_.CANMC.all; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     //
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Initialize all bits of 'Master Control Field' to zero
 | 
		
	
		
			
				|  |  |  |  |     // Some bits of MSGCTRL register come up in an unknown state. For proper 
 | 
		
	
		
			
				|  |  |  |  |     // 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_->MBOX30.MSGCTRL.all = 0x00000000; | 
		
	
		
			
				|  |  |  |  |     p_CanMBoxes_->MBOX31.MSGCTRL.all = 0x00000000; | 
		
	
		
			
				|  |  |  |  |     //
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
 | 
		
	
		
			
				|  |  |  |  |     // as a matter of precaution.
 | 
		
	
		
			
				|  |  |  |  |     //
 | 
		
	
		
			
				|  |  |  |  |     p_CanRegs_->CANTA.all	= 0xFFFFFFFF;       // Clear all TAn 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_->CANGIF1.all = 0xFFFFFFFF; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     //
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Configure bit timing parameters for eCANA
 | 
		
	
		
			
				|  |  |  |  |     //
 | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANMC.all = p_CanRegs_->CANMC.all; | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANMC.bit.CCR = 1 ;            // Set CCR = 1
 | 
		
	
		
			
				|  |  |  |  |     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; } | 
		
	
		
			
				|  |  |  |  |     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
 | 
		
	
		
			
				|  |  |  |  |     // 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 
 | 
		
	
		
			
				|  |  |  |  |     // (75 MHz CAN clock) - default. Bit rate = 1 Mbps / 500 kbps / 250 kbps / 100 kbps
 | 
		
	
		
			
				|  |  |  |  |     //
 | 
		
	
		
			
				|  |  |  |  |      | 
		
	
		
			
				|  |  |  |  |     switch (baudrate) { | 
		
	
		
			
				|  |  |  |  |         case 1000: | 
		
	
	
		
			
				
					|  |  |  | @ -159,25 +154,19 @@ void CAN::config(CAN_VARIANT canVarinat, Uint16 baudrate){ | 
		
	
		
			
				|  |  |  |  |     p_CanRegs_->CANBTC.all = CanShadow_.CANBTC.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; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     do { CanShadow_.CANES.all = p_CanRegs_->CANES.all; } | 
		
	
		
			
				|  |  |  |  |     while(CanShadow_.CANES.bit.CCE != 0 ); // Wait for CCE bit to be  cleared
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     //
 | 
		
	
		
			
				|  |  |  |  |     // Disable all Mailboxes
 | 
		
	
		
			
				|  |  |  |  |     //
 | 
		
	
		
			
				|  |  |  |  |     p_CanRegs_->CANME.all = 0;		// Required before writing the MSGIDs
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANTRR.all = p_CanRegs_->CANTRR.all; | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANTRR.bit.TRR0 = 1; | 
		
	
		
			
				|  |  |  |  |     p_CanRegs_->CANTRR.all  = CanShadow_.CANTRR.all; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANTRS.all = p_CanRegs_->CANTRS.all; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Reset all transmittions
 | 
		
	
		
			
				|  |  |  |  |     p_CanRegs_->CANTRR.all = 0xFFFFFFFF; // 0x1111_1111
 | 
		
	
		
			
				|  |  |  |  |     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
 | 
		
	
	
		
			
				
					|  |  |  | @ -191,54 +180,130 @@ void CAN::config(CAN_VARIANT canVarinat, Uint16 baudrate){ | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | void CAN::configTxMBoxes(){ | 
		
	
		
			
				|  |  |  |  | // void CAN::configTxMBoxes(){
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Write to the MSGID field
 | 
		
	
		
			
				|  |  |  |  |     p_CanMBoxes_->MBOX1.MSGID.all = 0x0;    // IDE-0, AME-0, AAM-0
 | 
		
	
		
			
				|  |  |  |  |     p_CanMBoxes_->MBOX1.MSGID.bit.STDMSGID = 0xAAA; | 
		
	
		
			
				|  |  |  |  | //     // Write to the MSGID field
 | 
		
	
		
			
				|  |  |  |  | //     p_CanMBoxes_->MBOX1.MSGID.all = 0x0;    // IDE-0, AME-0, AAM-0
 | 
		
	
		
			
				|  |  |  |  | //     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)
 | 
		
	
		
			
				|  |  |  |  |     p_CanMBoxes_->MBOX1.MSGCTRL.bit.RTR = 0;    // Remote Transmission Request
 | 
		
	
		
			
				|  |  |  |  | void CAN::configTxMBox(Uint16 boxNumber, const ConfigMBox& configData){ | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     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.bit.MD1 = 0;                      // Mailbox direction - transmit
 | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANMD.all &= ~(mboxControl); | 
		
	
		
			
				|  |  |  |  |     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.bit.ME1 = 1; | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANME.all |= mboxControl; | 
		
	
		
			
				|  |  |  |  |     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
 | 
		
	
		
			
				|  |  |  |  |     p_CanMBoxes_->MBOX25.MSGID.all = 0x0; | 
		
	
		
			
				|  |  |  |  |     p_CanMBoxes_->MBOX25.MSGID.bit.STDMSGID = 0xAAA; | 
		
	
		
			
				|  |  |  |  |     p_MailBox->MSGID.all = 0x0; | 
		
	
		
			
				|  |  |  |  |     p_MailBox->MSGID.all = configData.msgID.all; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Write to DLC field in Master Control reg
 | 
		
	
		
			
				|  |  |  |  |     p_CanMBoxes_->MBOX25.MSGCTRL.bit.DLC = 8; | 
		
	
		
			
				|  |  |  |  |     p_CanMBoxes_->MBOX25.MSGCTRL.bit.RTR = 0; | 
		
	
		
			
				|  |  |  |  |     // Write to DLC and RTR field in control reg
 | 
		
	
		
			
				|  |  |  |  |     p_MailBox->MSGCTRL.bit.DLC = configData.msgCtrlReg.bit.DLC; | 
		
	
		
			
				|  |  |  |  |     p_MailBox->MSGCTRL.bit.RTR = configData.msgCtrlReg.bit.RTR; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     //
 | 
		
	
		
			
				|  |  |  |  |     // Configure Mailbox under test as a Receive mailbox
 | 
		
	
		
			
				|  |  |  |  |     //
 | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANMD.all = p_CanRegs_->CANMD.all; | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANMD.bit.MD25 = 1; | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANMD.all |= mboxControl; | 
		
	
		
			
				|  |  |  |  |     p_CanRegs_->CANMD.all = CanShadow_.CANMD.all; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // 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.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;
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Enable Mailbox
 | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANME.all = p_CanRegs_->CANME.all; | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANME.bit.ME25 = 1; | 
		
	
		
			
				|  |  |  |  |     CanShadow_.CANME.all |= mboxControl; | 
		
	
		
			
				|  |  |  |  |     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; | 
		
	
		
			
				|  |  |  |  |     // 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;
 | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | } //canSpace
 | 
		
	
	
		
			
				
					|  |  |  | 
 |