#include\// DSP2833x Headerfile Include File #include\// DSP2833x Examples Include File
// Prototype statements for functions found within this file. voidmailbox_check(int32 T1, int32 T2, int32 T3); voidmailbox_read(int16i);
// Global variable for this example Uint32ErrorCount; Uint32PassCount;
Uint32MessageReceivedCount;
Uint32 TestMbox1 = 0; Uint32 TestMbox2 = 0; Uint32 TestMbox3 = 0;
voidmain(void) {
Uint16 j;
// eCAN控制寄存器需要使用32位的读/写访问。因此,为此示例创建一组影子寄存器。这些影子寄存器将用于确保访问是32位而不是16位。 struct ECAN_REGS ECanbShadow;
// 步骤1.初始化系统控制:PLL,看门狗,启用外设时钟。该示例功能可在DSP2833x_SysCtrl.c文件中找到。 InitSysCtrl();
// 步骤2.初始化GPIO:在DSP2833x Gpio.c文件中找到该示例函数,并说明如何将GPIO设置为默认状态。
// InitGpio(); // Skipped for this example
// 在这个例子中,使用GPIO寄存器在这里配置CAN引脚。这个函数在DSP2833x_ECan.c中找到 InitECanGpio();
// 步骤3。清除所有中断并初始化PIE矢量表:禁用CPU中断 DINT;
// 将PIE控制寄存器初始化为默认状态。默认状态是禁止所有的PIE中断并清除标志。这个函数可以在DSP2833x_PieCtrl.c文件中找到。 InitPieCtrl();
// 禁用CPU中断并清除所有CPU中断标志: IER = 0x0000; IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes. // The shell ISR routines are found in DSP2833x_DefaultIsr.c. // This function is found in DSP2833x_PieVect.c. InitPieVectTable();
// 步骤4.初始化所有器件外设:此功能可在DSP2833x_InitPeripherals.c中找到. // InitPeripherals(); // Not required for this example
// 第5步。用户特定的代码,启用中断:
MessageReceivedCount = 0; ErrorCount = 0; PassCount = 0;
// eCAN控制寄存器需要32位访问。如果要写入单个位,编译器可能会将此访问分解为16位访问。此处介绍的一种解决方案是使用影子寄存器来强制32位访问。
// 将整个寄存器读入一个影子寄存器。这个访问将是32位。更改所需的位并将其值复制到32位写入的eCAN寄存器。
// 为eCAN传输配置eCAN RX和TX引脚 EALLOW;
ECanbShadow.CANTIOC.all = ECanbRegs.CANTIOC.all; //eCAN I/O控制寄存器 ECanbShadow.CANTIOC.bit.TXFUNC = 1; //CANTX引脚用于CAN发送功能 ECanbRegs.CANTIOC.all = ECanbShadow.CANTIOC.all;
ECanbShadow.CANRIOC.all = ECanbRegs.CANRIOC.all; //eCAN I/O控制寄存器 ECanbShadow.CANRIOC.bit.RXFUNC = 1; //CANRX引脚用于CAN发送功能 ECanbRegs.CANRIOC.all = ECanbShadow.CANRIOC.all; EDIS;
//禁用所有的邮箱。
//因为写入整个寄存器(而不是一个位域),影子寄存器是不需要的。 ECanbRegs.CANME.all = 0; //邮箱激活寄存器:激活或者屏蔽独立的邮箱
//邮箱可以一次写入16位或32位。写入TRANSMIT邮箱的MSGID字段MBOX0-15。 ECanbMboxes.MBOX0.MSGID.all = 0x9555AAA0; //邮箱标识符寄存器 ECanbMboxes.MBOX1.MSGID.all = 0x9555AAA1; ECanbMboxes.MBOX2.MSGID.all = 0x9555AAA2; ECanbMboxes.MBOX3.MSGID.all = 0x9555AAA3; ECanbMboxes.MBOX4.MSGID.all = 0x9555AAA4; ECanbMboxes.MBOX5.MSGID.all = 0x9555AAA5; ECanbMboxes.MBOX6.MSGID.all = 0x9555AAA6; ECanbMboxes.MBOX7.MSGID.all = 0x9555AAA7; ECanbMboxes.MBOX8.MSGID.all = 0x9555AAA8;
ECanbMboxes.MBOX9.MSGID.all = 0x9555AAA9; ECanbMboxes.MBOX10.MSGID.all = 0x9555AAAA; ECanbMboxes.MBOX11.MSGID.all = 0x9555AAAB; ECanbMboxes.MBOX12.MSGID.all = 0x9555AAAC; ECanbMboxes.MBOX13.MSGID.all = 0x9555AAAD; ECanbMboxes.MBOX14.MSGID.all = 0x9555AAAE; ECanbMboxes.MBOX15.MSGID.all = 0x9555AAAF;
// 写入RECEIVE邮箱的MSGID字段MBOX16-31
ECanbMboxes.MBOX16.MSGID.all = 0x9555AAA0; ECanbMboxes.MBOX17.MSGID.all = 0x9555AAA1; ECanbMboxes.MBOX18.MSGID.all = 0x9555AAA2; ECanbMboxes.MBOX19.MSGID.all = 0x9555AAA3; ECanbMboxes.MBOX20.MSGID.all = 0x9555AAA4; ECanbMboxes.MBOX21.MSGID.all = 0x9555AAA5; ECanbMboxes.MBOX22.MSGID.all = 0x9555AAA6; ECanbMboxes.MBOX23.MSGID.all = 0x9555AAA7; ECanbMboxes.MBOX24.MSGID.all = 0x9555AAA8; ECanbMboxes.MBOX25.MSGID.all = 0x9555AAA9; ECanbMboxes.MBOX26.MSGID.all = 0x9555AAAA; ECanbMboxes.MBOX27.MSGID.all = 0x9555AAAB; ECanbMboxes.MBOX28.MSGID.all = 0x9555AAAC; ECanbMboxes.MBOX29.MSGID.all = 0x9555AAAD; ECanbMboxes.MBOX30.MSGID.all = 0x9555AAAE; ECanbMboxes.MBOX31.MSGID.all = 0x9555AAAF;
// 将邮箱0-15配置为Tx,将16-31配置为Rx
// 由于这是写入整个寄存器(而不是位字段),所以不需要影子寄存器。 ECanbRegs.CANMD.all = 0xFFFF0000; //邮箱方向寄存器
// 启用所有邮箱
// 由于这是写入整个寄存器(而不是位字段),所以不需要影子寄存器。 ECanbRegs.CANME.all = 0xFFFFFFFF;
// 指定8位将被发送/接收
ECanbMboxes.MBOX0.MSGCTRL.bit.DLC = 8; //消息控制寄存器,DLC位中的数字决定了
被发送或接受的字节数,合适的范围是0-8.
ECanbMboxes.MBOX1.MSGCTRL.bit.DLC = 8; ECanbMboxes.MBOX2.MSGCTRL.bit.DLC = 8; ECanbMboxes.MBOX3.MSGCTRL.bit.DLC = 8; ECanbMboxes.MBOX4.MSGCTRL.bit.DLC = 8; ECanbMboxes.MBOX5.MSGCTRL.bit.DLC = 8; ECanbMboxes.MBOX6.MSGCTRL.bit.DLC = 8; ECanbMboxes.MBOX7.MSGCTRL.bit.DLC = 8; ECanbMboxes.MBOX8.MSGCTRL.bit.DLC = 8; ECanbMboxes.MBOX9.MSGCTRL.bit.DLC = 8; ECanbMboxes.MBOX10.MSGCTRL.bit.DLC = 8; ECanbMboxes.MBOX11.MSGCTRL.bit.DLC = 8; ECanbMboxes.MBOX12.MSGCTRL.bit.DLC = 8; ECanbMboxes.MBOX13.MSGCTRL.bit.DLC = 8;