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

📄 can.c

📁 can sja1000 主节点程序 已经通过调试
💻 C
字号:


#include "can.h"
#include "reg52.h"

void SJAInit(tByte const Reg_acr)
{
	MODE = 0x09;				//模式寄存器,单验收滤波器,进入复位模式
	CDR  = 0x88;				//时钟分频R,选择增强CAN模式,关闭CLKOUT输出
	IER  = 0x0d;				//中断使能寄存器,开溢出、错误、接收中断
	
	BTR0 = 0x03;				//总线定时寄存器
	BTR1 = 0xff;				//总线定时寄存器二,6MHz晶振,波特率30Kbps
	
	OCR  = 0xaa;				//输出控制寄存器

	ACR0 = Reg_acr;				//验收代码ACR0
	ACR1 = 0xff;				//验收代码ACR1,以下无关
	ACR2 = 0xff;				//验收代码ACR2
	ACR3 = 0xff;				//验收代码ACR3

	AMR0 = 0x00;				//验收屏蔽寄存器AMR0=00H
	AMR1 = 0xff;				//验收屏蔽寄存器AMR1,以下无关
	AMR2 = 0xff;				//验收屏蔽寄存器AMR2
	AMR3 = 0xff;				//验收屏蔽寄存器AMR3
					
	RBSA = 0x00;				//接收缓冲器FIFO起始地址为0
	TXER = 0x00;				//清除发送错误计数器
	ECC  = 0x00;				//清除错误代码捕捉寄存器
	MODE = 0x08;				//单滤波方式,返回工作方式	
	 	
}

tByte SJASendData(tByte *Tdata,tByte const DatLen,tByte const TarID,SaID,TxRx)
{
	static tByte TempData;
	static tByte TempValue;
	TempData = SR;				//读状态寄存器
	P1 = SR;
	do							//判断是否正在接收正在接收则等待
	{
		TempData = SR;			//TempValue = 1则等待
	}while(TempData & Bit(4));

	do							//判断上次发送是否完成未完成则等待发送完成
	{							//TempValue = 0则等待
		TempData = SR; 
	}while(!(TempData & Bit(3)));

	do							//判断发送缓冲区是否锁定锁定则等待
	{							//TempValue = 0则等待
		TempData = SR;
	}while(!(TempData & Bit(2)));

	FIN(0) = TxRx;
	ID1 = TarID;
	ID2 = SaID;
								//开始发送数据,一共8个字节,全部为有效数据
	for(TempValue = 0;TempValue<DatLen;TempValue++)
	{
		DAT1(TempValue) = Tdata[TempValue];
	}

	CMR  = 0x01;				//启动SJA1000 发送

	return 0;					
}

tByte SJARecvData(tByte *Rdata,tByte const DatLen)
{

	static tByte TempData;
	static tByte TempValue;
	TempData = SR;				//读状态寄存器
	TempValue = (TempData & 0xc3);	
	if(!TempValue )				//读取总线脱离、错误状态、接收溢出、有数据等位
	{
		return 1;				//总线接收失败推出
		
	}

	if(TempData & Bit(7))
	{
		TempData = IR;			//IR中断寄存器,出现总线脱离,读中断寄存器,清除中断位
		MODE    = 0x08;			//推出复位模式,进入工作模式

		return 2;				//总线接收失败			
	}

	TempData = IR;
	if(TempData & Bit(3))
	{
		CMR = 0x0c;				//数据溢出处理,清除数据溢出位,释放接收缓冲区

		return 3;				//总线接收失败
	}

	if(!(TempData & Bit(0)))
	{
		TempValue = ALC; 		//释放仲裁丢失捕捉寄存器和错误捕捉寄存器
		TempValue = ECC;
	
		return 4;				//总线接受失败				
	}

	//TempData = FIN;			//远程帧处理
	if(TempData & Bit(2))
	{
		CMR = 0x04;
		TempValue = ALC; 		//释放仲裁丢失捕捉寄存器和错误捕捉寄存器
		TempValue = ECC;

		return 5;	
	}

   	for(TempValue = 0;TempValue<DatLen;TempValue++)
	{
		Rdata[TempValue]= FIN(TempValue);

	}
	
	CMR = 0x04;
	TempValue = ALC; 			//释放仲裁丢失捕捉寄存器和错误捕捉寄存器
	TempValue = ECC;

	return 0;	
}

⌨️ 快捷键说明

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