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

📄 sjabcanfunc.c

📁 51单片机驱动can控制器sja1000的源程序
💻 C
字号:
/*
********************************************************************************************************************
**描述:    独立的CAN 控制器SJA1000基本功能实现头文件定义(BasicCAN 工作方式)
**文件名:   SJABcanFunc.c
**应用语言: KEIL C51
**版本 :    V1.0
**广州周立功单片机发展有限公司 保留所有的版权
********************************************************************************************************************
*/
//#pragma	SRc(SJABcanFUNC.asm)
#define		_SJABCANFUNC_GLOBAL_

/*
************************************************************************************************************************
**							 导入头文件
************************************************************************************************************************
*/
#include	"includes.H"


/*
***********************************************************************
*以下为基本的函数实现源代码                                 *
***********************************************************************
*/
/*
***********************************************************************
 *函数原型:  bit   BCAN_CREATE_COMMUNATION(void)						* 
 *参数说明:  无 														*
 *返回值:																*
 *			 0 ; 表示SJA1000接口正常									*
 *			 1 ; 表示SJA1000与处理器接口不正常							*
 *																		* 
 *说明:该函数用于检测CAN控制器的接口是否正常							*
 ***********************************************************************
 */
 bit   BCAN_CREATE_COMMUNATION(void)
{
	bit		Flag;
	WriteDataToSJA1000(REG_TEST,0xAA);		 //写入测试值
    if(ReadDataFromSJA1000(REG_TEST) == 0xaa)
    {
        Flag=0;                          //读测试正确
    }
    else
    {    
       Flag=1;
    } 
	if(!Flag)
	{
		WriteDataToSJA1000(REG_TEST, 0x55); 	 //写入测试值
		if(ReadDataFromSJA1000(REG_TEST) == 0x55)
		{
			Flag=0; 						 //读测试正确
			WriteDataToSJA1000(REG_TEST, 0x00);
		}
		else
		{	 
		   Flag=1;
		} 

	}
	return (Flag);
}

/*
***********************************************************************
 *函数原型:      bit   BCAN_ENTRY_RETMODEL(void)                         *
 *参数说明:  无                                                         *
 *返回值:                                                               *
 *           0 ; 表示成功退出复位工作模式                               *
 *           1 ; 表示不能退出复位工作模式                               *
 *                                                                      * 
 *说明:      CAN控制器退出复位工作模式                                  *
 ***********************************************************************
 */ 
 bit   BCAN_ENTRY_RETMODEL(void)
 {
 	bit		flag;
	unsigned   char		ErrorCount=20;
    unsigned   char   TempData=ReadDataFromSJA1000(REG_CONTROL);
	while(ErrorCount --)
	{
		WriteDataToSJA1000(REG_CONTROL,TempData|0x01);       		
	    if((ReadDataFromSJA1000(REG_CONTROL)&0x01) != 0)
	    {
	       flag=0;                               
	       break;
	    }
	    else
	    {
	       flag=1;                             
	    }
	}
	return(flag);
 }

 /*
 ***********************************************************************
  *函数原型:	  bit	BCAN_QUIT_RETMODEL(void)						 *
  *参数说明:  无														 *
  *返回值:																 *
  * 		  0 ; 表示成功退出复位工作模式								 *
  * 		  1 ; 表示不能退出复位工作模式								 *
  * 																	 * 
  *说明:	  CAN控制器退出复位工作模式 								 *
  ***********************************************************************
  */ 
  bit	BCAN_QUIT_RETMODEL(void)
  {
	 bit	 flag;
	 unsigned	char	 ErrorCount=20;
	 unsigned	char   TempData=ReadDataFromSJA1000(REG_CONTROL);
	 while(ErrorCount --)
	 {
		 WriteDataToSJA1000(REG_CONTROL,TempData&0xfe); 			 
		 if((ReadDataFromSJA1000(REG_CONTROL)&0x01) == 0)
		 {
			flag=0; 							  
			break;
		 }
		 else
		 {
			flag=1; 							
		 }
	 }
	 return(flag);
  }


 /*
 ************************************************************************************************************************
 **函数原型:  char	 SJASetBandRateStandard(unsigned char	 BandRateSize)
 **参数说明:  BandRateSize		   标准常用波特率(Kbps) 		 
 ** 			 0					 5
 ** 			 1					 10
 ** 			 2					 20
 ** 			 3					 40
 ** 			 4					 50
 ** 			 5					 80
 ** 			 6					 100
 ** 			 7					 125
 ** 			 8					 200
 ** 			 9					 250
 ** 			 10 				 400
 ** 			 11 				 500
 ** 			 12 				 666
 ** 			 13 				 800
 ** 			 14 				 1000		   
 **返回值:		 
 ** 		  0 				   ; 设置总线定时器成功
 ** 		  SJA_SETBTR_ERR	   ; 设置总线定时器错
 ** 		  SJA_NOBTRSIZE 	   ;波特率不能设为此值
 **
 **说明:	 该函数用于设定在系统晶体为16MHZ时,常用的标准波特率的值。
 ** 		 参数BandRateSize只能为0~14,其它的值会返回SJA_NOBTRSIZE错误
 ** 		 本函数只能用于复位模式
 ************************************************************************************************************************
 */
 unsigned  char  code	 SJA_BTR_CODETAB[]={
	 0xbf,0xff, 					 //;5KBPS的预设值
	 0x67,0x2f, 					 //;10KBPS的预设值
	 0x53,0x2F, 					//;20KBPS的预设值
	 0x87,0xFF, 					//;40KBPS的预设值
	 0x47,0x2F, 					//;50KBPS的预设值
	 0x83,0xFF, 					//;80KBPS的预设值
	 0x43,0x2f, 					//;100KBPS的预设值
	 0x03,0x1c, 					//;125KBPS的预设值
	 0x81,0xfa, 					//;200KBPS的预设值
	 0x01,0x1c, 					//;250KBPS的预设值
	 0x80,0xfa, 					//;400KBPS的预设值
	 0x00,0x1c, 					//;500KBPS的预设值
	 0x80,0xb6, 					//;666KBPS的预设值
	 0x00,0x16, 					//;800KBPS的预设值
	 0x00,0x14						//;1000KBPS的预设值
   };
 bit BCAN_SET_BANDRATE(unsigned char CAN_ByteRate)
 {
	 
	 bit	 		ErrorFlag =1;		 
	 unsigned	 char	 ErrorCount = 0x20; 			 //32次报错
	 if(CAN_ByteRate>14){
		 ErrorFlag =1;
	 }
	 else{
		 while(--ErrorCount)
		 {
			 WriteDataToSJA1000(REG_BTR0,SJA_BTR_CODETAB[CAN_ByteRate*2]);
			 WriteDataToSJA1000(REG_BTR1,SJA_BTR_CODETAB[CAN_ByteRate*2+1]);
			 if(ReadDataFromSJA1000(REG_BTR0) != SJA_BTR_CODETAB[CAN_ByteRate*2])
			 {
			 	continue;
			 }
			 if(ReadDataFromSJA1000(REG_BTR1) != SJA_BTR_CODETAB[CAN_ByteRate*2+1])
			 {
			 	continue;
			 }
			 ErrorFlag=0;
			 break;
			 
		 }//while结束
		 
	 }
	 return  ErrorFlag ;
 }

 /*
 ***********************************************************************
 ;*函数原型:	BCAN_SET_OBJECT 										 *
 *参数说明: 															 *
  *    BCAN_ACR:存放验收代码寄存器(ACR)的参数设置 					 *
  *    BCAN_AMR:存放接收屏蔽寄存器(AMR)的参数设置 					 *
 ;*返回值:																 *
 ;* 		  0 ;通信对象设置成功										 *
 ;* 		  1 ;通信对象设置失败										 *
 ;* 																	 * 
 ;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3) 。	 *
 ;* 	允许接收的报文,是由AMR和ACR共同决定的.							 *	
 ;*    满足以下条件的ID号的报文才可以被接收 							 *
 ;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111 			 *
 ;*    该子程序只能用于复位模式 										 *																													   *			 
 ;***********************************************************************
 */
 bit	BCAN_SET_OBJECT(unsigned char  BCAN_ACR,unsigned char  BCAN_AMR)
 {
 	bit	 		ErrorFlag =1;		 
	unsigned	 char	 ErrorCount = 0x20; 			 //32次报错
	while(ErrorCount--)
	{
		WriteDataToSJA1000(REG_ACR, BCAN_ACR);
		WriteDataToSJA1000(REG_AMR, BCAN_AMR);
		if(ReadDataFromSJA1000(REG_ACR)!= BCAN_ACR) 	  //校验写入值
		{
		  	continue;
		}
		if(ReadDataFromSJA1000(REG_AMR)!= BCAN_AMR) 	  //校验写入值
		{
		  	continue;
		}
		ErrorFlag =0;
		break;
	}
 
   return	 ErrorFlag;
 }
 /*
 ***********************************************************************
 ;*函数原型: bit  BCAN_SET_OUTCLK (unsigned char Out_Control,			 *
								   unsigned char  Clock_Out);			 *
 ;*参数说明:															 *
  *    Out_Control:存放输出控制寄存器 (OC)	的参数设置					 *
  *    Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置					 *
  * 																	 *	 
 ;*返回值:																 *
 ;* 		  0 ;设置成功												 *
 ;* 		  1 ;设置失败												 *
 ;* 																	 * 
 ;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式		 *																													   *			 
 ;***********************************************************************
 */
 bit  BCAN_SET_OUTCLK (unsigned char Out_Control,	 
					  unsigned char  Clock_Out)
 {
 	
 	bit	 		ErrorFlag =1;		 
	unsigned	 char	 ErrorCount = 0x20; 			 //32次报错
	while(ErrorCount--)
	{
		WriteDataToSJA1000(REG_OCR, Out_Control);
		WriteDataToSJA1000(REG_CDR, Clock_Out);
		if(ReadDataFromSJA1000(REG_OCR)!= Out_Control) 	  //校验写入值
		{
		  	continue;
		}
		if(ReadDataFromSJA1000(REG_CDR)!= Clock_Out) 	  //校验写入值
		{
		  	continue;
		}
		ErrorFlag =0;
		break;
	}
   return	 ErrorFlag;
 }
 /*
 ***********************************************************************
  *函数原型:  bit	BCAN_DATA_WRITE(unsigned char *SendDataBuf)*
  *参数说明:  特定帧各式的数据

⌨️ 快捷键说明

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