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

📄 can 总线通信实验.txt

📁 这是一个2407DSP的CAN通信控制程序
💻 TXT
字号:
============================
61IC中国电子在线
http://www.61ic.com
国内最大的DSP专业技术网站
============================
//Main.c
//CAN发送与接收程序,波特率设置为125kbps,标准帧,ID=0x024
#include "global.c" 
void SystemInit();
void Timer1Init(); 
void KickDog();  
void Can_Init();
void Can_Send();
int numled0=200;   
unsigned int t0=0;   
unsigned char SendData[8]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};
unsigned char ReceiveData[8];
main()
{  

   SystemInit();         	//系统初始化
   
   MCRA=MCRA & 0xC0FF; 	    //IOPB0-6设为IO口模式
   PBDATDIR=0xFFC2;   	    //所有LED=0 
   PBDATDIR=PBDATDIR |0x003D;  //所有LED=1  
   Can_Init();              //CAN模块初始化
   Timer1Init();          	//定时器初始化
   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();    			// 初始化看门狗   
    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=0x40A0;          /*标准帧,设置ID=024-0x40a0,用于邮箱0接收信息*/
	CANMCR=0x0480;	     	/* 正常工作请求0x0480,自测试0x04c0 */
	CANMDER=0x0001;			/* 和MessageBox0使能 */
	
	CANIMR=0x0100;			// 禁止发送中断,高级使能,打开MessageBox0接收中断   
	CANIFR=0xFFFF;			// 清除全部CAN中断标志 

} 

void Can_Send()
{	
	
	CANMCR=0x0100;			/* 数据场改变请求 */
	
	CANID4H=0x00A0;         /*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]; 

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


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++;
	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_Send();
	}
	EVAIFRA=0x80; 
	asm(" CLRC	INTM ");   
	
}  

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

⌨️ 快捷键说明

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