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

📄 sja_pelifunc.c

📁 Small RTOS 下SJA1000驱动程序的编写。主要介绍了在实时操作系统Small RTOS下
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 ********************************************************************************************************************
 *描述:    独立的CAN 控制器SJA1000pelican模式应用函数文件
 *文件名:   SJA_PELI.C
 *应用语言: KEIL C51
 *版本 :    V1.01
 *广州周立功单片机发展有限公司 保留所有的版权
 ********************************************************************************************************************
 */
#define		_SJA_PELICAN_MODE_
#define		_GLOBAL_SJA1000_PELI_APP_

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

/*
************************************************************************************************************************
**                           函数原型说明
************************************************************************************************************************
*/

/*
************************************************************************************************************************
**函数原型:     char   SJATestInterface(unsigned char  testvalue)
**参数说明:     Value  测试值
**返回值:
**              SJA_OK            ; 表示SJA1000接口正常
**              SJA_INTERFACE_ERR ; 表示SJA1000与处理器接口出错
**
**说明:         该函数用于检测CAN控制器的接口是否正常
************************************************************************************************************************
*/
 char    SJATestInterface(unsigned char  testvalue)
 {
    char			status=0;
	bit		ErrorFlag =1;
	unsigned	char 	ErrorCount = 0x20;							//32次报错
	unsigned	char  	temp = testvalue; 
	while(--ErrorCount){
    	//WriteSJAReg(REG_CAN_TEST,testvalue);
		WriteSJAReg(REG_CAN_TEST,temp);
    	if(ReadSJAReg(REG_CAN_TEST) ==  temp){
			temp =~temp ;
			WriteSJAReg(REG_CAN_TEST,temp);
			if(ReadSJAReg(REG_CAN_TEST) ==  temp){
						temp =0;
            			WriteSJAReg(REG_CAN_TEST,temp);
						ErrorFlag =0;
						break;
			}
			else	continue;
    	}
	}
    if(ErrorFlag){
       status  =  SJA_INTERFACE_ERR ;
    }
    return (status);
 }

/*
************************************************************************************************************************
**函数原型:  char   SJAEntryResetMode(void)
**参数说明:  无
**返回值:
**           SJA_OK             ; 表示SJA1000进入复位模式成功
**           SJA_ENTRYRESET_ERR ; 表示SJA1000进入复位模式失败
**
**说明:     该函数用于使sja1000进入复位模式
************************************************************************************************************************
*/
char   SJAEntryResetMode(void) 
{
   	char			status=0;
   	unsigned	char		ErrorFlag =1;
	unsigned	char 	ErrorCount = 0x20;							//32次报错
	while(--ErrorCount){
		if((status = SetBitMask(REG_CAN_MOD,RM_RR_BIT)) == 0){	
			ErrorFlag =0;
			break;
		}
    }
	if(ErrorFlag){
       status  = SJA_ENTRYRESET_ERR;
	}
    return (status);
}

/*
************************************************************************************************************************
**函数原型:  char   SJAQuitResetMode(void)
**参数说明:  无
**返回值:
**           SJA_OK             ; 表示SJA1000退出复位模式成功
**           SJA_QUITRESET_ERR  ; 表示SJA1000退出复位模式失败
**
**说明:     该函数用于使sja1000退出复位模式,进入工作模式
************************************************************************************************************************
*/
char   SJAQuitResetMode(void)
{
    char			status=0;
   	unsigned	char		ErrorFlag =1;
	unsigned	char 	ErrorCount = 0x20;							//32次报错
	while(--ErrorCount){
		if((status=ClearBitMask(REG_CAN_MOD,RM_RR_BIT)) == 0){
			ErrorFlag =0;
			break;
		}
	}
	if(ErrorFlag){
       status  = SJA_QUITRESET_ERR;
	}
    return (status);
}

/*
************************************************************************************************************************
**函数原型:  char   SJAEntryPeliCANMode(void)
**参数说明:  无
**返回值:
**           SJA_OK         ; 表示SJA1000进入PeliCAN模式 成功
**           SJA_INIT_ERR   ; 表示SJA1000进入PeliCAN模式 失败
**
**说明:     该函数用于使sja1000进入PeliCAN模式
************************************************************************************************************************
*/
char   SJAEntryPeliCANMode(void)
{
    char			status=0;
    if(SJATestRstMode()){                                //处于工作模式
       status = SJAEntryResetMode();
    }
    if(status == 0){									 //处于复位模式
       status = SetBitMask(REG_CAN_CDR,CANMode_BIT);    //置位sja1000模式控制位
    }
    return (status);
}

/*
************************************************************************************************************************
**函数原型:  char  SetBitMask(unsigned char RegAdr,unsigned char BitValue)
**参数说明:  RegAdr     要设置位的寄存器地址
**           BitValue   要设置的值
**返回值:
**           SJA_OK       ; 表示设置值 成功
**           SJA_INIT_ERR ; 表示设置值 失败
**
**说明:     该函数用于置位sja1000某寄存器的某位
************************************************************************************************************************
*/
char  SetBitMask(unsigned char RegAdr,unsigned char BitValue)
{
    char 			status=0;
    unsigned char   temp;
    temp = ReadSJAReg(RegAdr)|BitValue;
    WriteSJAReg(RegAdr,temp);
    if(ReadSJAReg(RegAdr) == temp){
        status  =  SJA_OK;
    }
    else{
        status  =  SJA_INIT_ERR ;
    }
    return (status);
}

/*
************************************************************************************************************************
**函数原型:  char  ClearBitMask(unsigned char RegAdr,unsigned char BitValue)
**参数说明:  RegAdr     要清除位的寄存器地址
**           BitValue   要清除的值
**返回值:
**           SJA_OK       ; 表示位清除 成功
**           SJA_INIT_ERR ; 表示位清除 失败
**
**说明:     该函数用于清除sja1000某寄存器的某位
************************************************************************************************************************
*/
char  ClearBitMask(unsigned char RegAdr,unsigned char BitValue)
{
    char			status=0;
    unsigned char   temp;
    temp = ReadSJAReg(RegAdr)&(~BitValue);
    WriteSJAReg(RegAdr,temp);
    if(ReadSJAReg(RegAdr) == temp){
        status  =  SJA_OK;
    }
    else{
        status  =  SJA_INIT_ERR ;
    }
    return (status);
}

/*
************************************************************************************************************************
**函数原型:  char   SJATestRstMode(void)
**参数说明:  无
**返回值:
**           0   ; 表示SJA1000处于复位模式
**           1   ; 表示SJA1000处于工作模式
**
**说明:     该函数用于测试SJA1000 处于复位模式还是工作模式
************************************************************************************************************************
*/
char   SJATestRstMode(void)
{
    char    SjaFlag;
    if((ReadSJAReg(REG_CAN_MOD)&RM_RR_BIT) ==  RM_RR_BIT){
        SjaFlag  =  0;
    }
    else{
        SjaFlag  = 1 ;
    }
    return (SjaFlag);
}

/*
************************************************************************************************************************
**函数原型:  char		SJASetOutControl(unsigned char	OutCtrl)
**参数说明:  OutCtrl	输出控制寄存器的设定值
**返回值:		
**           0				    ; 设置输出控制寄存器成功
**			 SJA_SETOCR_ERR		; 设置输出控制寄存器错
**			 SJA_NOTRSTMODE     ; sja1000不在复位模式
**
**说明:     该函数用于设定sja1000的输出控制
************************************************************************************************************************
*/
char		SJASetOutControl(unsigned char	OutCtrl)
{
	char			status=0;
	bit			ErrorFlag=1;
	unsigned	char 	ErrorCount =0x20;				//32次,报错
	if(SJATestRstMode()){                                //处于工作模式
		status = SJA_NOTRSTMODE;			
	}
	else{
		while(--ErrorCount){
			WriteSJAReg(REG_CAN_OCR,OutCtrl);
			if(ReadSJAReg(REG_CAN_OCR) == OutCtrl){
				ErrorFlag=0;
				break;
			}
		}
		if(ErrorFlag){
			status = SJA_SETOCR_ERR;
		}
	}
	return	status;
}

/*
************************************************************************************************************************
**函数原型:  char		SJASetClockDivision(unsigned	char  clockdiv)
**参数说明:  clockdiv	时钟分频寄存器的设定值
**返回值:		
**           0				    ; 设置时钟分频寄存器成功
**			 SJA_SETCDR_ERR		; 设置时钟分频寄存器错
**			 SJA_NOTRSTMODE     ; sja1000不在复位模式
**
**说明:     该函数用于设定sja1000的时钟分频寄存器
************************************************************************************************************************
*///需修改
char		SJASetClockDivision(unsigned	char  clockdiv)
{
	char		status=0;
	bit			ErrorFlag=1;
	unsigned	char 	ErrorCount =0x20;				//32次,报错
	if(SJATestRstMode()){                                //处于工作模式
		status = SJA_NOTRSTMODE;			
	}
	else{
		while(--ErrorCount){
			WriteSJAReg(REG_CAN_CDR,clockdiv);
			if(ReadSJAReg(REG_CAN_CDR) == clockdiv){
				ErrorFlag=0;
				break;
			}
		}
		if(ErrorFlag){
			status = SJA_SETCDR_ERR;
		}
	}
	return	status;
}

/*
************************************************************************************************************************
**函数原型:  char	SJASetAccCode(unsigned char	acr0,unsigned char acr1,
**							  unsigned char	acr2,unsigned char acr3  	
**							  )
**参数说明:  acr0	代码验收寄存器0的设定值
**			 acr1	代码验收寄存器1的设定值
**			 acr2	代码验收寄存器2的设定值
**			 acr3	代码验收寄存器3的设定值
**返回值:		
**           0				      ; 设置代码验收寄存器成功
**			 SJA_SETACR_ERR	  ; 设置代码验收寄存器错
**			 SJA_NOTRSTMODE       ; sja1000不在复位模式
**
**说明:     该函数用于设定报文滤波的代码验收滤波器
************************************************************************************************************************
*/
char	SJASetAccCode(unsigned char	acr0,unsigned char acr1,
				  unsigned char	acr2,unsigned char acr3  	
				  )
{
	char		status=0;
	bit			ErrorFlag=1;
	unsigned	char  	ErrorCount =0x20;				//32次,报错
	if(SJATestRstMode()){                                //处于工作模式
		status = SJA_NOTRSTMODE;			
	}
	else{
		while(--ErrorCount){
		 	WriteSJAReg(REG_CAN_ACR0,acr0);
		 	WriteSJAReg(REG_CAN_ACR1,acr1);
		 	WriteSJAReg(REG_CAN_ACR2,acr2);
		 	WriteSJAReg(REG_CAN_ACR3,acr3);
			if(ReadSJAReg(REG_CAN_ACR0) != acr0)continue;

⌨️ 快捷键说明

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