@ -34,6 +34,69 @@ void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){
}
void transmitMsg ( Uint16 boxNumber , const Uint32 & message ) {
if ( boxNumber > 31 ) return ;
Uint32 mboxControl ( 0 ) ;
mboxControl = 1ul < < boxNumber ;
volatile MBOX * p_MailBox ( 0 ) ;
p_MailBox = & ( p_CanMBoxes_ - > MBOX0 ) + boxNumber ;
p_MailBox - > MDH . all = 0x0 ;
p_MailBox - > MDL . all = 0x0 ;
p_MailBox - > MDH . all = message > > 16 ;
p_MailBox - > MDL . all = message ;
// Set TRS for mailbox
CanShadow_ . CANTRS . all = 0 ;
CanShadow_ . CANTRS . all | = mboxControl ;
p_CanRegs_ - > CANTRS . all = CanShadow_ . CANTRS . all ;
// Wait for TA bit to be set
do { CanShadow_ . CANTA . all = p_CanRegs_ - > CANTA . all ; }
while ( ( CanShadow_ . CANTA . all & mboxControl ) = = 0 ) ;
// Clear TA (transmit acknowledge bit)
CanShadow_ . CANTA . all = 0 ;
CanShadow_ . CANTA . all | = mboxControl ;
p_CanRegs_ - > CANTA . all = CanShadow_ . CANTA . all ;
}
void transmitMsg ( Uint16 boxNumber , const Uint32 & message , const Uint16 dlc ) {
if ( boxNumber > 31 ) return ;
Uint32 mboxControl ( 0 ) ;
mboxControl = 1ul < < boxNumber ;
volatile MBOX * p_MailBox ( 0 ) ;
p_MailBox = & ( p_CanMBoxes_ - > MBOX0 ) + boxNumber ;
p_MailBox - > MDH . all = 0x0 ;
p_MailBox - > MDL . all = 0x0 ;
p_MailBox - > MSGCTRL . bit . DLC = dlc ;
p_MailBox - > MDH . all = message > > 16 ;
p_MailBox - > MDL . all = message ;
// Set TRS for mailbox
CanShadow_ . CANTRS . all = 0 ;
CanShadow_ . CANTRS . all | = mboxControl ;
p_CanRegs_ - > CANTRS . all = CanShadow_ . CANTRS . all ;
// Wait for TA bit to be set
do { CanShadow_ . CANTA . all = p_CanRegs_ - > CANTA . all ; }
while ( ( CanShadow_ . CANTA . all & mboxControl ) = = 0 ) ;
// Clear TA (transmit acknowledge bit)
CanShadow_ . CANTA . all = 0 ;
CanShadow_ . CANTA . all | = mboxControl ;
p_CanRegs_ - > CANTA . all = CanShadow_ . CANTA . all ;
}
void CAN : : updateTXMessage ( Uint16 boxNumber , const CANMessage & message ) { // TODO check trs bit and set it at the end if it was here. Once the TRS bit is set for a mailbox and then data is changed in the mailbox using the CDR
// bit, the CAN module fails to transmit the new data and transmits the old data instead. To avoid this,
// reset transmission in that mailbox using the TRRn bit and set the TRSn bit again. The new data is