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

📄 can.h

📁 LF2407的各个模块的测试程序,包含2407里面的所有模块,均已经调试通过,心血所致,希望对大家有所帮助.
💻 H
字号:
void CAN_init()
{	     	
	*MCRB |= 0x00C0;//使能CANRX和CANTX
	*CANIFR = 0xFFFF;//清除所有CAN中断标志
	
	//邮箱0,1的接收屏蔽寄存器(设置为全0xFFFF为全部接收)
	*CANLAM0H = 0xFFFF;
	*CANLAM0L = 0xFFFF;
	
	//邮箱2,3的接收屏蔽寄存器(设置为全0xFFFF为全部接收)
	*CANLAM1H = 0xFFFF;
	*CANLAM1L = 0xFFFF;	
			    
//-----------------------   设置波特率   -------------------------------	
	*CANMCR = 0X1040;		 //CAN控制器进入复位模式 排序0~7			
	while( *CANGSR&0X0010 == 0 )	continue;           
	
	//计算方法:(Page 249)
	//波特率 = CAN控制器的时钟频率/[(CAN波特率预分频系数+1)*(TSEG1+TSEG2+3)]
	//在这里:
	//	CAN控制器的时钟频率 = CPU时钟频率*PLL倍频系数,在*SCSR1里面设置
	//	CAN波特率预分频系数 = *CANBCR2
	//	这样可以计算出 TSEG1和TSEG2 ,有的时候它们两个的值可以有多种组合。
	//在波特率是250kbps的时候:可以这样设置
	//	PLL倍频系数是1时,*CANBCR2=0X0001,*CANBCR1=0X007E
	//	PLL倍频系数是2时,*CANBCR2=0X0003,*CANBCR1=0X007E
	//	PLL倍频系数是4时,*CANBCR2=0X0007,*CANBCR1=0X007E
	
	*CANBCR2=0X0007;		 //设置波特率预分频		    
	*CANBCR1=0X007E;		 //设置波特率250Kbps	
		   
	*CANMCR &= 0XEFFF;	 //CAN控制器进入正常工作模式	
	while( *CANGSR&0X0010 != 0 )	continue;   
//-----------------------------------------------------------------------
	
	*CANMCR= 0x0480;//	(Page 246)
	
	*CANMDER = 0x0040;//0,1,2接收;3,4,5发送。禁止全部6个邮箱。
	*CANMCR |= 0x0100;	//改变数据域请求:CDR = 1;
	
	//-----------   邮箱0   -----------
	*CANMSGID0H = 0xC000;
	*CANMSGID0L = 0x0000;	
	*CANMSGCTRL0 = 0x0008;
	//-----------   邮箱1   -----------
	*CANMSGID1H = 0xC000;
	*CANMSGID1L = 0x0000;	
	*CANMSGCTRL1 = 0x0008;
	//-----------   邮箱2   -----------
	*CANMSGID2H = 0xC000;
	*CANMSGID2L = 0x0000;	
	*CANMSGCTRL2 = 0x0008;
	//-----------   邮箱3   -----------
	*CANMSGID3H = 0xC000;
	*CANMSGID3L = 0x0000;	
	*CANMSGCTRL3 = 0x0008;
	//-----------   邮箱4   -----------
	*CANMSGID4H = 0xC000;
	*CANMSGID4L = 0x0000;	
	*CANMSGCTRL4 = 0x0008;
	//-----------   邮箱5   -----------
	*CANMSGID5H = 0xC000;
	*CANMSGID5L = 0x0000;	
	*CANMSGCTRL5 = 0x0008;			
		
	*CANMCR &= ~0x0100;
	*CANMDER = 0x007F;//0,1,2接收;3,4,5发送。使能全部6个邮箱。(注意:如果要修改发送邮箱和接收邮箱的个数,需要同时修改接收和发送历程)
	
//	*CANIMR=0X077F;		 //使能接收高优先级中断,使能全部错误高优先级中断	
	*CANIMR=0X0700;		 //使能接收高优先级中断,使能全部错误高优先级中断		    
	*CANIFR=0XFFFF;		 //清除中断标志	 
}    



UCHAR CAN_Send_Data(UCHAR MailBox_Index,ULONG ID,UCHAR Data_length,UCHAR *data)//只处理扩展帧,数据帧
{  
	UINT offset = 0;
	UCHAR i = 0;
	static UCHAR LED_data = 0;	
	
	offset = MailBox_Index<<3;	
	
				
	if(MailBox_Index < 3)//确认选择的是发送邮箱
		return 1;	
		
	*CANMDER &= ~(0x0001<<MailBox_Index);  	 //禁止邮箱	
	*CANMCR |= 0x0100;	//改变数据域请求:CDR = 1;		
	
	*(CANMSGID0H + offset)=(((UINT)(ID>>16))&0x1FFF) + 0x8000;											   
	*(CANMSGID0L + offset)=(UINT)ID;
	*(CANMSGCTRL0 + offset)=Data_length;				
	
	for(i=0;i<Data_length;i=i+2)
		*(CANMBX0A + offset + i/2)=(((UINT)data[i])&0x00FF) + ((((UINT)data[i+1])<<8)&0xFF00);
   
	*CANMCR &= ~0x0100;
	
	*CANMDER |= 0x0001<<MailBox_Index;		 //使能邮箱
	
	*CANTCR  |= (0x0001<<(MailBox_Index+2));	//发送!
		
	while(*CANTCR & (0x0001<<(MailBox_Index+2)) == 0)//这个地方是不是可以考虑修改,提高执行速度?
		continue;
				
	*CANTCR |= (0x0100<<(MailBox_Index+2));	
		
	return 0;		
}



⌨️ 快捷键说明

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