@ -1,4 +1,3 @@
# include "CAN.h"
# include "DSP2833x_Device.h"
# include "DSP2833x_Device.h"
# include "DSP2833x_ECan.h"
# include "DSP2833x_ECan.h"
# include <cstddef>
# include <cstddef>
@ -9,12 +8,13 @@ CAN::CAN(CAN_VARIANT canVariant) :
canPort ( canVariant )
canPort ( canVariant )
{ }
{ }
void CAN : : initGpio ( ) {
void CAN : : initGpio ( ) {
if ( canPort = = CANA ) InitECanaGpio ( ) ;
if ( canPort = = CANA ) InitECanaGpio ( ) ;
else if ( canPort = = CANB ) InitECanbGpio ( ) ;
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 ) {
if ( canPort = = CANA ) {
EALLOW ;
EALLOW ;
SysCtrlRegs . PCLKCR0 . bit . ECANAENCLK = 1 ;
SysCtrlRegs . PCLKCR0 . bit . ECANAENCLK = 1 ;
@ -31,16 +31,13 @@ void CAN::config(Uint16 baudrate){ // TODO add isr disable here
}
}
else { return ; }
else { return ; }
//
// Create a shadow register structure for the CAN control registers. This // TODO add this into description
// Create a shadow register structure for the CAN control registers. This
// is needed, since only 32-bit access is allowed to these registers.
// is needed, since only 32-bit access is allowed to these registers.
// 16-bit access to these registers could potentially corrupt the register
// 16-bit access to these registers could potentially corrupt the register
// contents or return false data. This is especially true while writing
// contents or return false data. This is especially true while writing
// to/reading from a bit (or group of bits) among bits 16 - 31
// 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
// 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 ;
@ -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
// 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 ;
p_CanRegs_ - > CANRMP . all = 0xFFFFFFFF ;
p_CanRegs_ - > CANRMP . all = 0xFFFFFFFF ; // Clear all RMPn bits
p_CanRegs_ - > CANGIF0 . all = 0xFFFFFFFF ;
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 ;
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 ! = 1 ) ; // Wait for CCE bit to be set
while ( CanShadow_ . CANES . bit . CCE ! = 1 ) ;
// CanShadow_.CANMC.all = p_CanRegs_->CANMC.all; //TODO delete
// LSB - 0; MSB - 1
// CanShadow_.CANMC.bit.DBO = 1 ; // Set DBO = 1
CanShadow_ . CANMC . all = p_CanRegs_ - > CANMC . all ;
// p_CanRegs_->CANMC.all = CanShadow_.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 ;
CanShadow_ . CANBTC . all = 0 ;
// 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 :
CanShadow_ . CANBTC . bit . BRPREG = 4 ;
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
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 ;
// Disable all interrupts
p_CanRegs_ - > CANGIM . all = 0 ;
p_CanRegs_ - > CANMIM . all = 0 ;
//
//
// Debug feature
// Debug feature
// Configure the eCAN for self test mode.
// Configure the eCAN for self test mode.
//
CanShadow_ . CANMC . all = p_CanRegs_ - > CANMC . all ;
// CanShadow_.CANMC.all = p_CanRegs_->CANMC.all;
if ( flags & STM_ENABLE ) {
// CanShadow_.CANMC.bit.STM = 1; // Configure CAN for self-test mode
CanShadow_ . CANMC . bit . STM = 1 ;
// p_CanRegs_->CANMC.all = CanShadow_.CANMC.all;
}
else
{ CanShadow_ . CANMC . bit . STM = 0 ; }
p_CanRegs_ - > CANMC . all = CanShadow_ . CANMC . all ;
EDIS ;
EDIS ;
}
}
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 ;
volatile MBOX * p_MailBox ( NULL ) ;
volatile MBOX * p_MailBox ( NULL ) ;
p_MailBox = & ( p_CanMBoxes_ - > MBOX0 ) + boxNumber ;
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 ) {
void CAN : : configRxMBox ( Uint16 boxNumber , const MsgID & configID , const MsgCtrlReg & configCtrlReg ) {
if ( boxNumber > 31 ) return ;
volatile MBOX * p_MailBox ( NULL ) ;
volatile MBOX * p_MailBox ( NULL ) ;
p_MailBox = & ( p_CanMBoxes_ - > MBOX0 ) + boxNumber ;
p_MailBox = & ( p_CanMBoxes_ - > MBOX0 ) + boxNumber ;