Other Parts Discussed in Thread: TMS320F28335
Tool/software: TI C/C++ Compiler
/* ==============================================================================
Header files
=================================================================================*/
#include <stdlib.h>
#include "IQmathLib.h" /* Include header for IQmath library */
//#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
//#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
//#include "DSP2833x_Examples.h"
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"
// Prototype statements for functions found within this file.
void ecan1_inta_isr(void);
// Global variable for this example
struct CAN_DATA {
Uint32 data0:32;
Uint32 data1:32;
Uint32 data2:32;
Uint32 id:32;
Uint32 index:8;
};
struct MBOX can_msg1;
struct MBOX can_msg2;
struct MBOX can_msg3;
struct MBOX can_msg4;
struct MBOX can_msg5;
struct MBOX can_msg6;
struct MBOX can_msg7;
struct MBOX can_msg8;
struct MBOX can_msg9;
struct MBOX can_msg10;
struct MBOX can_msg11;
struct MBOX can_msg12;
struct MBOX can_msg13;
struct MBOX can_msg14;
struct MBOX can_msg15;
struct MBOX can_msg16;
struct CAN_DATA can_data2;
struct CAN_DATA can_data;
int16 new_data = 0;
struct ECAN_REGS ECanaShadow;
Uint32 TestMbox1 = 0;
Uint32 TestMbox2 = 0;
Uint32 TestMbox3 = 0;
//Uint32 ecan1_inta_isr;
//void ecan1_inta_isr(void);
void main(void)
{
Uint16 i,j;
Uint16 MessageReceivedCount = 0;
Uint16 ErrorCount = 0;
struct ECAN_REGS ECanaShadow;
InitSysCtrl();
//InitECanGpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
InitCpuTimers(); // For this example, only initialize the Cpu Timers
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ECANAENCLK= 1; // Enable system clk to eCAN-A
EDIS;
GpioCtrlRegs.GPAPUD.all = 0x0000; // Pullup's enabled GPIO0-GPIO31
InitECan(); // Initialize the eCAN module
CAN_Config();
while(1) // Begin transmitting
{
CANtransmit();
ECanaRegs.CANTRS.all = 0x00000001; //Set TRS for all transmit mailboxes
while(ECanaRegs.CANTA.all != 0x00000001 ) {} // Wait for all TAn bits to be set..
ECanaRegs.CANTA.all = 0x00000001; // Clear all TAn
MessageReceivedCount++;
//CAN_Receive();
//CAN_Receive1();
}
}
interrupt void ecan1_inta_isr(void) {
int j;
for (j = 16; j < 32; j++) { // Read 16 mailboxes // todo confirm if need shadow register here
if ((ECanaRegs.CANRMP.all >> j) && 0x1) { // only read the mail box which received message
mailbox_read(j); // This func reads the indicated mailbox data
ECanaShadow.CANRMP.all = ((Uint32) 1 << j);
ECanaRegs.CANRMP.all = ECanaShadow.CANRMP.all; // clear the Received-Message-Pending Register
}
}
can_data.data0 = can_msg1.MDL.word.HI_WORD;
can_data.data1 = can_msg1.MDL.word.LOW_WORD;
can_data.data2 = can_msg1.MDH.word.HI_WORD;
can_data.index = can_msg1.MDH.byte.BYTE6;
can_data.id = can_msg1.MSGID.all;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
new_data = 1;
}
void mailbox_read(int16 MBXnbr) {
volatile struct MBOX *Mailbox;
Mailbox = &ECanaMboxes.MBOX0 + MBXnbr;
can_msg1.MDL.all = Mailbox->MDL.all;
can_msg1.MDH.all = Mailbox->MDH.all;
can_msg1.MSGID.all = Mailbox->MSGID.all;
return;
}
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
//---------------------------------------------------------------------------
// eCAN External References & Function Declarations:
extern volatile struct ECAN_REGS ECanaRegs;
extern volatile struct ECAN_MBOXES ECanaMboxes;
extern volatile struct LAM_REGS ECanaLAMRegs;
extern volatile struct MOTO_REGS ECanaMOTORegs;
extern volatile struct MOTS_REGS ECanaMOTSRegs;
extern volatile struct ECAN_REGS ECanaShadow;
extern struct MBOX can_msg1;
extern struct MBOX can_msg2;
extern struct MBOX can_msg3;
extern struct MBOX can_msg4;
extern struct MBOX can_msg5;
extern struct MBOX can_msg6;
extern struct MBOX can_msg7;
extern struct MBOX can_msg8;
extern struct MBOX can_msg9;
extern struct MBOX can_msg10;
extern struct MBOX can_msg11;
extern struct MBOX can_msg12;
extern struct MBOX can_msg13;
extern struct MBOX can_msg14;
extern struct MBOX can_msg15;
extern struct MBOX can_msg16;
extern void ecan1_inta_isr(void);
void CAN_Config(void){
EALLOW;
ECanaRegs.CANTA.all = 0xFFFFFFFF; // Clear all TAn bits
ECanaRegs.CANRMP.all = 0xFFFFFFFF; // Clear all RMPn bits
ECanaRegs.CANGIF0.all = 0xFFFFFFFF; // Clear all interrupt flag bits
ECanaRegs.CANGIF1.all = 0xFFFFFFFF;
// Mailboxs can be written to 16-bits or 32-bits at a time, Write to the MSGID field of TRANSMIT mailboxes MBOX0 - 15
ECanaMboxes.MBOX0.MSGID.all = 0x81010000;
ECanaMboxes.MBOX1.MSGID.all = 0x81020000;
ECanaMboxes.MBOX2.MSGID.all = 0x81030000;
ECanaMboxes.MBOX3.MSGID.all = 0x81040000;
ECanaMboxes.MBOX4.MSGID.all = 0x81050000;
ECanaMboxes.MBOX5.MSGID.all = 0x81060000;
// Configure Mailboxes 0-15 as Tx, 16-31 as Rx // Since this write is to the entire register (instead of a bit // field) a shadow register is not required.
ECanaMboxes.MBOX16.MSGID.all = 0x12345678;
// ECanaMboxes.MBOX17.MSGID.all = 0x81020000;
// ECanaMboxes.MBOX18.MSGID.all = 0x81030000;
// ECanaMboxes.MBOX19.MSGID.all = 0x81040000;
// ECanaMboxes.MBOX20.MSGID.all = 0x81050000;
//ECanaMboxes.MBOX21.MSGID.all = 0x81060000;
ECanaRegs.CANMD.all = 0xFFFF0000;
// Enable all Mailboxes // Since this write is to the entire register (instead of a bit // field) a shadow register is not required.
//ECanaRegs.CANME.all = 0xFFFFFFFF;
ECanaRegs.CANME.all = 0xFFFF0001;
// Specify that 8 bits will be sent
ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX2.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX3.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX4.MSGCTRL.bit.DLC = 1;
ECanaMboxes.MBOX5.MSGCTRL.bit.DLC = 4;
ECanaMboxes.MBOX16.MSGCTRL.bit.DLC = 8;
// Configure the eCAN for self test mode // Enable the enhanced features of the eCAN.
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.STM = 0; // Configure CAN for self-test mode
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
/*// Get into Config Mode of CAN and config bit timing parameters for eCANA BaudRates */
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 1 ; // Set CCR = 1
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
do{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
} while(ECanaShadow.CANES.bit.CCE != 1 ); // Wait for CCE bit to be set..
ECanaShadow.CANBTC.all = 0;
#if (CPU_FRQ_150MHZ) // CPU_FRQ_150MHz is defined in DSP2833x_Examples.h /* The following block for all 150 MHz SYSCLKOUT (75 MHz CAN clock) - default. Bit rate = 1 Mbps
ECanaShadow.CANBTC.bit.BRPREG = 9; // 4 for 1Mbps, 9 for 500Kbps, 19 for 250Kbps, 39 for 125Kbps, 49 for 100Kbps
ECanaShadow.CANBTC.bit.TSEG2REG = 2;
ECanaShadow.CANBTC.bit.TSEG1REG = 10;
#endif
ECanaShadow.CANBTC.bit.SAM = 1;
ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
// Get into Normal Mode of CAN
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 0 ; // Set CCR = 0
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
do{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
} while(ECanaShadow.CANES.bit.CCE != 0 ); // Wait for CCE bit to be cleared.. CANES.4 sud be 0
GpioCtrlRegs.GPAPUD.bit.GPIO30 = 0; // Enable pullup on GPIO30
GpioCtrlRegs.GPAPUD.bit.GPIO31 = 0; // Enable pullup on GPIO31
GpioCtrlRegs.GPAQSEL2.bit.GPIO31 = 3; // Asynch input
GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 1; //GPIO30: 0=GPIO, 1=CANRXA 2=rsvd 3=rsvd
GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 1; //GPIO31: 0=GPIO, 1=CANTXA 2=rsvd 3=rsvd
EDIS;
//******************
ECanaMboxes.MBOX16.MSGID.all = 0xAAAAAAA0;
ECanaMboxes.MBOX16.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX17.MSGID.all = 0xAAAAAAA1;
ECanaMboxes.MBOX17.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX18.MSGID.all = 0xAAAAAAA2;
ECanaMboxes.MBOX18.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX19.MSGID.all = 0xAAAAAAA3;
ECanaMboxes.MBOX19.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX20.MSGID.all = 0xAAAAAAA4;
ECanaMboxes.MBOX20.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX21.MSGID.all = 0xAAAAAAA5;
ECanaMboxes.MBOX21.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX22.MSGID.all = 0xAAAAAAA6;
ECanaMboxes.MBOX22.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX23.MSGID.all = 0xAAAAAAA7;
ECanaMboxes.MBOX23.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX24.MSGID.all = 0xAAAAAAA8;
ECanaMboxes.MBOX24.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX25.MSGID.all = 0xAAAAAAA9;
ECanaMboxes.MBOX25.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX26.MSGID.all = 0xAAAAAAAA;
ECanaMboxes.MBOX27.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX26.MSGID.all = 0xAAAAAAAB;
ECanaMboxes.MBOX27.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX26.MSGID.all = 0xAAAAAAAC;
ECanaMboxes.MBOX27.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX26.MSGID.all = 0xAAAAAAAD;
ECanaMboxes.MBOX27.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX26.MSGID.all = 0xAAAAAAAE;
ECanaMboxes.MBOX27.MSGCTRL.bit.DLC =8;
ECanaMboxes.MBOX26.MSGID.all = 0xAAAAAAAF;
ECanaMboxes.MBOX27.MSGCTRL.bit.DLC =8;
//Initial for interupt for receiving event only
EALLOW;
ECanaShadow.CANMIL.all = 0xFFFF0000 ; // Interrupts asserted on eCAN1INT
//ECanaShadow.CANMIL.all = 0x00000000 ; // Interrupts asserted on eCAN0INT
ECanaRegs.CANMIL.all = ECanaShadow.CANMIL.all;
ECanaShadow.CANMIM.all = 0xFFFF0000; // Enable interrupts for all mailboxes
ECanaRegs.CANMIM.all = ECanaShadow.CANMIM.all;
ECanaShadow.CANGIM.all = 0;
ECanaShadow.CANGIM.bit.I0EN = 1; // Enable eCAN1INT or eCAN0INT
ECanaShadow.CANGIM.bit.I1EN = 1;
ECanaShadow.CANGIM.bit.GIL = 1;
ECanaRegs.CANGIM.all = ECanaShadow.CANGIM.all;
ECanaShadow.CANGIF1.all = ECanaRegs.CANGIF1.all;
ECanaShadow.CANGIF1.bit.GMIF1 = 1;
ECanaRegs.CANGIF1.all = ECanaShadow.CANGIF1.all;
PieVectTable.ECAN1INTA = &ecan1_inta_isr;
PieVectTable.ECAN0INTA = &ecan1_inta_isr;
/* Configure PIE interrupts */
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable vector fetching from PIE block
PieCtrlRegs.PIEACK.bit.ACK9 = 1; // Enables PIE to drive a pulse into the CPU
// The interrupt can be asserted in either of the eCAN interrupt lines
PieCtrlRegs.PIEIER9.bit.INTx5 = 1; // Enable INTx.5 of INT9 (eCAN0INT)
PieCtrlRegs.PIEIER9.bit.INTx6 = 1; // Enable INTx.6 of INT9 (eCAN1INT)
//PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
/* Configure system interrupts */
IER |= 0x0100; // Enable INT9 of CPU
EINT;
// ERTM; // Enable Global realtime interrupt DBGM
EDIS;
//ECanaRegs.CANGIF1.bit.MIV1
}
void CAN_Receive(void)
{
Uint32 Data1;
Uint32 Data2;
float32 AngleOffset;
Uint16 MaxRMSPhaseCurrent;
Uint16 MaxIqCommand;
Uint16 MaxPhaseCurrent;
float32 TorqueCommand;
Uint16 EnableCommand;
Uint16 DirectionBit;
Uint16 IdKi;
Uint16 IdKp;
Uint16 IqKi;
Uint16 IqKp;
Uint16 MinBattCurrentForRegenBraking;
Uint16 HysteresisRegenBraking;
Uint16 RollingCounter;
Uint16 MaxRollingCounterErrors;
Uint32 HVB_BatteryCurrent;
Uint16 HVB_ContactorClosed;
Uint16 HVB_ContactorOpenRequest;
Uint16 HVB_Fault;
can_msg1.MSGID.all = ECanaMboxes.MBOX16.MSGID.all;
can_msg2.MSGID.all = ECanaMboxes.MBOX17.MSGID.all;
can_msg3.MSGID.all = ECanaMboxes.MBOX18.MSGID.all;
can_msg4.MSGID.all = ECanaMboxes.MBOX19.MSGID.all;
can_msg5.MSGID.all = ECanaMboxes.MBOX20.MSGID.all;
can_msg6.MSGID.all = ECanaMboxes.MBOX21.MSGID.all;
can_msg7.MSGID.all = ECanaMboxes.MBOX22.MSGID.all;
can_msg8.MSGID.all = ECanaMboxes.MBOX23.MSGID.all;
can_msg9.MSGID.all = ECanaMboxes.MBOX24.MSGID.all;
can_msg10.MSGID.all = ECanaMboxes.MBOX25.MSGID.all;
can_msg11.MSGID.all = ECanaMboxes.MBOX26.MSGID.all;
can_msg12.MSGID.all = ECanaMboxes.MBOX27.MSGID.all;
can_msg13.MSGID.all = ECanaMboxes.MBOX28.MSGID.all;
can_msg14.MSGID.all = ECanaMboxes.MBOX29.MSGID.all;
can_msg15.MSGID.all = ECanaMboxes.MBOX30.MSGID.all;
can_msg16.MSGID.all = ECanaMboxes.MBOX31.MSGID.all;
can_msg1.MSGCTRL.bit.DLC = ECanaMboxes.MBOX16.MSGCTRL.bit.DLC;
can_msg2.MSGCTRL.bit.DLC = ECanaMboxes.MBOX17.MSGCTRL.bit.DLC;
can_msg3.MSGCTRL.bit.DLC = ECanaMboxes.MBOX18.MSGCTRL.bit.DLC;
can_msg4.MSGCTRL.bit.DLC = ECanaMboxes.MBOX19.MSGCTRL.bit.DLC;
can_msg5.MSGCTRL.bit.DLC = ECanaMboxes.MBOX20.MSGCTRL.bit.DLC;
can_msg6.MSGCTRL.bit.DLC = ECanaMboxes.MBOX21.MSGCTRL.bit.DLC;
can_msg7.MSGCTRL.bit.DLC = ECanaMboxes.MBOX22.MSGCTRL.bit.DLC;
can_msg8.MSGCTRL.bit.DLC = ECanaMboxes.MBOX23.MSGCTRL.bit.DLC;
can_msg9.MSGCTRL.bit.DLC = ECanaMboxes.MBOX24.MSGCTRL.bit.DLC;
can_msg10.MSGCTRL.bit.DLC = ECanaMboxes.MBOX25.MSGCTRL.bit.DLC;
can_msg11.MSGCTRL.bit.DLC = ECanaMboxes.MBOX26.MSGCTRL.bit.DLC;
can_msg12.MSGCTRL.bit.DLC = ECanaMboxes.MBOX27.MSGCTRL.bit.DLC;
can_msg13.MSGCTRL.bit.DLC = ECanaMboxes.MBOX28.MSGCTRL.bit.DLC;
can_msg14.MSGCTRL.bit.DLC = ECanaMboxes.MBOX29.MSGCTRL.bit.DLC;
can_msg15.MSGCTRL.bit.DLC = ECanaMboxes.MBOX30.MSGCTRL.bit.DLC;
can_msg16.MSGCTRL.bit.DLC = ECanaMboxes.MBOX31.MSGCTRL.bit.DLC;
Data1 = ECanaMboxes.MBOX16.MDL.all;
Data2 = ECanaMboxes.MBOX16.MDH.all;
AngleOffset = (float32)((Data1) & 0x0000FFFF)*0.01;
MaxRMSPhaseCurrent = (Uint16)((Data1) & 0xFFFF0000)>>16;
MaxIqCommand = (Uint16)((Data2) & 0x0000FFFF);
MaxPhaseCurrent = (Uint16)((Data2) & 0xFFFF0000)>>16;
can_msg1.MSGID.all = ECanaMboxes.MBOX16.MSGID.all;
Data1 = ECanaMboxes.MBOX17.MDL.all;
TorqueCommand = (float32)((Data1) & 0x0000FFFF)*0.01;
EnableCommand = (Uint16)((Data1) & 0x00010000)>>16;
DirectionBit = (Uint16)((Data1) & 0x00020000)>>17;
can_msg2.MSGID.all = ECanaMboxes.MBOX17.MSGID.all;
Data1 = ECanaMboxes.MBOX18.MDL.all;
Data2 = ECanaMboxes.MBOX18.MDH.all;
IdKi = (Uint16)((Data1) & 0x0000FFFF);
IdKp = (Uint16)((Data1) & 0xFFFF0000)>>16;
IqKi = (Uint16)((Data2) & 0x0000FFFF);
IqKp = (Uint16)((Data2) & 0xFFFF0000)>>16;
can_msg3.MSGID.all = ECanaMboxes.MBOX18.MSGID.all;
Data1 = ECanaMboxes.MBOX19.MDL.all;
MinBattCurrentForRegenBraking = (Uint16)((Data1) & 0x000000FF);
HysteresisRegenBraking = (Uint16)((Data1) & 0x0000FF00)>>8;
can_msg4.MSGID.all = ECanaMboxes.MBOX19.MSGID.all;
Data1 = ECanaMboxes.MBOX20.MDL.all;
RollingCounter = (Uint16)((Data1) & 0x000000FF);
MaxRollingCounterErrors = (Uint16)((Data1) & 0x0000FF00)>>8;
can_msg5.MSGID.all = ECanaMboxes.MBOX20.MSGID.all;
Data1 = ECanaMboxes.MBOX19.MDL.all;
Data2 = ECanaMboxes.MBOX19.MDH.all;
HVB_BatteryCurrent = (Uint32)((Data1) & 0xFFFFFFFF);
HVB_ContactorClosed = (Uint16)(Data2 & 0x00000001);
HVB_ContactorOpenRequest = (Uint16)((Data2 & 0x00000002)>>1);
HVB_Fault = (Uint16)((Data2 & 0x00000004)>>2);
//HVB_Fault = = (Uint16)(Data2 & 0x00000004)>>2);
can_msg3.MSGID.all = ECanaMboxes.MBOX19.MSGID.all;
}
void CANtransmit(void)
{
Uint32 Data1;
Uint32 Data2;
//Tx Messages
float32 IaRMS =100.123;
float32 IbRMS =100.123;
float32 IcRMS =100.123;
float32 DCLinkVoltage =650.111;
Uint16 RawPosition = 12;
Uint16 Position = 12;
float32 Thetam = 0.123456;
float32 VelocityRPM = 321.123;
float32 IqTableCommand = 123.456;
float32 IdTableCommand = 123.456;
float32 IqFeedback = 123.456;
float32 IdFeedback = 123.456;
Uint32 FaultRegA = 0;
Uint16 EventManager1 = ((Data2) & 0x0000FFFF);
Uint16 EventManager2 = ((Data2) & 0xFFFF0000)>>16;
Uint16 ResolverConfigured =1;
Uint16 Enabled =1;
Uint16 Fault =0;
float32 DCLinkCurrent = 123.456;
Uint16 InverterTemperature = 25;
Uint16 MotorTemperature = 35;
//Control Feedback1
ECanaMboxes.MBOX0.MDL.byte.BYTE0 = (Uint16)(IaRMS*125) & (0x00FF);
ECanaMboxes.MBOX0.MDL.byte.BYTE1 = ((Uint16)(IaRMS*125) & 0xFF00)>>8;
ECanaMboxes.MBOX0.MDL.byte.BYTE2 = (Uint16)(IbRMS*125) & (0x00FF);
ECanaMboxes.MBOX0.MDL.byte.BYTE3 = ((Uint16)(IbRMS*125) & 0xFF00)>>8;
ECanaMboxes.MBOX0.MDH.byte.BYTE4 = (Uint16)(IcRMS*125) & (0x00FF);
ECanaMboxes.MBOX0.MDH.byte.BYTE5 = ((Uint16)(IcRMS*125) & 0xFF00)>>8;
ECanaMboxes.MBOX0.MDH.byte.BYTE6 = ((Uint16)(DCLinkVoltage*50) & (0x00FF));
ECanaMboxes.MBOX0.MDH.byte.BYTE7 = ((Uint16)(DCLinkVoltage*50) & 0xFF00)>>8;
//Control Feedback2 Packing
ECanaMboxes.MBOX1.MDL.byte.BYTE0 = (Uint16) RawPosition & 0x00FF;
ECanaMboxes.MBOX1.MDL.byte.BYTE1 = ((Uint16)RawPosition & 0xFF00)>>8;
ECanaMboxes.MBOX1.MDL.byte.BYTE2 = (Uint16)Position & 0x00FF;
ECanaMboxes.MBOX1.MDL.byte.BYTE3 = ((Uint16)Position & 0xFF00)>>8;
ECanaMboxes.MBOX1.MDH.byte.BYTE4 = (Uint16)(Thetam*5000) & 0x00FF;
ECanaMboxes.MBOX1.MDH.byte.BYTE5 = ((Uint16)(Thetam*5000) & 0xFF00)>>8;
ECanaMboxes.MBOX1.MDH.byte.BYTE6 = (Uint16)(VelocityRPM*2.5) & 0x00FF;
ECanaMboxes.MBOX1.MDH.byte.BYTE7 = ((Uint16)(VelocityRPM*2.5) & 0xFF00)>>8;
//Control Feedback3 Packing
ECanaMboxes.MBOX2.MDL.byte.BYTE0 = ((Uint16)(IqTableCommand*33.34) & 0x00FF);
ECanaMboxes.MBOX2.MDL.byte.BYTE1 = ((Uint16)(IqTableCommand*33.34) & 0xFF00)>>8;
ECanaMboxes.MBOX2.MDL.byte.BYTE2 = ((Uint16)(IdTableCommand*33.34) & 0x00FF);
ECanaMboxes.MBOX2.MDL.byte.BYTE3 = ((Uint16)(IdTableCommand*33.34) & 0xFF00)>>8;
ECanaMboxes.MBOX2.MDH.byte.BYTE4 = ((Uint16)(IqFeedback*33.34) & 0x00FF);
ECanaMboxes.MBOX2.MDH.byte.BYTE5 = ((Uint16)(IqFeedback*33.34) & 0xFF00)>>8;
ECanaMboxes.MBOX2.MDH.byte.BYTE6 = ((Uint16)(IdFeedback*33.34) & 0x00FF);
ECanaMboxes.MBOX2.MDH.byte.BYTE7 = ((Uint16)(IdFeedback*33.34) & 0xFF00)>>8;
//Control Feedback4 Packing
ECanaMboxes.MBOX3.MDL.byte.BYTE0 = ((Uint32)IqTableCommand & 0x000000FF);
ECanaMboxes.MBOX3.MDL.byte.BYTE1 = (((Uint32)IqTableCommand & 0x0000FF00)>>8);
ECanaMboxes.MBOX3.MDL.byte.BYTE2 = (((Uint32)IqTableCommand & 0x00FF0000)>>16);
ECanaMboxes.MBOX3.MDL.byte.BYTE3 = (((Uint32)IqTableCommand & 0xFF000000)>>24);
ECanaMboxes.MBOX3.MDH.byte.BYTE4 = ((Uint16)EventManager1 & 0x00FF);
ECanaMboxes.MBOX3.MDH.byte.BYTE5 = ((Uint16)EventManager1 & 0xFF00)>>8;
ECanaMboxes.MBOX3.MDH.byte.BYTE6 = ((Uint16)EventManager2 & 0x00FF);
ECanaMboxes.MBOX3.MDH.byte.BYTE7 = ((Uint16)EventManager2 & 0xFF00)>>8;
//Control Feedback5 Packing
ECanaMboxes.MBOX4.MDL.byte.BYTE0 = ((Uint16)ResolverConfigured & 0x0001|(((Uint16)Enabled & 0x0001) <<1) | (((Uint16)Fault & 0x0001)<<2));
//Control Feedback6 Packing
ECanaMboxes.MBOX5.MDL.byte.BYTE0 = ((Uint16)(DCLinkCurrent*50) & 0x00FF);
ECanaMboxes.MBOX5.MDL.byte.BYTE1 = ((Uint16)(DCLinkCurrent*50) & 0xFF00)>>8;
ECanaMboxes.MBOX5.MDL.byte.BYTE2 = (((Uint16)InverterTemperature)>>8);
ECanaMboxes.MBOX5.MDL.byte.BYTE3 = (((Uint16)MotorTemperature)>>8);
}
void CAN_Receive1(void)
{
Uint32 Data1;
Uint32 Data2;
float32 AngleOffset;
Uint16 MaxRMSPhaseCurrent;
Uint16 MaxIqCommand;
Uint16 MaxPhaseCurrent;
float32 TorqueCommand;
Uint16 EnableCommand;
Uint16 DirectionBit;
Uint16 IdKi;
Uint16 IdKp;
Uint16 IqKi;
Uint16 IqKp;
Uint16 MinBattCurrentForRegenBraking;
Uint16 HysteresisRegenBraking;
Uint16 RollingCounter;
Uint16 MaxRollingCounterErrors;
Uint32 HVB_BatteryCurrent;
Uint16 HVB_ContactorClosed;
Uint16 HVB_ContactorOpenRequest;
Uint16 HVB_Fault;
ECanaMboxes.MBOX16.MSGID.all = 0x12345678;
ECanaMboxes.MBOX16.MSGCTRL.bit.DLC =8;
/* ECanaMboxes.MBOX16.MSGID.bit.IDE =0;
ECanaMboxes.MBOX16.MSGID.bit.AME =1;
ECanaMboxes.MBOX16.MSGID.bit.STDMSGID = 0x00000201;
*/
//ECanaMboxes.MBOX17.MSGID.all = 0x02020000;
ECanaMboxes.MBOX17.MSGID.bit.IDE =0;
ECanaMboxes.MBOX17.MSGID.bit.AME =1;
ECanaMboxes.MBOX17.MSGID.bit.STDMSGID = 0x2020;
//ECanaMboxes.MBOX18.MSGID.all = 0x02030000;
ECanaMboxes.MBOX18.MSGID.bit.IDE =0;
ECanaMboxes.MBOX18.MSGID.bit.AME =1;
ECanaMboxes.MBOX18.MSGID.bit.STDMSGID = 0x2030;
//ECanaMboxes.MBOX19.MSGID.all = 0x02040000;
ECanaMboxes.MBOX19.MSGID.bit.IDE =0;
ECanaMboxes.MBOX19.MSGID.bit.AME =1;
ECanaMboxes.MBOX19.MSGID.bit.STDMSGID = 0x2040;
//ECanaMboxes.MBOX20.MSGID.all = 0x02050000;
ECanaMboxes.MBOX20.MSGID.bit.IDE =0;
ECanaMboxes.MBOX20.MSGID.bit.AME =1;
ECanaMboxes.MBOX20.MSGID.bit.STDMSGID = 0x2050;
//ECanaMboxes.MBOX21.MSGID.all = 0x01070000;
ECanaMboxes.MBOX21.MSGID.bit.IDE =0;
ECanaMboxes.MBOX21.MSGID.bit.AME =1;
ECanaMboxes.MBOX21.MSGID.bit.STDMSGID = 0x1070;
Data1 = ECanaMboxes.MBOX16.MDL.all;
Data2 = ECanaMboxes.MBOX16.MDH.all;
AngleOffset = (float32)((Data1 & 0x0000FFFF)*0.01);
MaxRMSPhaseCurrent = (Uint16)((Data1 & 0xFFFF0000)>>16);
MaxIqCommand = (Uint16)((Data2 & 0x0000FFFF));
MaxPhaseCurrent = (Uint16)((Data2 & 0xFFFF0000)>>16);
can_msg1.MSGID.all = ECanaMboxes.MBOX16.MSGID.all;
Data1 = ECanaMboxes.MBOX17.MDL.all;
TorqueCommand = (float32)((Data1 & 0x0000FFFF)*0.01);
EnableCommand = (Uint16)((Data1 & 0x00010000)>>16);
DirectionBit = (Uint16)((Data1 & 0x00020000)>>17);
can_msg2.MSGID.all = ECanaMboxes.MBOX17.MSGID.all;
Data1 = ECanaMboxes.MBOX18.MDL.all;
Data2 = ECanaMboxes.MBOX18.MDH.all;
IdKi = (Uint16)((Data1 & 0x0000FFFF));
IdKp = (Uint16)((Data1 & 0xFFFF0000)>>16);
IqKi = (Uint16)((Data2 & 0x0000FFFF));
IqKp = (Uint16)((Data2 & 0xFFFF0000)>>16);
can_msg3.MSGID.all = ECanaMboxes.MBOX18.MSGID.all;
Data1 = ECanaMboxes.MBOX19.MDL.all;
MinBattCurrentForRegenBraking = (Uint16)((Data1 & 0x000000FF));
HysteresisRegenBraking = (Uint16)((Data1 & 0x0000FF00)>>8);
can_msg4.MSGID.all = ECanaMboxes.MBOX19.MSGID.all;
Data1 = ECanaMboxes.MBOX20.MDL.all;
RollingCounter = (Uint16)((Data1) & 0x000000FF);
MaxRollingCounterErrors = (Uint16)((Data1) & 0x0000FF00)>>8;
can_msg5.MSGID.all = ECanaMboxes.MBOX20.MSGID.all;
Data1 = ECanaMboxes.MBOX19.MDL.all;
Data2 = ECanaMboxes.MBOX19.MDH.all;
HVB_BatteryCurrent = (Uint32)((Data1) & 0xFFFFFFFF);
HVB_ContactorClosed = (Uint16)(Data2 & 0x00000001);
HVB_ContactorOpenRequest = (Uint16)((Data2 & 0x00000002)>>1);
HVB_Fault = (Uint16)((Data2 & 0x00000004)>>2);
//HVB_Fault = = (Uint16)((Data2 & 0x00000004)>>2);
can_msg3.MSGID.all = ECanaMboxes.MBOX19.MSGID.all;
}
/* ==============================================================================
Header files
=================================================================================*/
#include <stdlib.h>
#include "IQmathLib.h" /* Include header for IQmath library */
//#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
//#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
//#include "DSP2833x_Examples.h"
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"
// Prototype statements for functions found within this file.
void ecan1_inta_isr(void);
// Global variable for this example
struct CAN_DATA {
Uint32 data0:32;
Uint32 data1:32;
Uint32 data2:32;
Uint32 id:32;
Uint32 index:8;
};
struct MBOX can_msg1;
struct MBOX can_msg2;
struct MBOX can_msg3;
struct MBOX can_msg4;
struct MBOX can_msg5;
struct MBOX can_msg6;
struct MBOX can_msg7;
struct MBOX can_msg8;
struct MBOX can_msg9;
struct MBOX can_msg10;
struct MBOX can_msg11;
struct MBOX can_msg12;
struct MBOX can_msg13;
struct MBOX can_msg14;
struct MBOX can_msg15;
struct MBOX can_msg16;
struct CAN_DATA can_data2;
struct CAN_DATA can_data;
int16 new_data = 0;
struct ECAN_REGS ECanaShadow;
Uint32 TestMbox1 = 0;
Uint32 TestMbox2 = 0;
Uint32 TestMbox3 = 0;
//Uint32 ecan1_inta_isr;
//void ecan1_inta_isr(void);
void main(void)
{
Uint16 i,j;
Uint16 MessageReceivedCount = 0;
Uint16 ErrorCount = 0;
struct ECAN_REGS ECanaShadow;
InitSysCtrl();
//InitECanGpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
InitCpuTimers(); // For this example, only initialize the Cpu Timers
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ECANAENCLK= 1; // Enable system clk to eCAN-A
EDIS;
GpioCtrlRegs.GPAPUD.all = 0x0000; // Pullup's enabled GPIO0-GPIO31
InitECan(); // Initialize the eCAN module
CAN_Config();
while(1) // Begin transmitting
{
CANtransmit();
ECanaRegs.CANTRS.all = 0x00000001; //Set TRS for all transmit mailboxes
while(ECanaRegs.CANTA.all != 0x00000001 ) {} // Wait for all TAn bits to be set..
ECanaRegs.CANTA.all = 0x00000001; // Clear all TAn
MessageReceivedCount++;
//CAN_Receive();
//CAN_Receive1();
}
}
interrupt void ecan1_inta_isr(void) {
int j;
for (j = 16; j < 32; j++) { // Read 16 mailboxes // todo confirm if need shadow register here
if ((ECanaRegs.CANRMP.all >> j) && 0x1) { // only read the mail box which received message
mailbox_read(j); // This func reads the indicated mailbox data
ECanaShadow.CANRMP.all = ((Uint32) 1 << j);
ECanaRegs.CANRMP.all = ECanaShadow.CANRMP.all; // clear the Received-Message-Pending Register
}
}
can_data.data0 = can_msg1.MDL.word.HI_WORD;
can_data.data1 = can_msg1.MDL.word.LOW_WORD;
can_data.data2 = can_msg1.MDH.word.HI_WORD;
can_data.index = can_msg1.MDH.byte.BYTE6;
can_data.id = can_msg1.MSGID.all;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
new_data = 1;
}
void mailbox_read(int16 MBXnbr) {
volatile struct MBOX *Mailbox;
Mailbox = &ECanaMboxes.MBOX0 + MBXnbr;
can_msg1.MDL.all = Mailbox->MDL.all;
can_msg1.MDH.all = Mailbox->MDH.all;
can_msg1.MSGID.all = Mailbox->MSGID.all;
return;
}
I am using the TMS320F28335 for CAN messages testing of Tx Messages and Rx Messages .
I have written interrupted based ocde .I am sharing the code here.
I am not able to see the register values updated correspondingeCAN MBX .
For example I am sending the message from Can messages tool and I have not seen them in CANTx MBOX and same way I am not able to see the Rx MBOX register of specified data.
Regards,
Ram
/* ==============================================================================
Header files
=================================================================================*/
#include <stdlib.h>
#include "IQmathLib.h" /* Include header for IQmath library */
//#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
//#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
//#include "DSP2833x_Examples.h"
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"
// Prototype statements for functions found within this file.
void ecan1_inta_isr(void);
// Global variable for this example
struct CAN_DATA {
Uint32 data0:32;
Uint32 data1:32;
Uint32 data2:32;
Uint32 id:32;
Uint32 index:8;
};
struct MBOX can_msg1;
struct MBOX can_msg2;
struct MBOX can_msg3;
struct MBOX can_msg4;
struct MBOX can_msg5;
struct MBOX can_msg6;
struct MBOX can_msg7;
struct MBOX can_msg8;
struct MBOX can_msg9;
struct MBOX can_msg10;
struct MBOX can_msg11;
struct MBOX can_msg12;
struct MBOX can_msg13;
struct MBOX can_msg14;
struct MBOX can_msg15;
struct MBOX can_msg16;
struct CAN_DATA can_data2;
struct CAN_DATA can_data;
int16 new_data = 0;
struct ECAN_REGS ECanaShadow;
Uint32 TestMbox1 = 0;
Uint32 TestMbox2 = 0;
Uint32 TestMbox3 = 0;
//Uint32 ecan1_inta_isr;
//void ecan1_inta_isr(void);
void main(void)
{
Uint16 i,j;
Uint16 MessageReceivedCount = 0;
Uint16 ErrorCount = 0;
struct ECAN_REGS ECanaShadow;
InitSysCtrl();
//InitECanGpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
InitCpuTimers(); // For this example, only initialize the Cpu Timers
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ECANAENCLK= 1; // Enable system clk to eCAN-A
EDIS;
GpioCtrlRegs.GPAPUD.all = 0x0000; // Pullup's enabled GPIO0-GPIO31
InitECan(); // Initialize the eCAN module
CAN_Config();
while(1) // Begin transmitting
{
CANtransmit();
ECanaRegs.CANTRS.all = 0x00000001; //Set TRS for all transmit mailboxes
while(ECanaRegs.CANTA.all != 0x00000001 ) {} // Wait for all TAn bits to be set..
ECanaRegs.CANTA.all = 0x00000001; // Clear all TAn
MessageReceivedCount++;
//CAN_Receive();
//CAN_Receive1();
}
}
interrupt void ecan1_inta_isr(void) {
int j;
for (j = 16; j < 32; j++) { // Read 16 mailboxes // todo confirm if need shadow register here
if ((ECanaRegs.CANRMP.all >> j) && 0x1) { // only read the mail box which received message
mailbox_read(j); // This func reads the indicated mailbox data
ECanaShadow.CANRMP.all = ((Uint32) 1 << j);
ECanaRegs.CANRMP.all = ECanaShadow.CANRMP.all; // clear the Received-Message-Pending Register
}
}
can_data.data0 = can_msg1.MDL.word.HI_WORD;
can_data.data1 = can_msg1.MDL.word.LOW_WORD;
can_data.data2 = can_msg1.MDH.word.HI_WORD;
can_data.index = can_msg1.MDH.byte.BYTE6;
can_data.id = can_msg1.MSGID.all;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
new_data = 1;
}
void mailbox_read(int16 MBXnbr) {
volatile struct MBOX *Mailbox;
Mailbox = &ECanaMboxes.MBOX0 + MBXnbr;
can_msg1.MDL.all = Mailbox->MDL.all;
can_msg1.MDH.all = Mailbox->MDH.all;
can_msg1.MSGID.all = Mailbox->MSGID.all;
return;
}