www.pudn.com > TMS320F2812_SCI.rar > 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. 
//===========================================================================