📄 f2812_ecan.c
字号:
#include "F2812_ECAN.h"
extern Uint32 TgtNum;
struct ECAN_REGS ECanaShadow;
void InitECan(void)
{
asm(" EALLOW");
GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6 = 1;
GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7 = 1;
ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
ECanaShadow.CANTIOC.bit.TXFUNC = 1;
ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;
ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
ECanaShadow.CANRIOC.bit.RXFUNC = 1;
ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
asm(" EDIS");
// Disable all Mailboxes
ECanaRegs.CANME.all = 0;
//Box0为基本地址,只是发给自己对应的控制器
ECanaMboxes.MBOX0.MID.all = ((Uint32)0x00000000)<<21;//0x00200000=0x0100<<13
ECanaMboxes.MBOX1.MID.all = ((Uint32)0x00000080)<<21;//0x00200000=0x0100<<13
ECanaMboxes.MBOX2.MID.all = ((Uint32)0x00000000)<<21;//0x00200000=0x0100<<13
//接收基本控制信息
ECanaMboxes.MBOX16.MID.all = ((Uint32)0x00000000)<<21;
ECanaMboxes.MBOX17.MID.all = ((Uint32)0x00000000)<<21;
ECanaMboxes.MBOX18.MID.all = ((Uint32)0x00000000)<<21;
ECanaMboxes.MBOX19.MID.all = ((Uint32)0x00000000)<<21;
ECanaMboxes.MBOX20.MID.all = ((Uint32)0x00000080)<<21;//0x00200000=0x0100<<13
// Configure Mailboxes 0-15 as Tx, 16-31 as Rx
ECanaRegs.CANMD.all = 0xFFFF0000;
// Enable all Mailboxes
ECanaRegs.CANME.all = 0x001F0007;
// Specify that 8 bits will be sent/received
ECanaMboxes.MBOX0.MCF.bit.DLC = 8;
ECanaMboxes.MBOX1.MCF.bit.DLC = 8;
ECanaMboxes.MBOX2.MCF.bit.DLC = 8;
ECanaMboxes.MBOX16.MCF.bit.DLC =8;
ECanaMboxes.MBOX17.MCF.bit.DLC =8;
ECanaMboxes.MBOX18.MCF.bit.DLC =8;
ECanaMboxes.MBOX19.MCF.bit.DLC =8;
ECanaMboxes.MBOX20.MCF.bit.DLC =8;
// No remote frame is requested
// Since RTR bit is undefined upon reset,
// it must be initialized to the proper value
ECanaMboxes.MBOX0.MCF.bit.RTR = 0;
//定义发送邮箱的优先级别
ECanaMboxes.MBOX0.MCF.bit.TPL = 1;
ECanaMboxes.MBOX0.MDRL.all = 0x00000000;
ECanaMboxes.MBOX0.MDRH.all = 0x00000000;
ECanaMboxes.MBOX1.MCF.bit.RTR = 0;
//定义发送邮箱的优先级别
ECanaMboxes.MBOX1.MCF.bit.TPL = 2;
ECanaMboxes.MBOX1.MDRL.all = 0x00000000;
ECanaMboxes.MBOX1.MDRH.all = 0x00000000;
ECanaMboxes.MBOX2.MCF.bit.RTR = 0;
//定义发送邮箱的优先级别
ECanaMboxes.MBOX2.MCF.bit.TPL = 3;
ECanaMboxes.MBOX2.MDRL.all = 0x00000000;
ECanaMboxes.MBOX2.MDRH.all = 0x00000000;
asm(" EALLOW");
ECanaRegs.CANMIM.all = 0xFFFFFFFF;
// Request permission to change the configuration registers
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 1;
ECanaShadow.CANMC.bit.SUSP= 1;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
asm(" EDIS");
// Wait until the CPU has been granted permission to change the
// configuration registers
// Wait for CCE bit to be set..
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
} while(ECanaShadow.CANES.bit.CCE != 1 );
// Configure the eCAN timing
asm(" EALLOW");
ECanaShadow.CANBTC.all = ECanaRegs.CANBTC.all;
ECanaShadow.CANBTC.bit.BRP = 39; // (BRPREG + 1) = 40 feeds a 3.75 MHz CAN clock
ECanaShadow.CANBTC.bit.TSEG2 = 5 ; // to the CAN module. (150 / 40 = 3.75)
ECanaShadow.CANBTC.bit.TSEG1 = 7; // Bit time = 15, 3.75M/15=250K Bps
ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 0;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
asm(" EDIS");
// Wait until the CPU no longer has permission to change the
// configuration registers
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
} while(ECanaShadow.CANES.bit.CCE != 0 );
// Configure the eCAN for self test mode
// Enable the enhanced features of the eCAN.
asm(" EALLOW");
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.STM = 0; // Configure CAN for self-test mode
ECanaShadow.CANMC.bit.SCM= 1; // eCAN mode (reqd to access 32 mailboxes)
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
asm(" EDIS");
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -