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