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

📄 sja1000_peli.c

📁 CAN总线通信程序
💻 C
字号:
#include <AT89x51.h>
#include "SJA1000_PELI.h"

bit g_TiFlag=0;
bit g_RiFlag=0;



unsigned char xdata *SJA_BASE_ADDR = 0x0000;

//写数据
void SJARegWrite(unsigned char regAddr,unsigned char setData)
{
     *(SJA_BASE_ADDR+regAddr) = setData;
}
//读数据
unsigned char SJARegRead(unsigned char regAddr)
{
     unsigned char tempData;
	 tempData = *(SJA_BASE_ADDR+regAddr);
	 return tempData;
}
//寄存器自测试
bit SJARegSelfTest(void)
{
     bit  flag;

	 SJARegWrite(9,0xaa);
	 if (SJARegRead(9) == 0xaa)
	 {
	     flag = 0;
	 }

	 else 
	 {
	     flag = 1;
	 }

	 if (!flag) 
	 {
	     SJARegWrite(9,0x55);
		 if (SJARegRead(9) == 0x55)
		 {
		     flag = 0;
		 } 
		 else 
		 {
		     flag = 1;
		 }
	 }

	 return flag ;
}
//进入复位模式
bit SJAEnterRstMode(void)
{
     bit flag;
     unsigned char tempData;

	 tempData = SJARegRead(0);
	 tempData = tempData|0x01;
	 SJARegWrite(0,tempData);

	 if((SJARegRead(0)&0x01)==1)
	 {
	     flag = 0; 
	 }
	 else
	 {
	     flag = 1;
	 }
	 return flag;
}
//退出复位模式
bit SJAEnterWorkMode(void)
{
     bit flag;
	 unsigned char tempData;

	 tempData = SJARegRead(0);
	 tempData = tempData&0xfe;
	 SJARegWrite(0,tempData);

	 if((SJARegRead(0)&0x01)==0)
	 {
	     flag = 0;
	 }
	 else
	 {
	     flag = 1;
	 }
	 return flag;
}

//设置时钟分频,输出控制寄存器
bit SJAClkOut(unsigned char OCR,unsigned char CDR)
{
     bit flag;
	 
	 SJARegWrite(8,OCR);
	 SJARegWrite(31,CDR);

	 if((SJARegRead(8)==OCR)&(SJARegRead(31)==CDR))
	 {
	     flag = 0;
	 }
	 else
	 {
	     flag = 1;
	 }
	 return flag;
}
//中断使能设置
bit SJASetInterrupt(unsigned char ENA_INT)
{
     bit flag;

	 SJARegWrite(4,ENA_INT);

	 if (SJARegRead(4) == ENA_INT)
	 {
	     flag = 0;
	 }
	 else 
	 {
	     flag = 1;
	 }
	 return flag;
}
//波特率设置
bit SJASetBaudRate(unsigned char BTR0,unsigned char BTR1)
{
     bit flag;
	 SJARegWrite(6,BTR0);
	 SJARegWrite(7,BTR1);

	 if((SJARegRead(6)==BTR0)&(SJARegRead(7)==BTR1))
	 {
	     flag = 0;
	 }
	 else
	 {
	     flag = 1;
	 }
	 return flag;
}
//验收代码寄存器设置
bit SJASetACR(   unsigned char ACR0,
                 unsigned char ACR1,
				 unsigned char ACR2,
				 unsigned char ACR3 )
{
     bit flag;

	 SJARegWrite(16,ACR0);
	 SJARegWrite(17,ACR1);
	 SJARegWrite(18,ACR2);
	 SJARegWrite(19,ACR3);

	 if ((SJARegRead(16) ==ACR0)&(SJARegRead(17) ==ACR1)
	      &(SJARegRead(18) ==ACR2)&(SJARegRead(19) ==ACR3))
	{
	    flag = 0;
	}
	else 
	{
	    flag = 1;
	}
	return flag;
}
//屏蔽寄存器设置
bit SJASetAMR(   unsigned char AMR0,
                 unsigned char AMR1,
				 unsigned char AMR2,
				 unsigned char AMR3  )
{
     bit flag;

	 SJARegWrite(20,AMR0);
	 SJARegWrite(21,AMR1);
	 SJARegWrite(22,AMR2);
	 SJARegWrite(23,AMR3);

	 if ((SJARegRead(20) ==AMR0)&(SJARegRead(21) ==AMR1)
	      &(SJARegRead(22) ==AMR2)&(SJARegRead(23) ==AMR3))
	{
	    flag = 0;
	}
	else 
	{
	    flag = 1;
	}
	return flag;
}
//SJA初始化
void SJAInit(void)
{
    bit flag;

	flag = SJARegSelfTest();					   //SJA自测试
	while(flag)
	{
	    flag = SJARegSelfTest();
		
	}
	

	flag = SJAEnterRstMode();					   //进行复位模式
	while(flag)
	{
	    flag = SJAEnterRstMode();
		
	}
	
	
	flag = SJAClkOut(SJA_OCR,SJA_CDR);			   //时钟分频、输出控制设置
	while(flag)
	{
	    flag = SJAClkOut(SJA_OCR,SJA_CDR);
		
	}
	
/////////////////////////////////////////////////////

	 SJARegWrite(0,SJARegRead(0)|0x0c);                       //设置为单滤波器,并使用自测试模式

	flag = SJASetACR(SJA_ACR0,SJA_ACR1,SJA_ACR2,SJA_ACR3);	  //设置验收代码寄存器
	while(flag)
	{
	    	flag = SJASetACR(SJA_ACR0,SJA_ACR1,SJA_ACR2,SJA_ACR3);
			
	}
	

	flag = SJASetAMR(SJA_AMR0,SJA_AMR1,SJA_AMR2,SJA_AMR3);	  //设置屏蔽寄存器
	while(flag)
	{
	    	flag = SJASetAMR(SJA_AMR0,SJA_AMR1,SJA_AMR2,SJA_AMR3);
			
	}
	
/////////////////////////////////////////////////////



	flag = SJASetBaudRate(SJA_BTR0,SJA_BTR1);	   //波特率设置
	while(flag)
	{
	    flag = SJASetBaudRate(SJA_BTR0,SJA_BTR1); 
		
	}
	


	flag = SJAEnterWorkMode();					   //进入工作模式
	while(flag)
	{
	    flag = SJAEnterWorkMode();
		
	}
	

	flag = SJASetInterrupt(SJA_INT);			   //中断使能
	while(flag)
	{
	    flag = SJASetInterrupt(SJA_INT);
	}
}

//发送函数
bit SJASendData(unsigned char *SendDataBuf)
{
    bit flag = 1;
	unsigned char len,i;
	
    if ((SJARegRead(2)&0x10) ==0)					   //是否为接收状态?不是则下一步
	{	 
	     if ((SJARegRead(2)&0x04)!=0)				   //发送队列是否为空?是则下一步
		 {
		     if ((SendDataBuf[0]&0x80 )==0)        //为0,标准帧
			 {
			     if ((SendDataBuf[0]&0x40)==0)	   //为0,数据帧
				 {
				     len = SendDataBuf[0]&0x0f;
					 if (len>=8)
					 {
					     len = 8;
					 }
					 len+=3;
				 }
				 else
				 {
				      len = 3;
				 }

				 for (i=0; i<len; i++)
				 {
				      SJARegWrite(16+i,SendDataBuf[i]);
				 }
				 flag = 0;

			 }

			 if ((SendDataBuf[0]&0x80)!=0)		   //为1,扩展帧
			 {
			     if ((SendDataBuf[0]&0x40)==0)	   //为0,数据帧
				 {
				     len = SendDataBuf[0]&0x0f;
					 if (len>=8)
					 {
					     len = 8;
					 }
					 len+=5;
				 }
				 else
				 {
				      len = 5;
				 }

				 for (i=0; i<len; i++)
				 {
				      SJARegWrite(16+i,SendDataBuf[i]);
				 }
				 flag = 0;
			 }
		 }
	}
	return flag;
}

//接收函数
bit SJAReceData(unsigned char *ReceDataBuf)
{
    bit flag=1;
	unsigned char len,i;

	if ((SJARegRead(2)&0x01)!=0)					    //接收有可用信息
	{
	     if ((ReceDataBuf[0]&0x80)==0)				//为0,标准帧
		 {
		      if((ReceDataBuf[0]&0x40)==0)			//为0,数据帧
			  {
			       
				   len = ReceDataBuf[0]&0x0f;
				   if (len>=8)
				   {
				       len = 8;
				   }
				   len+=3;
			  }
			  else
		     {
			       len = 3;
		     }

			 for (i=0; i<len; i++)
			 {
			      ReceDataBuf[i] = SJARegRead(16+i);
			 }
			 flag = 0;
			  
		 }


		 if ((ReceDataBuf[0]&0x80)!=0)             //为1,扩展帧
		 {
		      if((ReceDataBuf[0]&0x40)==0)			//为0,数据帧
			  {
			       
				   len = ReceDataBuf[0]&0x0f;
				   if (len>=8)
				   {
				       len = 8;
				   }
				   len+=5;
			  }
			  else
		     {
			       len = 5;
		     }
			 for (i=0; i<len; i++)
			 {
			      ReceDataBuf[i] = SJARegRead(16+i);
			 }
			 flag = 0;

		 }
	}
	return flag;

}

//中断服务程序
void SJAInterruput(void) interrupt 0 using 1
{
    unsigned char tempData;

	tempData = SJARegRead(3);

	if ((tempData&0x02)!=0)
	{
	    g_TiFlag = 1;

	}

	if ((tempData&0x01)!=0)
	{
	    g_RiFlag = 1;
	}
		
}

⌨️ 快捷键说明

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