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

📄 can591_pelifunc.c

📁 can总线通信的以C51庫文件
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 ********************************************************************************************************************
 *描述:    P8XC591CANpelican模式应用函数文件
 *文件名:   CAN591_PELIfunc.C
 *应用语言: KEIL C51
 *版本 :    V1.0
 *广州周立功单片机发展有限公司 保留所有的版权
 ********************************************************************************************************************
 */
#define		_SJA_PELICAN_MODE_
#define		_GLOBAL_CAN591_PELI_APP_

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

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

/*
************************************************************************************************************************
**函数原型:  char   SJAEntryResetMode(void)
**参数说明:  无
**返回值:
**           SJA_OK             ; 表示CAN591进入复位模式成功
**           SJA_ENTRYRESET_ERR ; 表示CAN591进入复位模式失败
**
**说明:     该函数用于使591进入复位模式
************************************************************************************************************************
*/
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             ; 表示CAN591退出复位模式成功
**           SJA_QUITRESET_ERR  ; 表示CAN591退出复位模式失败
**
**说明:     该函数用于使591退出复位模式,进入工作模式
************************************************************************************************************************
*/
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  SetBitMask(unsigned char RegAdr,unsigned char BitValue)
**参数说明:  RegAdr     要设置位的寄存器地址
**           BitValue   要设置的值
**返回值:
**           SJA_OK       ; 表示设置值 成功
**           SJA_INIT_ERR ; 表示设置值 失败
**
**说明:     该函数用于置位591某寄存器的某位
************************************************************************************************************************
*/
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 ; 表示位清除 失败
**
**说明:     该函数用于清除591某寄存器的某位
************************************************************************************************************************
*/
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   ; 表示CAN591处于复位模式
**           1   ; 表示CAN591处于工作模式
**
**说明:     该函数用于测试CAN591 处于复位模式还是工作模式
************************************************************************************************************************
*/
char   SJATestRstMode(void)
{
    char    SjaFlag;
    if((ReadSJAReg(REG_CAN_MOD)&RM_RR_BIT) ==  RM_RR_BIT){
        SjaFlag  =  0;
    }
    else{
        SjaFlag  = 1 ;
    }
    return (SjaFlag);
}

/*
************************************************************************************************************************
**函数原型:  char   SJASetCanIne(unsigned char  canint)
**参数说明:  canint   设置中断使能值
**返回值:
**           0				  ; 设置中断使能寄存器成功
**			 SJA_SETIER_ERR	  ; 设置中断使能寄存器失败
**
**说明:     该函数用于591的CAN中断使能设置
************************************************************************************************************************
*/
char   SJASetCanIER(unsigned char canint)
{
    char    SjaFlag;
    if(WriteSJAReg(REG_CAN_IER,canint)==0)
        SjaFlag  =  0;
    else{
        SjaFlag  = SJA_SETIER_ERR ;
    }
    return (SjaFlag);  
}

/*
************************************************************************************************************************
**函数原型:  char   SJASetAccMode(unsigned char accmode)
**参数说明:  accmode      代码验收滤波器工作模式
**返回值:
**           0				      ; 设置代码验收滤波器工作模式寄存器成功
**			 SJA_SETACRMODE_ERR	  ; 设置代码验收滤波器工作模式寄存器错误
**
**说明:     该函数用于设置591代码验收滤波器工作模式
************************************************************************************************************************
*/
char   SJASetAccMode(unsigned char accmode)
{
    char    SjaFlag;
    if(WriteSJAReg(REG_CAN_ACFMOD,accmode)==0)
        SjaFlag  =  0;
    else{
        SjaFlag  = SJA_SETACFMODE_ERR ;
    }
    return (SjaFlag);  
}

/*
************************************************************************************************************************
**函数原型:  char   SJASetAccPrio(unsigned char accprio)
**参数说明:  accprio      代码验收滤波器优先级
**返回值:
**           0				      ; 设置代码验收滤波器优先级寄存器成功
**			 SJA_SETACRPRIO_ERR	  ; 设置代码验收滤波器优先级寄存器错
**
**说明:     该函数用于设置591代码验收滤波器优先级
************************************************************************************************************************
*/
char   SJASetAccPrio(unsigned char accprio)
{
    char    SjaFlag;
    if(WriteSJAReg(REG_CAN_ACFPRIO,accprio)==0)
        SjaFlag  =  0;
    else{
        SjaFlag  = SJA_SETACFPRIO_ERR ;
    }
    return (SjaFlag);  
}

/*
************************************************************************************************************************
**函数原型:  char   SJASetAccEN(unsigned char accEN)
**参数说明:  accEN      代码验收滤波器使能
**返回值:
**           0				      ; 设置代码验收滤波器使能寄存器成功
**			 SJA_SETACREN_ERR	  ; 设置代码验收滤波器使能寄存器错
**
**说明:     该函数用于设置591代码验收滤波器使能
************************************************************************************************************************
*/
char   SJASetAccEN(unsigned char accEN)
{
    char    SjaFlag;
    if(WriteSJAReg(REG_CAN_ACFEN,accEN)==0)
        SjaFlag  =  0;
    else{
        SjaFlag  = SJA_SETACFEN_ERR ;
    }
    return (SjaFlag);  
}

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

/*
************************************************************************************************************************
**函数原型:  char	SJASetAccMask(unsigned char  ACF_NUM , unsigned char	amr0,unsigned char amr1,
**							      unsigned char	amr2,unsigned char amr3  	
**							      )
**参数说明:  ACF_NUM    代码验收屏蔽寄存器的组号

⌨️ 快捷键说明

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