⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f2812_ecan.c

📁 TMS320F2812串行口通信程序-采用循环缓冲区方式
💻 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 + -