#include "CAN.h" #include "DSP2833x_Device.h" #include "DSP2833x_ECan.h" namespace canSpace { void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& 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->MSGCTRL.bit.DLC = message.dataLength; p_MailBox->MDH.all = message.mdh.all; p_MailBox->MDL.all = message.mdl.all; // 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 Uint64& 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 >> 32; 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 Uint64& 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 >> 32; 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 // then transmitted. if (boxNumber > 31) return; volatile MBOX* p_MailBox(0); p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; // Set change data request (CDR bit + MBOX number) p_CanRegs_->CANMC.all |= (128 + boxNumber); // TODO Add lenght changing? p_MailBox->MDL.all = message.mdl.all; p_MailBox->MDH.all = message.mdh.all; CanShadow_.CANMC.all = p_CanRegs_->CANMC.all; CanShadow_.CANMC.bit.CDR = 0; p_CanRegs_->CANMC.all = CanShadow_.CANMC.all; } void CAN::updateTXMessage(Uint16 boxNumber, const Uint64& 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 // then transmitted. if (boxNumber > 31) return; volatile MBOX* p_MailBox(0); p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; // Set change data request (CDR bit + MBOX number) p_CanRegs_->CANMC.all |= (128 + boxNumber); // TODO Add lenght changing? p_MailBox->MDL.all = message; p_MailBox->MDH.all = message >> 32; CanShadow_.CANMC.all = p_CanRegs_->CANMC.all; CanShadow_.CANMC.bit.CDR = 0; p_CanRegs_->CANMC.all = CanShadow_.CANMC.all; } void CAN::sendRemoteRequest(Uint16 boxNumber){ if (boxNumber > 31) return; volatile MBOX* p_MailBox(0); p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; Uint32 mboxControl(0); mboxControl = 1ul << boxNumber; // Mailbox disable CanShadow_.CANME.all = p_CanRegs_->CANME.all; CanShadow_.CANME.all &= ~(mboxControl); p_CanRegs_->CANME.all = CanShadow_.CANME.all; p_MailBox->MSGCTRL.bit.RTR = 1; // Mailbox enable CanShadow_.CANME.all = p_CanRegs_->CANME.all; CanShadow_.CANME.all |= mboxControl; p_CanRegs_->CANME.all = CanShadow_.CANME.all; // Set TRS for mailbox CanShadow_.CANTRS.all = 0; CanShadow_.CANTRS.all |= mboxControl; p_CanRegs_->CANTRS.all = CanShadow_.CANTRS.all; } int16 CAN::receiveMsg(Uint16 boxNumber, CANMessage& rxMessage){ // TODO faults just return -1 if (boxNumber > 31) { return -1; } Uint32 mboxControl(0); mboxControl = 1ul << boxNumber; volatile MBOX* p_MailBox(0); p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; bool isNewMessageInBox = p_CanRegs_->CANRMP.all & mboxControl; if(!isNewMessageInBox) return -2; p_CanRegs_->CANRMP.all &= mboxControl; rxMessage.dataLength = p_MailBox->MSGCTRL.all; rxMessage.mdl.all = p_MailBox->MDL.all; rxMessage.mdh.all = p_MailBox->MDH.all; bool newMessage; bool lostMessage; newMessage = p_CanRegs_->CANRMP.all & mboxControl; lostMessage = p_CanRegs_->CANRML.all & mboxControl; if(newMessage || lostMessage) { return -3; } return 0; } int16 CAN::receiveMsg(Uint16 boxNumber, Uint64& rxMessage){ // TODO faults just return -1 if (boxNumber > 31) { return -1; } Uint32 mboxControl(0); mboxControl = 1ul << boxNumber; volatile MBOX* p_MailBox(0); p_MailBox = &(p_CanMBoxes_->MBOX0) + boxNumber; bool isNewMessageInBox = p_CanRegs_->CANRMP.all & mboxControl; if(!isNewMessageInBox) return -2; p_CanRegs_->CANRMP.all &= mboxControl; rxMessage = p_MailBox->MDH.all; rxMessage = rxMessage << 32; rxMessage = p_MailBox->MDL.all; bool newMessage; bool lostMessage; newMessage = p_CanRegs_->CANRMP.all & mboxControl; lostMessage = p_CanRegs_->CANRML.all & mboxControl; if(newMessage || lostMessage) { return -3; } return 0; } bool CAN::isNewMessage(){ return static_cast(p_CanRegs_->CANRMP.all); } bool CAN::isNewMessage(Uint16 boxNumber){ if (boxNumber > 31) { return 0; } Uint32 mboxControl(0); mboxControl = 1ul << boxNumber; bool isNewMessageInBox = p_CanRegs_->CANRMP.all & mboxControl; return isNewMessageInBox; } void CAN::resetTimeStampCounter(){ EALLOW; ECanbRegs.CANTSC = 0; EDIS; } void CAN::setTimeOutValue(Uint16 boxNumber, Uint32 canBitsNumber){ if (boxNumber > 31) { return; } volatile Uint32* p_MailBox(0); p_MailBox = &(p_CanMotoRegs_->MOTO0) + boxNumber; *p_MailBox = canBitsNumber; } bool CAN::isTimeOut(Uint16 boxNumber){ bool mBOXTimeOut = false; mBOXTimeOut = p_CanRegs_->CANTOS.all & (1ul << boxNumber); return mBOXTimeOut; } void CAN::clearTimeOutFlag(Uint16 boxNumber){ Uint32 clearFlag = 0; clearFlag = 1ul << boxNumber; p_CanRegs_->CANTOS.all = clearFlag; } } // canSpace