📄 sja_pelifunc.c
字号:
/*
********************************************************************************************************************
*描述: 独立的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 + -