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

📄 can_test.c

📁 DSP2812can总线的详细注解
💻 C
字号:

#include "DSP28_Device.h"

#define		LED1_ON		GpioDataRegs.GPFDAT.bit.GPIOF14=1  
#define		LED1_OFF	GpioDataRegs.GPFDAT.bit.GPIOF14=0

void delay();

//Global variable for this example
unsigned int Led_Flag;
Uint32 ErrorCount;
Uint32 MessageReceiveCount;


void main(void)
{	
	
   Uint16 i;   
   struct ECAN_REGS ECanaShadow;
   
   
   // 1:初始化系统时钟
   EALLOW;   
// On TMX samples, to get the best performance of on chip RAM blocks M0/M1/L0/L1/H0 internal
// control registers bit have to be enabled. The bits are in Device emulation registers.
   DevEmuRegs.M0RAMDFT = 0x0300;
   DevEmuRegs.M1RAMDFT = 0x0300;
   DevEmuRegs.L0RAMDFT = 0x0300;
   DevEmuRegs.L1RAMDFT = 0x0300;
   DevEmuRegs.H0RAMDFT = 0x0300;           
// Disable watchdog module
   SysCtrlRegs.WDCR= 0x0068;
// Initalize PLL
   SysCtrlRegs.PLLCR = 0xA;
   // Wait for PLL to lock
   for(i= 0; i< 5000; i++){}       
// HISPCP/LOSPCP prescale register settings, normally it will be set to default values
   SysCtrlRegs.HISPCP.all = 0x0001;
   SysCtrlRegs.LOSPCP.all = 0x0002;	
// Peripheral clock enables set for the selected peripherals.   

	SysCtrlRegs.PCLKCR.bit.ECANENCLK = 1;				
    EDIS;
    
    
  //2:为CAN配置使能CANTA,CANRX引脚  
  /*eCAN I/O控制寄存器*/
	EALLOW;
	ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
	ECanaShadow.CANTIOC.bit.TXFUNC = 1;
	ECanaRegs.CANTIOC.all = ECanaShadow.CANRIOC.all;
	
	ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
	ECanaShadow.CANRIOC.bit.RXFUNC = 1;
	ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
	EDIS;
	EALLOW;
	/*邮箱屏蔽使能*/
	ECanaRegs.CANMIM.all = 0x00000000;//邮箱中断屏蔽寄存器
	ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
	ECanaShadow.CANMC.bit.CCR = 1;//主控寄存器
	ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
	EDIS;
	delay();
	
	
  //3:等待复位完成
    do
	{
	ECanaShadow.CANES.all = ECanaRegs.CANES.all;
	}while(ECanaShadow.CANES.bit.CCE != 1);
  
  
  //4:配置通信波特率
	/*CAN位时间配置和通信波特率计算*/
	EALLOW;
	/*(BRPREG+1)=10 feeds a 15MHz CAN clock*/
	ECanaShadow.CANBTC.bit.BRP = 9;         //?
	/*150/10=15*/
	ECanaShadow.CANBTC.bit.TSEG2 = 5;
	ECanaShadow.CANBTC.bit.TSEG1 = 7;
	ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
	
	ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
	ECanaShadow.CANMC.bit.CCR = 0;
	ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
	EDIS;
	
	
	//5:对于标准模式在这一步设置写入接收屏蔽值  
	
	//6:设置主控制寄存器
	EALLOW;
	ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
    ECanaShadow.CANMC.bit.STM = 0;////////////////
	ECanaShadow.CANMC.bit.SCM = 1;
	ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
	EDIS;
	
	//7:初试化MSGCTRL寄存器
	EALLOW;
	ECanaMboxes.MBOX5.MCF.all=8;	
	EDIS;	
	
	//8:检验CCE,完成初试化
		do
	{
		ECanaShadow.CANES.all = ECanaRegs.CANES.all;
	}while(ECanaShadow.CANES.bit.CCE != 0);
	
	EALLOW;
	GpioMuxRegs.GPFMUX.bit.XF_GPIOF14=0;
    GpioMuxRegs.GPFDIR.bit.GPIOF14=1; 
    GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7=1;
    GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6=1;    
    EDIS;
    
    /////////////////////////////////////////////////////////////////////////
    //中断配制
       /*关中断*/	
	DINT;
	IER = 0x0000;
	IFR = 0x0000;
	/*初始化PIE中断*/
	InitPieCtrl();	
	/*初始化PIE中断矢量表*/
	InitPieVectTable();	
	#if	CAN_INT
	EALLOW;
	ECanaRegs.CANMIM.all = 0xFFFFFFFF;//邮箱中断屏蔽寄存器
	ECanaRegs.CANMIL.all = 0;         //中断级别寄存器,邮箱中断应用全局中断应用ECAN0INT
	ECanaRegs.CANGIF0.all = 0xFFFFFFFF;//中断标志寄存器//?
	ECanaRegs.CANGIM.bit.I0EN = 1;
	ECanaRegs.CANGIM.bit.I1EN = 1;
	ECanaRegs.CANGIM.all = 0x07;      //禁止了全局中断,全局中断应用ECAN1INT
	EDIS;
	PieCtrl.PIEIER9.bit.INTx6 = 1;
	PieCtrl.PIEIER9.bit.INTx5 = 1;
	#endif
	 #if CAN_INT
	/*设置中断服务程序入口地址*/
	// This is needed to write to EALLOW protected registers
	/*EALLOW;	
   	PieVectTable.ECAN0INTA = &ECAN0INTA_ISR;
   	PieVectTable.ECAN1INTA = &ECAN1INTA_ISR;
	EDIS;*/   
	// This is needed to disable write to EALLOW protected registers

	/*开中断*/   
   	IER |= M_INT9;
	#endif
	EINT;   // Enable Global interrupt INTM
	ERTM;	// Enable Global realtime interrupt DBGM
	////////////////////////////////////////////////////////////////////////
	
	
	
    ////////////////////////////////////////////////////////////
    //已经完成邮箱的初试化,以下应该根据具体情况配置接受邮箱和
    //       发送油箱                                         
    ////////////////////////////////////////////////////////////
   	
   	
   	/*初始化SCIA寄存器*/
    //InitECan();	
        
    
    ////////////////////////////////////////////////////////////
	//                        配置发送邮箱
	////////////////////////////////////////////////////////////
		
	MessageReceiveCount = 0;
	ErrorCount = 0;
	EALLOW;
	   
   //1:清除相应的TRS
     	ECanaRegs.CANTRS.all = 0;
		
		
   //2:	禁止邮箱
      ECanaRegs.CANME.bit.ME5=0;
      
   //3:对邮箱的标示赋值
      ECanaMboxes.MBOX5.MID.all = 0x9555AAA5;  //ID
      ECanaMboxes.MBOX5.MCF.bit.DLC = 8;       //数据长度
      ECanaRegs.CANMD.bit.MD5 = 0;             //设置成发送邮箱
      
   //4:使能油箱
      ECanaRegs.CANME.bit.ME5 = 1; 
      EDIS; 
      
      //发送邮箱配置完成      
   ////////////////////////////////////////////////////////////
   ////////////////////////////////////////////////////////////
   
      
      //发送数据
     //1:把数据写入RAM
        ECanaMboxes.MBOX5.MDRL.all = 0x00008888;
    	ECanaMboxes.MBOX5.MDRH.all = 0x0000000F;
	
     //2: 设置TRS	
    while(1)
	{
	
	   for(i=0;i<0x0FF;i++)
	   {
	   ECanaRegs.CANTRS.all = 0;
		
	   ECanaMboxes.MBOX5.MDRL.all = i;
	   ECanaMboxes.MBOX5.MDRH.all = i;	
      //启动发送
		ECanaRegs.CANTRS.bit.TRS5=1;

		//while(ECanaRegs.CANTA.bit.TA5==0);//等待发送中断
		//ECanaRegs.CANTA.bit.TA5=1;//复位,清除中断
						
		LED1_ON;
		delay();
		LED1_OFF;
		delay();
		MessageReceiveCount++;
		}
	
	}

} 
void delay()
{
  int m,n;
  for(m=0;m<500;m++)
  {for(n=0;n<5000;n++);}
 }

    	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -