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

📄 main.c

📁 这是一个用DSP开发板实现的CAN总线通信程序
💻 C
字号:

#include "global.c"

void Delay()
{
       unsigned int i;   
       for(i=0;i<30000;i++);
       for(i=0;i<30000;i++);
       for(i=0;i<30000;i++); 
       for(i=0;i<30000;i++);
       for(i=0;i<30000;i++);
       for(i=0;i<30000;i++);  
}

void CANInit()        
{
	MCRB|=0x00C0;           /*IOPC6,IOPC7配置为特殊功能*/
	CANIFR = 0xFFFF;			/*  清除全部CAN中断标志 */
	CANLAM0H = 0x9FFF;		/*  使用LAM0 */
	CANLAM0L = 0xFFFF;		/*  接收任何信息 */

	CANMCR = 0x1000;			/*  配置寄存器改变请求 */
	while((CANGSR & 0x0010)!=0x0010);  /* CCE=1? */	
		
	CANBCR2 = 0x0003;			/* 设置数据传输率:250Kbps */
	CANBCR1 = 0x0061;    
    
  CANMCR = 0x0000;			/* CPU正常工作请求 */          
  while((CANGSR & 0x0010)!=0x0000);	/* CCE=0? */        
	
	CANMDER = 0x0000;			/* 禁止缓冲 */
	CANMCR = 0x0100;			/* 数据场改变请求 */
	
	CANID0H = 0xC000;			/* 扩张帧,标识符屏蔽使能 */
	CANID0L = 0x0000;			/* ID, 29位 */
	CANCTRL0 = 0x0008;        /* 数据帧,8个字节 */
	
	CANMCR = 0x0480;	     	/* 正常工作请求 */
	CANMDER = 0x0021;			/* MessageBox0和MessageBox5使能 */
	
	CANIMR = 0x2100;			/* 禁止发送中断,高级使能,打开MessageBox0接收中断,5 */  
	CANIFR = 0xFFFF;			/* 清除全部CAN中断标志 */
}	

void ADCStart8()
{
    ADCTRL1=0x4000;			/* ADC模块复位 */
    asm(" NOP	");
    ADCTRL1=0x0000;         /* 启动/停止模式,双排序器工作模式 */
    MAXCONV=0x0000;			/* 最大转换通道1路 */
    CHSELSEQ3=0x0008;         /* 转换顺序,0-1-2-3 */    
     asm(" NOP	");
     asm(" NOP	");
    ADCTRL2=0x0040;
    ADCTRL2=0x0020;			/* 启动ADC转换 */
    while((ADCTRL2&0x0010)==0x0010);	/* 等待转换完成 */  
    asm(" NOP	");
    asm(" NOP	");    
    ADTEMP1=RESULT8;
    ADTEMP1=ADTEMP1/256;    										  
}
 
void EVAInit()
{
	EVAIMRA = 0x0080;			/*  定时器1周期中断使能 */
	EVAIFRA = 0xFFFF;			/*  清除中断标志 */
	GPTCONA = 0x0000;
	T1PR = 0xC350;			/*  定时器1的初值,定时50ms */
	T1CNT = 0x0000;           /*  定时器的计数初值 */
	T1CON = 0x144C;			/*  连续增计数模式 16M/16=1M*/	
}

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

void DSPInit()
{   
	asm(" SETC	INTM ");	/* 关闭总中断 */
	asm(" CLRC  SXM  ");	/* 禁止符号位扩展 */ 
	asm(" CLRC  CNF  ");    /* B0块映射为 on-chip DARAM*/
	asm(" CLRC  OVM  ");    /* 累加器结果正常溢出*/
	SCSR1 = 0x06D4;   		/* 打开ADC,EVA,CAN和SCI的时钟,系统时钟CLKOUT=16M */
	WDCR = 0x006F;			/* 禁止看门狗,看门狗时钟64分频 */ 
	KickDog();    			/* 剔出看门狗 */
    IFR = 0xFFFF;				/* 清除中断标志 */	     
    IMR = 0x0003;		    	/* 打开中断1,2 */ 

/************************************************/
    CANInit();			    /* CAN初始化 */
    EVAInit();				/* 定时器初始化*/ 
/************************************************/
    
    NLED = 0;	                /*  LED频率设初值 */
    NMOTOR = 0;	                /*  电机计数设初值 */
}

void  CANSend_MOTOR()
{
    CANMDER = 0x0000;			/* 禁止缓冲 */
	CANMCR = 0x0100;			/* 数据场改变请求 */
	
	CANID5H = 0xd798;			 //1798839f   //d79883a0 //02F041D0 //bcc41d00  //c2f31074
	CANID5L = 0x839f;
	
	CANCTRL5 = 0x0008;		/* 数据帧,发送8个字节 */ 
	
    CANBX5A = MOTOR1A;
	CANBX5B = MOTOR1B;
	CANBX5C = MOTOR1C;
	CANBX5D = MOTOR1D;

	CANMCR = 0x0480;			/* CPU正常工作请求 */ 
	CANMDER = 0x0021;			/* MessageBox5,0使能 */
		
	CANTCR = 0x0080;			/* MessageBox5发送请求*/
    while((CANTCR & 0x8000)!=0x8000);
    CANIFR = 0xFFFF;
    CANTCR = 0x8000;  
}   

/*
void MOTOR_POS()									/*电机正转*
{
	MOTOR1A = (MOTOR<<8) + 0x0001;
  	MOTOR1B = ((MOTOR>>8) & 0x00FF) + 0x0100;
}

void MOTOR_NEG()									/*电机反转*
{
	MOTOR1A = (MOTOR<<8) + 0x0041;
    MOTOR1B = ((MOTOR>>8)&0x00FF) + 0x4100;
}           
void MOTOR_POS()									/*电机正转*
{
  	MOTOR1B = MOTOR;           
    MOTOR1C = 0x0001;
}

void MOTOR_NEG()									/*电机反转*
{
    MOTOR1B = MOTOR;          
    MOTOR1C = 0x0021;
}   
	      */
main()                 
{        
/*************************/       
      DSPInit(); 
      Delay();     
/****系统运行指示灯****************************************/
      MCRC = MCRC&0x0000;                         /*IOPF3 程序运行指示 */
	  	asm(" NOP ");
      PFDATDIR = PFDATDIR|0x2000;
	  	asm(" NOP ");
	  	PFDATDIR = PFDATDIR&0xFFDF;    
/****DEBUG区****************************************/    
      asm(" CLRC INTM ");				       /* 开系统总中断 */  
      while(1)
      {
      	; 	
      }  
/****DEBUG区****************************************/
}   




void c_int2()
{
	if(PIVR!=0x27)
		{	
			asm(" CLRC INTM ");
			return;
		}	
	/**************灯1S闪烁一次***********/
		NLED++;
		if(NLED>=20)
			{
				PFDATDIR=PFDATDIR^0x0020;
				NLED = 0;
			}
	/**************************************/		
	/********添加程序*************/
	 /****************sign: 0-正转,1-反转,2-停止******************/
	/*
	if( ((PFDATDIR&0x00001)==0x0000) && ((PFDATDIR&0x00002)==0x0002) ) 
	{
	 	motorsign=1;
	}    
	else if( ((PFDATDIR&0x00001)==0x0001) && ((PFDATDIR&0x00002)==0x0000) ) 
	{
	 	motorsign=2;
	}
	else  
	{
	 	motorsign=3;
	}     
	   
	 switch(motorsign)
	 {
	 	case 1:
	 	{
	 		MOTOR1C = 0x0001;	
	 	}  
	 	break; 
	 	case 2:
	 	{
	 		MOTOR1C = 0x0021;	
	 	}  
	 	break;   
	 	case 3:
	 	{
	 		MOTOR1C = 0x0000;	
	 	}  
	 	break;
	 	default: break;
	 }      
	 /*if( (PEDATDIR&0x0010) == 0x0010 )
	 {
	 	motorsign=1;
	 }      
	 
	 if( (PADATDIR&0x0008) == 0x0008 )
	 {
	 	motorsign=2;
	 }    
	 
	  /*if( ((PEDATDIR&0x0010)==0x0000) && ((PFDATDIR&0x0008)==0x0000) )
	 {
	 	motorsign=3;
	 }*/        
          
     /*if( (PEDATDIR&0x0010) == 0x0000 )
	 {
          if( (PADATDIR&0x0008) == 0x0008 )
	 		{
	 			motorsign=1;
	 		}   
	 }  
	 else   motorsign=2;
	 
	 switch(motorsign)
	 {
	 	case 1:
	 	{
	 		MOTOR1C = 0x0001;	
	 	}  
	 	break; 
	 	case 2:
	 	{
	 		MOTOR1C = 0x0021;	
	 	} 
	 		 	
	 	break;
	 	default: break;
	 }            
	            */
	  /*
	  ADCStart8();                                // 采集车速信号
        ADh_1=ADTEMP1;  
              
        ADCStart8();                                //采集车速信号
        ADh_2=ADTEMP1;
              
        ADCStart8();                                //采集车速信号
        ADh_3=ADTEMP1;  
                          
        ADCStart8();                                //采集车速信号
        ADh_4=ADTEMP1;  
                                  
        ADh_0=(ADh_1+ADh_2+ADh_3+ADh_4)/4;  
        
     if (ADh_0 < 120)
     	NMOTOR = 1;
     else if (ADh_0 >= 120 && ADh_0 < 160)
     	 NMOTOR = 2; 
     else if (ADh_0 >= 160 && ADh_0 < 180)
     	 NMOTOR = 3;
     else if (ADh_0 >= 180 && ADh_0 <= 200)
     	 NMOTOR = 4;
     else
     	 NMOTOR = 5;
     
     switch (NMOTOR)
     {
     	case 1:
     	{
     		MOTOR1BB = 1700;      //40
     		MOTOR1CC = 0x0001;   //fan

⌨️ 快捷键说明

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