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

📄 can.c

📁 描述了基于PIC18F系列单片机的CAN总线的代码
💻 C
字号:
//该程序实现发送缓冲器0向接收缓冲器0发送数据的自测试模式,其中接收采用中断方式
//发送采用查询方式

#include	"p18f458.h"

int	CAN_FLAG;		//定义标志寄存器

//**************初始化子程序***************
void	initcan()
{
	TRISB=(TRISB|0X08)&0XFB;		//设置CANRX/RB3为输入,CANTX/RB2为输出

//设置CAN的波特率为125K,在Fosc=4M时,Tbit=8us,假设BRP=01h
//则TQ=[2*(1+BRP)]/Fosc=2*(1+1)/4=1us。
//NOMINAL BIT RATE=8TQ,SJW=1,Sync_Seg=1TQ,Prog _Seg=1TQ,Phase_Seg1=3TQ,Phase_Seg2=3TQ
	CANCON=0X80;				//请求进入CAN配置模式REQOP=100	
	while(CANSTAT&0X80==0){;}		//等待进入CAN配置模式OPMODE=100
	BRGCON1=0X01;				//设置SJW和BRP,SJW=1TQ,BRP=01H
	BRGCON2=0X90;				//设置Phase_Seg1=3TQ和Prog _Seg=1TQ
	BRGCON3=0X42;				//设置Phase_Seg2=3TQ

//设置发送邮箱0标识符号和发送的数据
	TXB0CON=0X03;		//发送优先级为最高优先级,TXPRI=11
	TXB0SIDH=0XFF;		//设置发送缓冲器0的标准标识符,本程序采用标准识符
	TXB0SIDL=0XE0;
	TXB0DLC=0X08;		//设置数据长度为8个字节
	TXB0D0=0X00;		//写发送缓冲器数据区的数据
	TXB0D1=0X01;
	TXB0D2=0X02;
	TXB0D3=0X03;
	TXB0D4=0X04;
	TXB0D5=0X05;
	TXB0D6=0X06;
	TXB0D7=0X07;

//设置接收邮箱0的标识符和初始化数据
	RXB0SIDH=0XFF;		//设置接收缓冲器0的标识符	
	RXB0SIDL=0XE0;
	RXB0CON=0X20;		//仅仅接收标准标识符的有效信息,FILHIT0=0表示RXB0采用filter0
	RXB0DLC=0X08;		//设置接收缓冲器0的数据区长度
	RXB0D0=0X00;		//初始化接收缓冲器0的数据区数据
	RXB0D1=0X00;
	RXB0D2=0X00;
	RXB0D3=0X00;
	RXB0D4=0X00;
	RXB0D5=0X00;
	RXB0D6=0X00;
	RXB0D7=0X00;

//初始化接收滤波器0和接收屏蔽,
	RXF0SIDH=0XFF;
	RXF0SIDL=0XE0;
	RXM0SIDH=0X00;
	RXM0SIDL=0X00;

//初始化CAN模块的I/O控制寄存器
	//CIOCON=0X00;

//使CAN进入某种工作模式模式
	CANCON=0X00;			//=0X40,进入自测试模式;=0x00,正常操作模式
	while(CANSTAT&0XE0!=0){;}
	//while(CANSTAT&0X40==0){;}

//初始化CAN的中断
	PIR3=0X00;			//清所有中断标志
	PIE3=0X01;			//使能接收缓冲器0的接收中断
	IPR3=0X01;			//接收缓冲器0的接收中断为最高优先级
}

//*********接收缓冲器0接收中断服务程序***********
#pragma	interrupt	can_isr	
#pragma	code low_ISR=0x18
void low_ISR()
{
	_asm
	goto can_isr	
	_endasm
}
#pragma	code

void can_isr()
{
	if(PIR3bits.RXB0IF==1)	CAN_FLAG=1;
	PIR3bits.RXB0IF=0;			//清接收中断标志
	RXB0CONbits.RXFUL=0;		//打开接收缓冲器来接收新信息
}

//****************主程序******************	
main()
{
	INTCON=0x00;			//禁止所有中断	
	initcan();
	WDTCON=0;				//=1,看门狗使能;=0,禁止看门狗
	INTCON=0xc0;				//使能中断
	while(1)
	{
		TXB0CONbits.TXREQ=1;			//请求发送,TXREQ=1
		while(PIR3bits.TXB0IF!=1){;}		//等待发送完成
		while(CAN_FLAG==0){;}			//等待接收数据
		CAN_FLAG=0;				//清接收到标志
		TXB0CONbits.TXREQ=0;			//禁止发送
		TXB0D0=RXB0D0+1;			//用接收数据加1来更新发送数据
		TXB0D1=RXB0D1+1;
		TXB0D2=RXB0D2+1;
		TXB0D3=RXB0D3+1;
		TXB0D4=RXB0D4+1;
		TXB0D5=RXB0D5+1;
		TXB0D6=RXB0D6+1;
		TXB0D7=RXB0D7+1;

	}
}

⌨️ 快捷键说明

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