@ -1,4 +1,3 @@
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				# include  "CAN.h" 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				# include  "DSP2833x_Device.h" 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				# include  "DSP2833x_ECan.h" 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				# include  <cstddef> 
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -9,12 +8,13 @@ CAN::CAN(CAN_VARIANT canVariant) :
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    canPort ( canVariant ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				{ } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				void  CAN : : initGpio ( ) { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if ( canPort  = =  CANA )  InitECanaGpio ( ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    else  if  ( canPort  = =  CANB )  InitECanbGpio ( ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				void  CAN : : config ( Uint16  baudrate ){   // TODO add isr disable here
  
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				void  CAN : : config ( Uint16  baudrate , Uint16  flags ) {  
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( canPort  = =  CANA ) { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						EALLOW ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
						SysCtrlRegs . PCLKCR0 . bit . ECANAENCLK  =  1 ; 
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -31,16 +31,13 @@ void CAN::config(Uint16 baudrate){  // TODO add isr disable here
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
					else  {  return ;  } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    //
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // Create a shadow register structure for the CAN control registers. This 
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // Create a shadow register structure for the CAN control registers. This   // TODO add this into description
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // is needed, since only 32-bit access is allowed to these registers. 
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // 16-bit access to these registers could potentially corrupt the register
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // contents or return false data. This is especially true while writing 
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // to/reading from a bit (or group of bits) among bits 16 - 31
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    //
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // struct ECAN_REGS ECanShadow;
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    EALLOW ; 		// EALLOW enables access to protected bits
  
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    EALLOW ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // Configure eCAN RX and TX pins for CAN operation using eCAN regs
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    CanShadow_ . CANTIOC . all  =  p_CanRegs_ - > CANTIOC . all ; 
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -98,31 +95,33 @@ void CAN::config(Uint16 baudrate){  // TODO add isr disable here
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // 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
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANGIF0 . all  =  0xFFFFFFFF ;      // Clear all interrupt flag bits
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANTA . all 	=  0xFFFFFFFF ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANRMP . all  =  0xFFFFFFFF ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANGIF0 . all  =  0xFFFFFFFF ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    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
  
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    CanShadow_ . CANMC . bit . CCR  =  1  ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANMC . all  =  CanShadow_ . CANMC . 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  ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // CanShadow_.CANMC.all = p_CanRegs_->CANMC.all;    //TODO delete
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // CanShadow_.CANMC.bit.DBO = 1 ;            // Set DBO = 1
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // p_CanRegs_->CANMC.all = CanShadow_.CANMC.all;
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // LSB - 0; MSB - 1
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    CanShadow_ . CANMC . all  =  p_CanRegs_ - > CANMC . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( flags  &  MSB_ENABLE ) { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        CanShadow_ . CANMC . bit . DBO  =  1 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    else 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    {  CanShadow_ . CANMC . bit . DBO  =  0 ;  } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANMC . all  =  CanShadow_ . CANMC . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    CanShadow_ . CANBTC . all  =  0 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // 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 : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            CanShadow_ . CANBTC . bit . BRPREG  =  4 ; 
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -162,21 +161,29 @@ void CAN::config(Uint16 baudrate){  // TODO add isr disable here
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    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
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANME . all  =  0 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // Disable all interrupts
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANGIM . all  =  0 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANMIM . all  =  0 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    //
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // Debug feature
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // Configure the eCAN for self test mode.
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    //
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // CanShadow_.CANMC.all = p_CanRegs_->CANMC.all;
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // CanShadow_.CANMC.bit.STM = 1;      // Configure CAN for self-test mode
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // p_CanRegs_->CANMC.all = CanShadow_.CANMC.all;
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    CanShadow_ . CANMC . all  =  p_CanRegs_ - > CANMC . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( flags  &  STM_ENABLE ) { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        CanShadow_ . CANMC . bit . STM  =  1 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    else 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    {  CanShadow_ . CANMC . bit . STM  =  0 ;  } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANMC . all  =  CanShadow_ . CANMC . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    EDIS ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				void  CAN : : configTxMBox ( Uint16  boxNumber ,  const  MsgID &  configID ,  const  MsgCtrlReg &  configCtrlReg ) { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( boxNumber  >  31 )  return ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    volatile  MBOX *  p_MailBox ( NULL ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox  =  & ( p_CanMBoxes_ - > MBOX0 )  +  boxNumber ; 
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -220,6 +227,7 @@ void CAN::configTxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				void  CAN : : configRxMBox ( Uint16  boxNumber ,  const  MsgID &  configID ,  const  MsgCtrlReg &  configCtrlReg ) { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( boxNumber  >  31 )  return ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    volatile  MBOX *  p_MailBox ( NULL ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox  =  & ( p_CanMBoxes_ - > MBOX0 )  +  boxNumber ;