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

📄 can.c

📁 调试好的CAN-BUS万能程序程序,可以应用于工业总线和通信设施
💻 C
字号:
#ifndef _CAN_C
#define _CAN_C



#include <user.h>
#include <can.h>
 
 byte data 	count_testRX;
 byte data 	count_testTX;
 CanBuffer xdata canbuffer;
 byte  buf [8],rbuf [13],bbuf[8];
 
 unsigned char code R_FRAME[]={0XF0,0X1F,0Xaa,0Xaa,0Xaa};	//远程帧信息

//*****************SJA1000初始化程序*****************
void init_can(void)			//SJA1000进入复位模式并初始化寄存器
{
	byte sta;
	byte xdata *nm_poin;
	sta=0;
	nm_poin=MODE;			//选中SJA1000
	*nm_poin=0x09;			//模式寄存器设置
	sta=0;
	while((sta&0x01)!=0x01)	//必须确认SJA进入了复位模式
	{
		sta=*nm_poin;
	}
	nm_poin=BTR0;		
	*nm_poin=0xc9;			//总线定时寄存器0-系统时钟,同步跳转宽度
	nm_poin=BTR1;		
	*nm_poin=0xA3;			//总线定时寄存器1-波特率100K,采样次数3
	nm_poin=CDR;
	*nm_poin=0xc0;			//时钟分频寄存器,PeliCAN,RX1不允许,CLKOUT不允许
	nm_poin=OCR;
	*nm_poin=0xaa;			//输出控制寄存器,正常输出模式
	nm_poin=IER;
	*nm_poin=0x0d;			//输入,总线出错,数据溢出中断允许	
	nm_poin=ACR0;
	*nm_poin=0x00;			//验收代码ff 7f 00 08
	nm_poin=ACR1;
	*nm_poin=0x81;
	nm_poin=ACR2;
	*nm_poin=0x00;
	nm_poin=ACR3;
	*nm_poin=0x00;
	nm_poin=AMR0;			//验收屏蔽06 00 00 00
	*nm_poin=0Xff;
	nm_poin=AMR1;
	*nm_poin=0xff;
	nm_poin=AMR2;
	*nm_poin=0xff;
	nm_poin=AMR3;
	*nm_poin=0xff;
	nm_poin=RBSA;			//接收缓冲区首址
	*nm_poin=0;
	nm_poin=TXERR;			//错误计数
	*nm_poin=0;
	nm_poin=ECC;			//错误代码值
	*nm_poin=0;
	nm_poin=MODE;
	*nm_poin=0x08;			//单滤波设置,返回到工作状态
	sta=0x01;
	while((sta&0x01)==0x01)	//必须确认SJA进入了工作模式
	{
		sta=*nm_poin;
	}
}                 


//*****************发送一帧数据子程序*****************
void send_Fframe()
{
	byte state;
	byte xdata *nm_poin;

		nm_poin=SR;
		state=0;
		while(state!=0x0c)					//检查各状态位
		{
			state=*nm_poin;
			state=state&0x1c;
		}
		nm_poin=CANTX;
		*nm_poin=0xc0;                  //远程帧
		nm_poin++;
		*nm_poin=0xaa;
		nm_poin++;
		*nm_poin=0xaa;
		nm_poin++;
		*nm_poin=0xaa;
		nm_poin++;
		*nm_poin=0xaa;	
		nm_poin=CMR;
		*nm_poin=0X01;	               //启动发送
		
}
//*****************发送数据帧*****************
void send_dframe(void)		          
{
	byte s_state;
	byte xdata *nm_poin;

		nm_poin=SR;
		s_state=0;
		while(s_state!=0x0c)					//检查各状态位
		{
			s_state=*nm_poin;
			s_state=s_state&0x1c;
		}
		nm_poin=CANTX;
		*nm_poin=0x88;                  //数据帧,8个字节
		nm_poin++;
		*nm_poin=0xaa;
		nm_poin++;
		*nm_poin=0xaa;
		nm_poin++;
		*nm_poin=0xaa;
		nm_poin++;
		*nm_poin=0xaa;
		 //从数据区顶端去数据送入发送缓冲区
		for(s_state=0;s_state<8;s_state++)	//将数据送至发送缓冲区
		{
			nm_poin++;
			*nm_poin=bbuf[s_state];		
		
		}
		bbuf[7]++;
		nm_poin=CMR;
		*nm_poin=0X01;	               //启动发送
	
}

#endif

⌨️ 快捷键说明

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