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

📄 sja1000.c

📁 实现485、232信号到can信号的转换。根据需要调整即可。
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************************
**描述:    独立的CAN 控制器SJA1000的Pelican功能实现头文件定义
**文件名:   SJA1000.c
*********************************************************************************/
/*
							 导入头文件
*************************************************************************************************************************/

//#ifdef   _SJA_PELICAN_MODE_
#include <ABSACC.H>
#include <stdio.h>
#include "serial.h"
#include "SJA1000.h"
#include "AT89X52.H"
extern unsigned char debug;
extern unsigned char canbuf[16];
//unsigned char   TxBufCan[LenTxBuf],RxBufCan[LenRxBuf];          //CAN收发缓冲区实体
//unsigned char *inTxBufCan,*outTxBufCan,*inRxBufCan,*outRxBufCan;     //CAN收发缓冲区读写指针
/*
***********************************************************************
*以下为基本的函数实现源代码                                 *
***********************************************************************
*/
/*
***********************************************************************
 *函数原型:  bit   BCAN_CREATE_COMMUNATION(void)						* 
 *参数说明:  无 														*
 *返回值:																*
 *			 0 ; 表示SJA1000接口正常									*
 *			 1 ; 表示SJA1000与处理器接口不正常							*
 *																		* 
 *说明:该函数用于检测CAN控制器的接口是否正常							*
 ***********************************************************************
 */

//测试内存也是这种方法!写进测试单元,然后读出来!
bit   BCAN_CREATE_COMMUNATION(void)
{
	bit		Flag;
	WriteDataToSJA1000(REG_CAN_TEST,0xAA);		 //写入测试值
    if(ReadDataFromSJA1000(REG_CAN_TEST) == 0xaa)
    {
        Flag=0;                          //读测试正确
    }
    else
    {    
       Flag=1;
    } 
	if(!Flag)
	{
		WriteDataToSJA1000(REG_CAN_TEST, 0x55); 	 //写入测试值
		if(ReadDataFromSJA1000(REG_CAN_TEST) == 0x55)
		{
			Flag=0; 						 //读测试正确
			WriteDataToSJA1000(REG_CAN_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_CAN_MOD); 
                                       
	while(ErrorCount --)
	{
		WriteDataToSJA1000(REG_CAN_MOD,TempData|0x09);     //MOD.7是 保留位
                                                           //MOD.4=1,睡眠;没有CAN中断等待和总线活动时,CAN控制器进入睡眠模式
   	  if((ReadDataFromSJA1000(REG_CAN_MOD)&0x09) != 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_CAN_MOD);
	 while(ErrorCount --)
	 {
		 WriteDataToSJA1000(REG_CAN_MOD,TempData&0xfe); 			 
		 if((ReadDataFromSJA1000(REG_CAN_MOD)&0x01) == 0)  //MOD.0=0
                                                       //正常;复位模式位接收到’1-0’的跳变后,CAN控制器回到工作模式
		 {
			flag=0; 							  
			break;
		 }
		 else
		 {
			flag=1; 							
		 }
	 }
	 return(flag);
 }


/*
***********************************************************************
 *函数原型: bit BCAN_SET_BIT(unsigned char REGIDR,unsigned char BitValue) *
 *参数说明:  无                                                         *
 *返回值:                                                               *
 *           0 ; 表示成功退出复位工作模式                               *
 *           1 ; 表示不能退出复位工作模式                               *
 *                                                                      * 
 *说明:      设定SJA寄存器中的某一位为 1                               *
 ***********************************************************************
 */ 


/*
 bit   BCAN_SET_BIT(unsigned char REGIDR,unsigned char BitValue)
 {
 	bit		flag;
	unsigned   char		ErrorCount=20;
    unsigned   char     TempData=ReadDataFromSJA1000(REGIDR);
	while(ErrorCount --)
	{
		WriteDataToSJA1000(REGIDR,TempData|BitValue);       		
	    if((ReadDataFromSJA1000(REGIDR)&BitValue) != 0)
	    {
	       flag=0;                               
	       break;
	    }
	    else
	    {
	       flag=1;                             
	    }
	}
	return(flag);
 }


*/


/*
 ***********************************************************************
  *函数原型:bit	BCAN_CLR_BIT(unsigned char REGIDR,unsigned char BitValue)*
  *参数说明:  无														 *
  *返回值:																 *
  * 		  0 ; 表示成功清0							 *
  * 		  1 ; 表示不能清0								 *
  * 																	 * 
  *说明:	  清0 SJA1000某寄存器中的某一位								 *
  ***********************************************************************
  */


/* 
  bit	BCAN_CLR_BIT(unsigned char REGIDR,unsigned char BitValue)
  {
	 bit	 flag;
	 unsigned	char	 ErrorCount=20;
	 unsigned	char   TempData=ReadDataFromSJA1000(REGIDR);
	 while(ErrorCount --)
	 {
		 WriteDataToSJA1000(REGIDR,TempData&(~BitValue)); 			 
		 if((ReadDataFromSJA1000(REGIDR)&BitValue) == 0)
		 {
			flag=0; 							  
			break;
		 }
		 else
		 {
			flag=1; 							
		 }
	 }
	 return(flag);
  }

*/

/*
 ***********************************************************************
 ;*函数原型: 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次报错
    Clock_Out |= 0x88;                                   //PeliCan模式  //复位默认模式是Basic CAN 模式
	while(ErrorCount--)
	{   
		WriteDataToSJA1000(REG_CAN_OCR, Out_Control);
		WriteDataToSJA1000(REG_CAN_CDR, Clock_Out);
		if(ReadDataFromSJA1000(REG_CAN_OCR)!= Out_Control) 	  //校验写入值
		{
		  	continue;
		}
		if(ReadDataFromSJA1000(REG_CAN_CDR)!= Clock_Out) 	  //校验写入值
		{
		  	continue;
		}
		ErrorFlag =0;
       // WriteDataToSJA1000(REG_CAN_RBSA,ReadDataFromSJA1000(REG_CAN_RBSA)|0x00);
		break;
	}
   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  acr0,unsigned char  acr1,
                        unsigned char  acr2,unsigned char  acr3,
                        unsigned char  amr0,unsigned char  amr1,
                        unsigned char  amr2,unsigned char  amr3
                       )
 {
 	bit	 		ErrorFlag =1;		 
	unsigned	 char	 ErrorCount = 0x20; 			 //32次报错
	while(ErrorCount--)
	{
		WriteDataToSJA1000(REG_CAN_ACR0,acr0);
        WriteDataToSJA1000(REG_CAN_ACR1,acr1);
        WriteDataToSJA1000(REG_CAN_ACR2,acr2);
        WriteDataToSJA1000(REG_CAN_ACR3,acr3);
		WriteDataToSJA1000(REG_CAN_AMR0,amr0);
        WriteDataToSJA1000(REG_CAN_AMR1,amr1);
        WriteDataToSJA1000(REG_CAN_AMR2,amr2);
        WriteDataToSJA1000(REG_CAN_AMR3,amr3);
		if(ReadDataFromSJA1000(REG_CAN_ACR0)!= acr0) 	  //校验写入值
		{
		  	continue;
		}
        if(ReadDataFromSJA1000(REG_CAN_ACR1)!= acr1) 	  //校验写入值
		{
		  	continue;
		}
        if(ReadDataFromSJA1000(REG_CAN_ACR2)!= acr2) 	  //校验写入值
		{
		  	continue;
		}
        if(ReadDataFromSJA1000(REG_CAN_ACR3)!= acr3) 	  //校验写入值
		{
		  	continue;
		}
		if(ReadDataFromSJA1000(REG_CAN_AMR0)!= amr0) 	  //校验写入值
		{
		  	continue;
		}
        if(ReadDataFromSJA1000(REG_CAN_AMR1)!= amr1) 	  //校验写入值
		{
		  	continue;
		}
        if(ReadDataFromSJA1000(REG_CAN_AMR2)!= amr2) 	  //校验写入值
		{
		  	continue;
		}
        if(ReadDataFromSJA1000(REG_CAN_AMR3)!= amr3) 	  //校验写入值
		{
		  	continue;
		}       
		ErrorFlag =0;
		break;
	} 
    return	 ErrorFlag;
 }



/*
 ************************************************************************************************************************
 **函数原型:  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的预设值
	 0x07,0x2f,//0x49,0xc9,//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)
 {
	 

⌨️ 快捷键说明

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