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