@ -14,7 +14,7 @@ void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){
p_MailBox - > MDH . all = 0x0 ;
p_MailBox - > MDH . all = 0x0 ;
p_MailBox - > MDL . all = 0x0 ;
p_MailBox - > MDL . all = 0x0 ;
p_MailBox - > MSGCTRL . bit . DLC = message . msgctrl. bit . DLC ;
p_MailBox - > MSGCTRL . bit . DLC = message . dataLength ;
p_MailBox - > MDH . all = message . mdh . all ;
p_MailBox - > MDH . all = message . mdh . all ;
p_MailBox - > MDL . all = message . mdl . all ;
p_MailBox - > MDL . all = message . mdl . all ;
@ -34,6 +34,69 @@ void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){
}
}
void CAN : : 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 CAN : : 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
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,
// 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
// reset transmission in that mailbox using the TRRn bit and set the TRSn bit again. The new data is
@ -46,6 +109,7 @@ void CAN::updateTXMessage(Uint16 boxNumber, const CANMessage& message){ // TODO
// Set change data request (CDR bit + MBOX number)
// Set change data request (CDR bit + MBOX number)
p_CanRegs_ - > CANMC . all | = ( 128 + boxNumber ) ;
p_CanRegs_ - > CANMC . all | = ( 128 + boxNumber ) ;
// TODO Add lenght changing?
p_MailBox - > MDL . all = message . mdl . all ;
p_MailBox - > MDL . all = message . mdl . all ;
p_MailBox - > MDH . all = message . mdh . all ;
p_MailBox - > MDH . all = message . mdh . all ;
@ -83,7 +147,7 @@ void CAN::sendRemoteRequest(Uint16 boxNumber){
}
}
bool CAN : : receiveMsg ( Uint16 boxNumber , CANMessage & rxMessage ) { // TODO faults just return -1
int16 CAN : : receiveMsg ( Uint16 boxNumber , CANMessage & rxMessage ) { // TODO faults just return -1
if ( boxNumber > 31 ) { return - 1 ; }
if ( boxNumber > 31 ) { return - 1 ; }
Uint32 mboxControl ( 0 ) ;
Uint32 mboxControl ( 0 ) ;
@ -93,11 +157,11 @@ bool CAN::receiveMsg(Uint16 boxNumber, CANMessage& rxMessage){ // TODO faults ju
p_MailBox = & ( p_CanMBoxes_ - > MBOX0 ) + boxNumber ;
p_MailBox = & ( p_CanMBoxes_ - > MBOX0 ) + boxNumber ;
bool isNewMessageInBox = p_CanRegs_ - > CANRMP . all & mboxControl ;
bool isNewMessageInBox = p_CanRegs_ - > CANRMP . all & mboxControl ;
if ( ! isNewMessageInBox ) return - 1 ;
if ( ! isNewMessageInBox ) return - 2 ;
p_CanRegs_ - > CANRMP . all & = mboxControl ;
p_CanRegs_ - > CANRMP . all & = mboxControl ;
rxMessage . msgctrl. all = p_MailBox - > MSGCTRL . all ;
rxMessage . dataLength = p_MailBox - > MSGCTRL . all ;
rxMessage . mdl . all = p_MailBox - > MDL . all ;
rxMessage . mdl . all = p_MailBox - > MDL . all ;
rxMessage . mdh . all = p_MailBox - > MDH . all ;
rxMessage . mdh . all = p_MailBox - > MDH . all ;
@ -108,7 +172,7 @@ bool CAN::receiveMsg(Uint16 boxNumber, CANMessage& rxMessage){ // TODO faults ju
lostMessage = p_CanRegs_ - > CANRML . all & mboxControl ;
lostMessage = p_CanRegs_ - > CANRML . all & mboxControl ;
if ( newMessage | | lostMessage ) {
if ( newMessage | | lostMessage ) {
return - 1 ;
return - 3 ;
}
}
return 0 ;
return 0 ;