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

📄 can-test.c

📁 这是我从朋友那搞到的pic学习资料
💻 C
字号:
/* ****************************************************************
** 功能描述: CAN自测试收发编程,CAN发送邮箱0以一定的时间间隔发送数据,接收到数据后,将接收数据加1作为下一次的发送数据
*************************************************************** */
#include	"pic18.h"						/* PIC18系列的头文件 */
char	CAN_Adress_H,CAN_Adress_L;		/* CAN标识符高低字节 */
char	CAN_Adress_EH,CAN_Adress_EL;	/* CAN扩展标识符高低字节 */
int	CAN_FLAG;						/* =1接收到CAN 数据,=0未接收到数据 */
unsigned	int	CAN_Delay_count=0;		/* 间隔一定时间发送CAN数据 */
	
/* ****************************************************************
** 函 数 名: initial()
** 功能描述: 系统初始化子程序,放在程序首部
*************************************************************** */
void	initial()
{
	INTCON=0x00;					/* bit7-bit0:关总中断 */
	ADCON1=0X07;					/* 设置数字输入输出口 */
	PIE1=0;							/* PIE1 的中断不使能 */	
	PIE2=0;							/* PIE2 的中断不使能 */	
	PIE3=0;							/* PIE3 的中断不使能 */	
}

/* ****************************************************************
** 函 数 名: initcan()
** 功能描述: CAN初始化子程序,采用标准标识符,自测试模式
*************************************************************** */
void	initcan()
{
	/* ************设置对CAN进行配置***************  */
	TRISB=(TRISB|0X08)&0XFB;		/*设置CANRX/RB3输入,CANTX/RB2输出*/
	CANCON=0X80;					/* CANCON,bit7-5:1XX请求配置 */
	while((CANSTAT&0X80)==0)		/* CAN状态寄存器。bit7-5:100配置方式 */
	{							
		;
	}								/* 等待进入CAN配置模式OPMODE=100 */

	/*  ***********波特率设置 ************************** */
	BRGCON1=0X01;					/* Sync_Seg(bit7-6)=1TQ,BRP(bit5-0)=1,
则TQ=((2*(BRP+1))/Fosc=4/4M=1us */
BRGCON2=0X90;				/*bit7=1自由编程,bit6=0总线在采样点采样1
次;Phase_Seg1(bit5-3)=3TQ;Prog_Seg(bit2-0)=1TQ*/
	BRGCON3=0X42;				/* 设置Phase_Seg2(bit2-0)=3TQ */
/* 标称位时间=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)
=(1+1+3+3)TQ=8TQ,    位率=1/(8*1U)=0.125MHz */

	/*  ******设置发送邮标识符号和初始发送的数据*****  */
	TXB0CON=0X03;					/* bit1-0:发送优先级,设置TXB0为最高优先级3 */
	TXB0SIDL=CAN_Adress_L&0xe0;	/* bit3=0标准标识符,bit7-5:标准标识符2-0位 */
	TXB0SIDH=CAN_Adress_H;			/* 标准标识符的10-3位 */
	TXB0DLC=0X08;					/* 设置数据长度为8个字节 */
	TXB0D0=0X00;					/* 写发送缓冲器数据区数据初值 */
	TXB0D1=0X01;					/* 写发送缓冲器数据区数据初值 */
	TXB0D2=0X02;
	TXB0D3=0X03;
	TXB0D4=0X04;
	TXB0D5=0X05;
	TXB0D6=0X06;
	TXB0D7=0X07;

	/* *******设置接收邮箱0的标识符和初始化数据********** */
	RXB0SIDL=CAN_Adress_L&0xe0;	/* bit3=0标准标识符,bit7-5:标准标识符2-0位*/
	RXB0SIDH=CAN_Adress_H;			/* 标准标识符的10-3位 */
	RXB0CON=0X20;					/* bit6-5=01只接收有效的标准标识符信息 */
	RXB0DLC=0X08;					/* 设置接收缓冲器0的数据区长度8个字节 */
	RXB0D0=0X02;					/* 初始化接收缓冲器0的数据区数据 */
	RXB0D1=0X03;					/* 初始化接收缓冲器0的数据区数据 */
	RXB0D2=0X04;
	RXB0D3=0X05;
	RXB0D4=0X00;
	RXB0D5=0X00;
	RXB0D6=0X00;
	RXB0D7=0X00;

	/* *******初始化接收滤波器0和接收屏蔽**************** */
	RXF0SIDH=CAN_Adress_H;		
	RXF0SIDL=CAN_Adress_L;		/* 本字节高3位为标识符低3位,低5位是配置 */
	RXM0SIDH=0Xff;
	RXM0SIDL=0Xe0;				/* 11个1表示接收11位标识符进行滤波,标识符
不同不接收;若全为0,若正确信息,全部接收*/

	/* *******设置CAN工作模式**************************** */
	CANCON=0X40;				/* bit6:=1进入自测试模式;=0,正常操作模式 */
	while((CANSTAT&0X40)!=0)		/* 检测CAN配置完成 */
	{
		;
	}
	
	/* 初始化CAN的中断,PIR3为CAN的外围中断标志寄存器 */
	PIR3=0X00;					/* 清所有CAN中断标志 */
	PIE3=PIE3|0X01;				/* 使能接收缓冲器0的接收中断 */
	IPR3=IPR3|0X01;				/* 接收缓冲器0的接收中断为最高优先级 */
}

/* 	**************************************************************
**	函 数 名: CAN_deal()
**	功    能:CAN接收数据后处理子程序:接收数据加1为下次发送的数据
****************************************************************** */ 
void	CAN_deal()
{
	CAN_FLAG=0;				/* 清接收到标志 */
	TXB0CON=TXB0CON&0xf7;	/* TXB0REQ=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;
}

/* ****************************************************************
** 函 数 名: interrupt	HI_ISR()
** 功能描述: 高优先级中断子程序:RXB0接收邮箱0接收中断子程序
*************************************************************** */
void	interrupt HI_ISR()
{
	if(RXB0IF==1)				/* RXB0接收邮箱0接收中断 */
	{
   		CAN_FLAG=1;			/* 置接收到 CAN 数据 */
		RXB0IF=0;				/* 清接收中断标志 */
		RXB0FUL=0;				/* bit7=0打开接收缓冲器接收新信息 */
	}
}

main()	
{
	initial();						/* 系统初始化子程序 */
	CAN_Adress_H=0x33;			/* CAN高地址为33,低地址为3 */
	CAN_Adress_L=0xe0;			/* 接收和发送邮箱标识符:00110011111=0x019F*/
	initcan();						/* CAN设置初始化 */
	IPEN=1;						/* 使能中断高低优先级 */
	INTCON=INTCON|0xc0;		/* 开总中断、开外围接口中断 */
	while(1)
	{
		if(CAN_FLAG==1)CAN_deal();	/* 接收到CAN信息,处理 */
		else	if(CAN_Delay_count>0x2fe)	/* 间隔一定时间发送CAN数据 */
		{
			TXB0CON=TXB0CON|0x08;/* bit3(TXREQ)=1,请求发送 */
			CAN_Delay_count=0;		/* 间隔一定时间发送CAN数据计时器清0 */
		}
		else	CAN_Delay_count++;		/* 不到CAN间隔发送时间,继续延时 */
	}
}

⌨️ 快捷键说明

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