You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CCS-COMM_BOARD/Protocol/CAN.h

125 lines
3.0 KiB
C

#pragma once
#include "DSP2833x_Device.h"
#include "DSP28x_Project.h"
namespace canSpace {
enum CAN_VARIANT{
CANA,
CANB
};
// eCAN Message Control Register (MSGCTRL) bit definitions
struct MsgCtrlBits { // bits description
Uint16 DLC:4; // 0:3
Uint16 RTR:1; // 4
Uint16 rsvd1:3; // 7:5 reserved
Uint16 TPL:5; // 12:8
Uint16 rsvd2:3; // 15:13 reserved
};
union MsgCtrlReg {
Uint16 all;
struct MsgCtrlBits bit;
MsgCtrlReg(Uint16 configData = 0){
all = configData;
}
};
struct MsgID_Bits { // bits description
Uint16 EXTMSGID_L:16; // 0:15
Uint16 EXTMSGID_H:2; // 16:17
Uint16 STDMSGID:11; // 18:28
Uint16 AAM:1; // 29
Uint16 AME:1; // 30
Uint16 IDE:1; // 31
};
// Allow access to the bit fields or entire register
union MsgID {
Uint32 all;
struct MsgID_Bits bit;
MsgID(Uint32 boxID = 0xAAA, bool isExtendedID = false, bool isAAM = false, bool isAME = false) {
if(!isExtendedID){
bit.STDMSGID = boxID;
bit.EXTMSGID_H = 0;
bit.EXTMSGID_L = 0;
}
else{ all = boxID; }
bit.IDE = isExtendedID;
bit.AAM = isAAM;
bit.AME = isAME;
}
MsgID(const MsgID& init) {
all = init.all;
}
};
/* struct ConfigMsgIDReg{
Uint32 boxID;
bool isExtendedID;
bool isAAM;
bool isAME;
ConfigMsgIDReg(Uint32 initBoxID = 0xAAA, bool initIsExtendedID = false, bool initIsAAM = false, bool initIsAME = false) :
boxID(initBoxID),
isExtendedID(initIsExtendedID),
isAAM(initIsAAM),
isAME(initIsAME)
{}
}; */
/* struct ConfigMBox{
MsgID msgID;
MsgCtrlReg msgCtrlReg;
ConfigMBox(const MsgID& configMsgID, const Uint16& configMsgCtrlReg) :
// msgID(configMsgID.boxID, configMsgID.isExtendedID, configMsgID.isAAM, configMsgID.isAME),
msgID(configMsgID),
msgCtrlReg(configMsgCtrlReg)
{}
}; */
struct CANMessage {
union MsgCtrlReg msgctrl;
union CANMDL_REG mdl;
union CANMDH_REG mdh;
CANMessage(){
mdl.all = 0;
mdh.all = 0;
}
};
class CAN{
public:
CAN(CAN_VARIANT canVariant);
void initGpio();
void config(Uint16 baudrate);
// void configTxMBox(Uint16 boxNumber, const ConfigMBox& configData);
void configTxMBox(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg& configCtrlReg);
void configRxMBoxes(Uint16 boxNumber, const MsgID& configID, const MsgCtrlReg& configCtrlReg);
void transmitMsg(Uint16 boxNumber, const CANMessage& message);
bool receiveMsg(Uint16 boxNumber, CANMessage& rxMessage);
// CANMessage receiveMsg(Uint16 boxNumber);
bool isNewMessage();
bool isNewMessage(Uint16 boxNumber);
private:
2 months ago
volatile ECAN_REGS* p_CanRegs_;
ECAN_REGS CanShadow_;
volatile ECAN_MBOXES* p_CanMBoxes_;
CAN_VARIANT canPort;
};
} // canSpace