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

📄 main.c

📁 dsp2407片内10位ADC采集系统,通过片内CAN外设发送到CAN总线,测试程序经过10万帧严格测试,非常好用.
💻 C
字号:
/*Main.c*/ 
/*CAN发送与接收程序,波特率设置为125kbps,标准帧,ID=0x024*/
#include "global.c" 
void SystemInit();
void Timer1Init(); 
void KickDog();  
void Can_Init();
void Can_Send();
void AD_Sample(); 
int numled0=200;   
unsigned int t0=0;   
unsigned char SendData[8]={0x56,0x44,0x53,0x54,0x55,0x76,0x47,0x48};
unsigned char ReceiveData[8];
unsigned int RESULT_0=0,RESULT_8=0;  
unsigned int AD0[256],AD8[256],AD_0,AD_8,AD_FLAG=0;
main()
{  
   int i=0;
   int jj=0;
   
   SystemInit();         	//系统初始化
   
   MCRA=MCRA & 0xC0FF; 	    //IOPB0-6设为IO口模式
   PBDATDIR=0xFF04;   	    //所有LED=0 
//   PBDATDIR=PBDATDIR |0x003D;  //所有LED=1  
   Can_Init();              //CAN模块初始化
   Timer1Init();          	//定时器初始化
   asm(" CLRC INTM ");
   while(1)
   {
   jj=0;
     if(AD_FLAG==1)                
      { 
        	AD_FLAG=0;
 
     	 AD_Sample();   
      	 AD0[i]=RESULT_0;
      	 AD8[i]=RESULT_8;
//      	 i++;
//      	 if(i==256)
 //     	 {
      	 i=0;
         Can_Send();
//         PBDATDIR&=0xFF00;
//         jj=0;
//         }
        
         jj=0;
      }
    }
   
}
//----------------------------------------------
void SystemInit() 
{  
 
	asm(" SETC	INTM ");	/* 关闭总中断 */
	asm(" CLRC  SXM  ");	/* 禁止符号位扩展 */ 
	asm(" CLRC  CNF  ");    /* B0块映射为 on-chip DARAM*/
	asm(" CLRC  OVM  ");    /* 累加器结果正常溢出*/
	SCSR1=0x81FE;         	/* 系统时钟CLKOUT=20*2=40M SCSR1=0x83FE; */
 					   		/* 打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=40M */
	WDCR=0x006F;			/* 禁止看门狗,看门狗时钟64分频 */ 
	KickDog();    			/* 初始化看门狗 */  
    IFR=0xFFFF;				/* 清除中断标志 */
    IMR=0x0003;				/* 打开中断1,2*/      
    
}  
//----------------------------------------------
void Timer1Init()           
{ 
    EVAIMRA=0x0080;			//定时器1周期中断使能 
    EVAIFRA=0xFFFF;			//清除中断标志 
    GPTCONA=0x0000;
	T1PR=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;		/* 接收任何信息 */

	CANMCR=0x1000;			/* 配置寄存器改变请求 */

	while((CANGSR & 0x0010)!=0x0010);  /* CCE=1? */  
	
	CANBCR2=0x0013;	        /* 设置数据传输率:125Kbps,40M */
//	CANBCR2=0x0007;			/* 设置数据传输率:125Kbps,16M */
//	CANBCR2=0x000F;			/* 设置数据传输率:125Kbps ,32M*/
	CANBCR1=0x0061;
    
    CANMCR=0x0000;			/* CPU正常工作请求 */          
    
    while((CANGSR & 0x0010)!=0x0000);	/* CCE=0? */        
	
	CANMDER=0x0000;			/* 禁止缓冲 */
	CANMCR=0x0100;			/* 数据场改变请求 */   
	
	CANID0H=0x00f0;          /*标准帧,设置ID=024-0x40a0,用于邮箱0接收信息*/
	CANMCR=0x0480;	     	/* 正常工作请求0x0480,自测试0x04c0 */
	CANMDER=0x0001;			/* 和MessageBox0使能 */
	
	CANIMR=0x0100;			/* 禁止发送中断,高级使能,打开MessageBox0接收中断 */  
	CANIFR=0xFFFF;			/* 清除全部CAN中断标志 */

} 
//------------------------------------------

void Can_Send()
{	
	
	CANMCR=0x0100;			/* 数据场改变请求 */
	
	CANID4H=0x00f0;         /*ID=024,标准帧,只有满足这个ID的CAN控制器才能接收本信息*/
	CANCTRL4=0x0008;		/* 数据帧,发送8个字节 */
/*	CANBX4A=(SendData[1]<<8) | SendData[0];
	CANBX4B=(SendData[3]<<8) | SendData[2];
	CANBX4C=(SendData[5]<<8) | SendData[4];
	CANBX4D=(SendData[7]<<8) | SendData[6]; */
	
	CANBX4A=0x2222;
	CANBX4B=0x2222;
	CANBX4C=0x2222;
	CANBX4D=0x2222;

	CANMCR=0x0480;			/* CPU正常工作请求0x0480 ,自测试为0x04C0*/ 
	CANMDER=CANMDER | 0x0010;/* MessageBox4使能 */
	 
	asm(" SETC INTM ");
	CANTCR=0x0040;			/* MessageBox4, 发送请求 */
    while((CANTCR & 0x4000)!=0x4000);  
    asm(" CLRC INTM ");
    CANIFR=0xFFFF; 
    CANTCR=0x4000;  
return;
}
//----------------------------------------------------------------
void AD_Sample()
{   

    ADCTRL1=0x4000;			/* ADC模块复位 */
    asm(" NOP	");
    ADCTRL1=0x0020;         /* 自由运行,启动/停止模式,双排序器工作模式 */
    
    MAXCONV=0x0000; 
    CHSELSEQ1=0x0000;       //第0通道
    ADCTRL2=0x4000;         //复位使排序器指针指向CONV00
    ADCTRL2=0x2000;			/* 启动ADC转换 */
    while( (ADCTRL2&0x1000)==0x1000);		/*等待转换完成 */
    asm(" NOP ");
    asm(" NOP "); 
    RESULT_0=RESULT0>>6; 
            
    MAXCONV=0x0000;         //第8通道          
    CHSELSEQ3=0x0008;
    ADCTRL2=0x0040;
    ADCTRL2=0x0020;
    while( (ADCTRL2&0x0010)==0x0010);  
    asm(" NOP ");
    asm(" NOP ");
    RESULT_8=RESULT8>>6;           
    
 }

//-------------------------------------------------------------
void c_int1()
{
    if(PIVR!=0x40)         //高优先级的CAN接收中断
		{  	asm(" CLRC INTM ");
			return;
		}
    ReceiveData[0]=CANBX0A & 0x00FF; 
    ReceiveData[1]=CANBX0A>>8;
    ReceiveData[2]=CANBX0B & 0x00FF; 
    ReceiveData[3]=CANBX0B>>8;
    ReceiveData[4]=CANBX0C & 0x00FF; 
    ReceiveData[5]=CANBX0C>>8;
    ReceiveData[6]=CANBX0D & 0x00FF; 
    ReceiveData[7]=CANBX0D>>8;  
    
    CANRCR=0x1010;
    CANIFR=0xFFFF;         //请将光标移到此处设置断点,并用debug->Animate监测数据
    IFR=0xFFFF;
    asm(" CLRC INTM ");
    
}
//---------------------------------------------------------
void c_int2()               /*定时器1中断服务程序*/
{

    if(PIVR!=0x27)
		{  	asm(" CLRC INTM ");
			return;
		}
	T1CNT=0; 
    t0++;                                
    
if((t0%100)==0)
  {  if(AD_FLAG==0)    //定时AD采样
	{  
//	    SendData[0]=SendData[0]+1;
	    AD_FLAG=1;
//	    PBDATDIR|=0x0004;
	}
  }
//    Can_Send();
/*	     //定时循环SCI发送
	
        Can_Send();
	}*/
	EVAIFRA=0x80; 
	asm(" CLRC	INTM ");   
	
}  
//-----------------------------------------------------------
void KickDog()				/*踢除看门狗 */
{
	WDKEY=0x5555;
	WDKEY=0xAAAA;
}

⌨️ 快捷键说明

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