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

📄 can2.c

📁 dsp2407的can通信程序
💻 C
字号:
/*Main.c*/ 
/*CAN发送与接收程序,波特率设置为125kbps,标准帧,ID=0x024*/
#include "LF2407regs.h" 
void SystemInit();
void Timer1Init(); 
void KickDog();  
void Can_Init();
void Can_Send();
void Can_Send1();
int numled0=200;     
unsigned char SendData[8]={0x03,0x00,0x04,0x03,0x01,0x02,0x01,0x02};
unsigned int t0=0,count=0,gen_vol=380;   
unsigned char ReceiveData,ReceiveData1;
unsigned char gen_cur=1,gen_fre=50,gen_power=120,alarm_flag=0,state_flag=1,gen_switch=1, gen_power1=100;
main()
{  

   SystemInit();              	//系统初始化
   
   *MCRA=*MCRA & 0x00FF; 	    //IOPB0-7设为IO口模式
   *PBDATDIR=0x0FF0;   	         //所有LED=0 
   *PBDATDIR=*PBDATDIR |0x000F;  //所有LED=1  
   Can_Init();                   //CAN模块初始化
   Timer1Init();          	     //定时器初始化  
   Can_Send1();
   asm(" CLRC INTM ");
   while(1);
   
}

void SystemInit() 
{  
 
	asm(" SETC	INTM ");	/* 关闭总中断 */
	asm(" CLRC  SXM  ");	/* 禁止符号位扩展 */ 
	asm(" CLRC  CNF  ");    /* B0块映射为 on-chip DARAM*/
	asm(" CLRC  OVM  ");    /* 累加器结果正常溢出*/
	*SCSR1=0x83FE;         	/* 系统时钟CLKOUT=20*2=40M */
 					   		/* 打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=40M */
	*WDCR=0x006F;			/* 禁止看门狗,看门狗时钟64分频 */ 
	KickDog();    			/* 初始化看门狗 */
	
	*PBDATDIR=0x8E00;       /* output PB7 PB3 PB2 PB1*/
    *PCDATDIR=0x3800;       /* output PC5 PC4 PC3 */
    *PEDATDIR=0x6F00;       /* output PE6 PE5 PE3 PE2 PE1 PE0 */
    *PFDATDIR=0x6000;       /* output PF6 4052A PF5 4052B */   
    
    *IFR=0xFFFF;				/* 清除中断标志 */
    *IMR=0x0003;				/* 打开中断1,2*/      
    
}  

void Timer1Init()           
{ 
    *EVAIMRA=0x0080;			//定时器1周期中断使能 
    *EVAIFRA=0xFFFF;			//清除中断标志 
    *GPTCONA=0x0000;
	*T1PER=2500;				//定时器1初值,定时0.4us*2500=1ms 			
	*T1CNT=0;
	*T1CON=0x144E;           //增模式, TPS系数40M/16=2.5M,T1使能
				
} 
  
void Can_Init()
{ 
	*MCRB|=0x00C0;           /*IOPC6,IOPC7???????*/
	*CANIFR=0xFFFF;			/* ????CAN???? */
	*CANLAM0H=0x9FFF;		/* ??LAM0 */
	*CANLAM0L=0xFFFF;		/*  */
	*CANLAM1H=0x9000;		/* ??LAM1 */
	*CANLAM1L=0x0000;		/*  */

	*CANMCR=0x1000;			/* ????????? */

	while((*CANGSR & 0x0010)!=0x0010);  /* CCE=1? */  
	
	*CANBCR2=0x0013;	        /* ???????:125Kbps,40M */
	*CANBCR1=0x0061;
    
    *CANMCR=0x0000;			/* CPU?????? */          
    
    while((*CANGSR & 0x0010)!=0x0000);	/* CCE=0? */        
	
	*CANMDER=0x0000;			/* ???? */
	*CANMCR=0x0100;			/* ??????? */
	*CANMSGCTRL0=0x18; 
	*CANMSGCTRL1=0x18;  
	*CANMSGCTRL2=0x18;
	*CANMSGID0H=0x20A0;    	         /*???,??ID=024-0x40a0,????0????*/     
	*CANMSGID1H=0x0070;
	*CANMSGID2H=0x0060;
	*CANMCR=0x0480;	     	/* ??????0x0480,???0x04c0 */
	*CANMDER=0x0045;			/* ?MessageBox0?? */
	
	*CANIMR=0x0100;			/* ??????,????,??MessageBox0???? */  
	*CANIFR=0xFFFF;			/* ????CAN???? */
} 

void Can_Send()
{	
	
	*CANMCR=0x0100;			
	
	*CANMSGID4H=0x2080;         
	*CANMSGCTRL4=0x0008;		
	*CANMBX4A=gen_vol;
	*CANMBX4B=(gen_power<<8) | gen_cur;
	*CANMBX4C=(gen_switch<<8) | gen_fre;
	*CANMBX4D=(state_flag<<8) | alarm_flag; 

	*CANMCR=0x0480;			 
	*CANMDER=*CANMDER | 0x0010; 
	 
	asm(" SETC INTM ");
	*CANTCR=0x0040;			
    while((*CANTCR & 0x4000)!=0x4000);  
    asm(" CLRC INTM ");
    *CANIFR=0xFFFF; 
    *CANTCR=0x4000;
      gen_vol++;
      gen_cur++;
      gen_power++;
      state_flag++;
      alarm_flag++;
      if(alarm_flag==4) alarm_flag=0;
      if(gen_cur>5) gen_cur=1;
      if(gen_vol>399) gen_vol=380;
      if(gen_power>200)gen_power=120;
      if(state_flag>5) state_flag=1;
      *PEDATDIR&=0xFFDF;
      *PBDATDIR&=0xFFFD;      
}

void Can_Send1()
{	
	
	*CANMCR=0x0100;			
	
	*CANMSGID5H=0x0090;         
	*CANMSGCTRL5=0x0008;		
	*CANMBX5A=gen_power1;
    *CANMBX5B=(SendData[3]<<8) | SendData[2];
    *CANMBX5C=(SendData[5]<<8) | SendData[4];
    *CANMBX5D=(SendData[7]<<8) | SendData[6]; 
    *CANMCR=0x0480;			 
	*CANMDER=*CANMDER | 0x0010; 
	asm(" SETC INTM ");
	*CANTCR=0x0040;			
    while((*CANTCR & 0x4000)!=0x4000);  
    asm(" CLRC INTM ");
    *CANIFR=0xFFFF; 
    *CANTCR=0x4000;
    gen_power1++;
    if(gen_power1>200)gen_power=100; 
    *PEDATDIR&=0xFFDF;
    *PBDATDIR&=0xFFFD;  
}

void c_int1()
{
    if(*PVIR!=0x40)         
		{  	asm(" CLRC INTM ");
			return;
		}
		
    if((*CANRCR&0x1000)>>12==1) Can_Send(); 
    
    if((*CANRCR&0x0020)>>5==1)   
     {
       ReceiveData1=*CANMBX1A & 0x00FF;
     }
    if((*CANRCR&0x0040)>>6==1)
    {
      ReceiveData=*CANMBX2A & 0x00FF;
      switch(ReceiveData)
      {
        case 1:*PEDATDIR|=0x0020;break;    /* ACB_open IOPE5 */
        case 5:*PBDATDIR|=0x0002;break;    /* ACB_close IOPB1 */
        case 2:*PEDATDIR|=0x0004;break;    /* open accelerate  IOPE2 */
        case 3:*PEDATDIR|=0x0002;break;    /* open decelerate  IOPE1 */
        case 4:*PEDATDIR&=0xFFFD;          /* close decelerate  IOPE1 */
               *PEDATDIR&=0xFFFB;break;    /* close accelerate  IOPE2 */
      } 
    }
    *CANRCR=0xFFF0;
    *CANIFR=0xFFFF;         
    *IFR=0xFFFF;
    asm(" CLRC INTM ");
    
}

void c_int2()               /*定时器1中断服务程序*/
{

    if(*PVIR!=0x27)
		{  	asm(" CLRC INTM ");
			return;
		}
	*T1CNT=0; 
	t0++;
	numled0--;
	if(numled0==0)
	{
		numled0=200;
		if((*PBDATDIR & 0x0001)==0x0001) 
			*PBDATDIR=*PBDATDIR & 0xFFFE;    	//IOPB0=0;LED灭  
		else
			*PBDATDIR=*PBDATDIR |0x0101;     	//IOPB0=1;LED亮 
	}

	if((t0%100)==0)     //定时循环SCI发送
	{
       //Can_Send1();
	}
	*EVAIFRA=0x80; 
	asm(" CLRC	INTM ");   
	
}  

void KickDog()				/*踢除看门狗 */
{
	*WDKEY=0x5555;
	*WDKEY=0xAAAA;
}

void interrupt nothing()
{
   asm(" clrc INTM");
   return;
}

⌨️ 快捷键说明

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