📄 can591_pelifunc.c
字号:
/*
********************************************************************************************************************
*描述: 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 + -