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

📄 canc.c

📁 实现CAN总线通讯的自测试功能
💻 C
字号:
#include "2407c.h"

//rbx2 id-0x18                   加入标准id标识符调试程序
//rbx2 id-0x100-0x1ff            加入标识符屏蔽调试
//0-7 save data, 8 save word number       save received data
unsigned int CanRxBuff[9];
int i;
int NUM;
int CAN_FLAG;				
void system_init(); 		//声明程序中要用到的函数
void CAN_INIT();
void CANMBX_ISR();
void inline disable()		//中断屏蔽子程序
{
	asm("	setc INTM"); 		
}                  
 
void inline enable() 		//中断使能子程序
{
	asm("	clrc INTM"); 
}                 

/*main program*/
main()
{
	system_init();			//系统初始化
	CAN_FLAG=0x00;			//清CAN用户标识,CAN_FLAG=01表示接收到数据 
	NUM=0X00;
	CAN_INIT();				//CAN初始化程序
	enable();				//中断使能
	for(;;)
    {
	*CANTCR=0X20;			//请求发送
	while(*CANTCR&0x2000==0)          
	*CANTCR=0X2000; 
//	while((*CANIFR&0X0400)!=0X0400) 
//	continue;
//	*CANRCR=0X0040; 

	while(CAN_FLAG==0);  
	CAN_FLAG=0;				//接收到中断标志 
	NUM=0;
   
	*CANMDER=0X0000;		//邮箱不使能
	*CANMCR=0X0140;			//CDR=1,邮箱数据改变请求
	*CANMBX3A=*CANMBX2A+1;	//更新邮箱3的数据
	*CANMBX3B=*CANMBX2B+1;
	*CANMBX3C=*CANMBX2C+1;
	*CANMBX3D=*CANMBX2D+1;  
 	*CANMCR=0x04C0;			//DBO=1,CDR=0,ABO=1,STM=1
	*CANMDER=0X04C;			//ME2=ME3=1,MBX2接收,MBX3发送
    }
} 

/*system initialization*/   
void system_init()
{
	asm("	setc INTM");		//禁止所有中断
	asm("	setc SXM");			//抑制符号位扩展
	asm("	clrc OVM");			//B0被配置为数据存储空间
	asm("	clrc CNF");			//累加器中结果正常溢出
   
	*WDCR=0xE8;					//不使用看门狗
	*SCSR1=0x83FE;				//cpu时钟,保留为设1,pll时钟频率为20MHZ,预分频选择2分频
	WSGR=0x01c0;		    	/*Data space & Prog Space 0 wait state,IO space 7 wait states*/
   
	*IMR=0x0010;				//只开通中断优先级5
	*IFR=0xFFFF;				//清中断标志位
}             

/*CAN initialization*/
void CAN_INIT()
{
	*MCRB=*MCRB|0x0C0;			//设置管脚IOP6、IOP7为CANRX,CANTX
	*CANIFR=0xFFFF;				//清所有can中断标志
	*CANLAM1H=0x60ff;			//设置邮箱2、3的屏蔽ID寄存器
	*CANLAM1L=0xffff;			//0则ID必须匹配
  
	*CANMCR=0x1040;				//CCR=1,改变配置请求;STM=1,自测试模式  
 	while(*CANGSR&0x0010==0);	//当cce=1时可配置bcr1,bcr2寄存器
	*CANBCR2=0x0f;				//波特率预分频寄存器,设置为125kbps
	*CANBCR1=0x073;
	*CANMCR=*CANMCR&0xEFFF;		//CCR=0,改变配置结束请求 	
	while(*CANGSR&0x0010!=0);	//当cce=0时 bcr1,bcr2寄存器配置成功
  
	*CANMDER=0x040;				//MD2配置成接收邮箱,MD3为发送邮箱
	*CANMCR=0x0143;				//CDR=1,选择邮箱3,数据域改变请求位,接收邮箱的数据不能改变
	*CANMSGID2H=0x4f00;			//设置邮箱2的控制字及标识符,AME1=1,使能标识符屏蔽  
	*CANMSGID2L=0xffff;			//AAM=0,不自动应答远程帧请求
//  *CANMSGCTRL2=0x08;			如果对接收邮箱数据域进行写入操作,可能引起错误中断 
//  *CANMBX2A=0x0000;
//  *CANMBX2B=0x0000;
//  *CANMBX2C=0x0000;
//  *CANMBX2D=0x0000; 

	*CANMSGID3H=0x4fff;			//配置邮箱3的控制域和数据域
	*CANMSGID3L=0xffff;
	*CANMSGCTRL3=0x08;
	*CANMBX3A=0x2211;
	*CANMBX3B=0x4433;
	*CANMBX3C=0x6655;
	*CANMBX3D=0x8877;
	*CANMCR=0x04C0;				//数据字节次序位DBO=1,自动恢复总线位ABO=1,自测试模式
	*CANMDER=0x4C;
	*CANIMR=0xF7FF;				//中断MBX3不使能,中断MBX2使能,低中断级优先
	*CANIFR=0xFFFF;				//清全部中断标志     
	
	for(i=0;i<9;i++) 
	{
	 CanRxBuff[i]=0x00;	
	}
 }
 
 /*interrupt program*/
 
void interrupt GRIS5()
{
 
    switch(*PIVR)
    {
    case 64:						//邮箱2接收到相应的信息,进入中断服务程序。64是十进制数 
		if(((*CANIFR)&0x0400)!=0)	//判断MIF2标志位,信息接收成功则该位置1
		{   
			
				
			CanRxBuff[0]=((*CANMBX2A)&(0x00ff)); 
			NUM+=1;
			CanRxBuff[1]=(*CANMBX2A&0Xff00)>>8; 
			NUM+=1;
			CanRxBuff[2]=*CANMBX2B&0X00ff;
			NUM+=1;
			CanRxBuff[3]=(*CANMBX2B&0X00ff)>>8;
			NUM+=1;
			CanRxBuff[4]=*CANMBX2C&0X00ff;
			NUM+=1;
			CanRxBuff[5]=(*CANMBX2C&0X00ff)>>8;
			NUM+=1;
			CanRxBuff[6]=*CANMBX2D&0X00ff;
			NUM+=1; 
			CanRxBuff[7]=(*CANMBX2D&0X00ff)>>8;
			NUM+=1; 
			CanRxBuff[8]=NUM;	

			CANMBX_ISR();
	
		}
		break;
	default:
		break;
	}
} 

 
 
void CANMBX_ISR()
{
	*CANRCR=0X040;
	CAN_FLAG=1;
}   

 
void interrupt nothing()			//假中断程序
{
}

⌨️ 快捷键说明

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