📄 sja1000_peli.c
字号:
/*********************************************************************************************
* File: sja1000_peli.c
* Author: embest
* Desc: hardware definition of CAN controller SJA1000 (BasicCAN Mode)
* History:
* H.T.Zhang, Programming start, September 27, 2005
*********************************************************************************************/
#include "sja1000_peli.h"
#include <string.h>
#include "def.h"
/************************************************************************
*函数原型: int sja_enter_resetmode(void) *
*参数说明: 无 *
*返回值: *
* 1 ; 表示成功进入复位工作模式 *
* 0 ; 表示不能进入复位工作模式 *
* *
*说明: CAN控制器进入复位工作模式 *
************************************************************************/
int sja_enter_resetmode(void)
{
int i;
unsigned char ucTempData;
// for(;;)
{
// for (i=0;i<2000;i++);
SJA_ADDR = REG_MODE;
}
ucTempData =SJA_DATA;//保存原始值
SJA_ADDR = REG_MODE;
SJA_DATA =(ucTempData|0x01);//置位复位请求
SJA_ADDR = REG_MODE;
ucTempData = SJA_DATA;
if((ucTempData&0x01) == 1)
{
return 1;
}
else
{
return 0;
}
}
/************************************************************************
*函数原型: int sja_quit_resetmode(void) *
*参数说明: 无 *
*返回值: *
* 1 ; 表示成功退出复位工作模式 *
* 0 ; 表示不能退出复位工作模式 *
* *
*说明: CAN控制器退出复位工作模式 *
************************************************************************/
int sja_quit_resetmode(void)
{
unsigned char ucTempData;
SJA_ADDR = REG_MODE;
ucTempData = SJA_DATA; //保存原始值
SJA_ADDR = REG_MODE;
SJA_DATA=(ucTempData&0xfe); //清除复位请求
SJA_ADDR = REG_MODE;
ucTempData = SJA_DATA;
if((ucTempData&0x01) == 0)
{
return 1; //退出成功
}
else
{
return 0;
}
}
/************************************************************************
;*函数原型: int sja_set_baudrate(unsigned char CAN_ByteRate) *
;*参数说明: R7 波特率(Kbit/s) BTR0 BTR1 *
;* 0 20 053H, 02FH *
;* 1 40 087H, 0FFH *
;* 2 50 047H, 02FH *
;* 3 80 083H, 0FFH *
;* 4 100 043H, 02fH *
;* 5 125 03H, 01cH *
;* 6 200 081H, 0faH *
;* 7 250 01H, 01cH *
;* 8 400 080H, 0faH *
;* 9 500 00H, 01cH *
;* 10 666 080H, 0b6H *
;* 11 800 00H, 016H *
;* 12 1000 00H, 014H *
;*返回值: *
;* 1 ;波特率设置成功 *
;* 0;波特率设置失败 *
;* *
;*说明:设置CAN控制器SJA1000通讯波特率.SJA1000的晶振为必须为16MHZ, *
;* 其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于 *
;* 复位模式 *
;************************************************************************/
char SJA_BTR_CODETAB[]={
0x53,0x2F, //;20KBPS的预设值
0x87,0xFF, //;40KBPS的预设值
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的预设值
};
int sja_set_baudrate(unsigned char CAN_ByteRate)
{
unsigned char ucTempData;
unsigned char BTR0_num,BTR1_num;
BTR0_num = SJA_BTR_CODETAB[CAN_ByteRate*2];
BTR1_num = SJA_BTR_CODETAB[CAN_ByteRate*2+1];
//将波特率的预设值装入sja1000的总线定时器
SJA_ADDR = REG_BTR0;
SJA_DATA = BTR0_num; //写入参数
SJA_ADDR = REG_BTR0;
ucTempData = SJA_DATA;
if(ucTempData != BTR0_num) //校验写入值
{
return 0;
}
SJA_ADDR = REG_BTR1;
SJA_DATA = BTR1_num; //写入参数
SJA_ADDR = REG_BTR1;
ucTempData = SJA_DATA;
if(ucTempData != BTR1_num) //校验写入值
{
return 0;
}
return 1;
}
/************************************************************************
;*函数原型: sja_set_object *
*参数说明: *
* BCAN_ACR:存放验收代码寄存器(ACR)的参数设置 *
* BCAN_AMR:存放接收屏蔽寄存器(AMR)的参数设置 *
;*返回值: *
;* 1 ;通信对象设置成功 *
;* 0 ;通信对象设置失败 *
;* *
;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3) 。 *
;* 允许接收的报文,是由AMR和ACR共同决定的. *
;* 满足以下条件的ID号的报文才可以被接收 *
;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111 *
;* 该子程序只能用于复位模式 *
;************************************************************************/
int sja_set_object(unsigned char * PCAN_ACR,unsigned char * PCAN_AMR)
{
unsigned char ucTempData;
SJA_ADDR = REG_ACR0;
SJA_DATA = PCAN_ACR[0]; //写入参数
SJA_ADDR = REG_ACR0;
ucTempData = SJA_DATA;
if(ucTempData != PCAN_ACR[0]) //校验写入值
{
return 0;
}
SJA_ADDR = REG_ACR1;
SJA_DATA = PCAN_ACR[1]; //写入参数
SJA_ADDR = REG_ACR1;
ucTempData = SJA_DATA;
if(ucTempData != PCAN_ACR[1]) //校验写入值
{
return 0;
}
SJA_ADDR = REG_ACR2;
SJA_DATA = PCAN_ACR[2]; //写入参数
SJA_ADDR = REG_ACR2;
ucTempData = SJA_DATA;
if(ucTempData != PCAN_ACR[2]) //校验写入值
{
return 0;
}
SJA_ADDR = REG_ACR3;
SJA_DATA = PCAN_ACR[3]; //写入参数
SJA_ADDR = REG_ACR3;
ucTempData = SJA_DATA;
if(ucTempData != PCAN_ACR[3]) //校验写入值
{
return 0;
}
SJA_ADDR = REG_AMR0;
SJA_DATA = PCAN_AMR[0]; //写入参数
SJA_ADDR = REG_AMR0;
ucTempData = SJA_DATA;
if(ucTempData != PCAN_AMR[0]) //校验写入值
{
return 0;
}
SJA_ADDR = REG_AMR1;
SJA_DATA = PCAN_AMR[1]; //写入参数
SJA_ADDR = REG_AMR1;
ucTempData = SJA_DATA;
if(ucTempData != PCAN_AMR[1]) //校验写入值
{
return 0;
}
SJA_ADDR = REG_AMR2;
SJA_DATA = PCAN_AMR[2]; //写入参数
SJA_ADDR = REG_AMR2;
ucTempData = SJA_DATA;
if(ucTempData != PCAN_AMR[2]) //校验写入值
{
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -