📄 sja_pelican.c
字号:
//----------------------------------------------------------------------
// FileName : SJA_PeliCan.c
// Description: PeliCan 功能实现文件
// DateTime : 2006-05-11 Create
// Author : jztx-liuweiming
// Version : TxCmsPrj Ver1.0
//----------------------------------------------------------------------
// SJA1000, 16M晶振 PeliCan模式, 2006年5月11日开始调试, 参考周立功源代码
// 锦州拓新电力电子公司 刘伟明
//----------------------------------------------------------------------
/************************************************************************
**描述: 独立的CAN 控制器SJA1000基本硬件头文件定义(PeliCAN 工作方式)
**文件名: SJA_PeliCan.H
**应用语言: KEIL C51
**版本 : V1.0
**广州周立功单片机发展有限公司 保留所有的版权
*************************************************************************/
#include "SJA_PeliCan.H"
#include <string.h>
/************************************************************************
*以下为基本的函数说明(BasicCAN) *
************************************************************************/
/************************************************************************
*函数原型: bit PCan_SelfTest(void) *
*参数说明: 无 *
*返回值: *
* 0 ; 表示SJA1000接口正常 *
* 1 ; 表示SJA1000与处理器接口不正常 *
* *
*说明: 该函数用于检测CAN控制器的接口是否正常 *
************************************************************************/
bit PCan_SelfTest(void)
{
Sja_PeliCan = REG_TEST; //访问测试寄存器
*Sja_PeliCan = 0xAA; //写入测试值
if ( *Sja_PeliCan == 0xAA )
{
return 0; //读测试正确
}
else
{
return 1;
}
}
/************************************************************************
*函数原型: bit PCan_Select_PeliModel(void) *
*参数说明: 无 *
*返回值: *
* 0 ; 表示成功选择Peli模式 *
* 1 ; 表示不能选择Peli模式 *
* *
*说明: CAN控制器选择Peli模式 *
************************************************************************/
bit PCan_Set_CDR(unsigned char PCan_CDR)
{
unsigned char TempData;
Sja_PeliCan = REG_CDR; //访问地址指向控制寄存器
TempData = *Sja_PeliCan; //保存原始值
*Sja_PeliCan = (TempData | PCan_CDR); //置位复位请求
if ( (*Sja_PeliCan&PCan_CDR) == 1 )
{
return 0;
}
else
{
return 1;
}
}
/************************************************************************
*函数原型: bit PCan_Enter_RstModel(void) *
*参数说明: 无 *
*返回值: *
* 0 ; 表示成功进入复位工作模式 *
* 1 ; 表示不能进入复位工作模式 *
* *
*说明: CAN控制器进入复位工作模式 *
************************************************************************/
bit PCan_Enter_RstModel(void)
{
unsigned char TempData;
Sja_PeliCan = REG_CONTROL; //访问地址指向控制寄存器
TempData = *Sja_PeliCan; //保存原始值
*Sja_PeliCan = (TempData | 0x01); //置位复位请求
if ( (*Sja_PeliCan&0x01) == 1 )
{
return 0;
}
else
{
return 1;
}
}
/************************************************************************
*函数原型: bit PCan_Quit_RstModel(void) *
*参数说明: 无 *
*返回值: *
* 0 ; 表示成功退出复位工作模式 *
* 1 ; 表示不能退出复位工作模式 *
* *
*说明: CAN控制器退出复位工作模式 *
************************************************************************/
bit PCan_Quit_RstModel(void)
{
unsigned char TempData;
Sja_PeliCan = REG_CONTROL; //访问地址指向控制寄存器
TempData = *Sja_PeliCan; //保存原始值
*Sja_PeliCan = (TempData & 0xfe); //清除复位请求
if ( (*Sja_PeliCan&0x01) == 0 )
{
return 0; //退出成功
}
else
{
return 1; //退出失败
}
}
/************************************************************************
;*函数原型: bit PCan_Set_BandRateE(unsigned char CAN_ByteRate) *
;*参数说明: CAN_ByteRate 波特率(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 *
;*以上设置CAN控制器SJA1000通讯波特率. SJA1000的晶振为必须为16MHZ, *
/////////////////////////////////////////////////////////////////////////
;*参数说明: CAN_ByteRate 波特率(Kbit/s) BTR0 BTR1 *
;* 0 5 0EFH 0FFH *
;* 1 10 0D7H 0FFH *
;* 2 20 0CBH 0FFH *
;* 3 40 0C5H 0FFH *
;* 4 50 0C9H 0A7H *
;* 5 80 0C2H 0FFH *
;* 6 100 04H 0A7H *
;* 7 200 02H 025H *
;* 8 250 01H 045H *
;* 9 300 01H 025H *
;* 10 500 01H 012H *
;* 11 600 00H 025H *
;* 12 1000 00H 012H *
;* *
;*以上设置CAN控制器SJA1000通讯波特率. SJA1000的晶振为必须为12MHZ, *
/////////////////////////////////////////////////////////////////////////
;*返回值: *
;* 0 ;波特率设置成功 *
;* 1 ;波特率设置失败 *
;* *
;*说明:其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于 *
;* 复位模式 *
;************************************************************************/
unsigned char code SJA_BTR_CODETAB[]={
0x53,0x2F, //;(晶振16MHZ) 20KBPS的预设值
0x87,0xFF, //;(晶振16MHZ) 40KBPS的预设值
0x47,0x2F, //;(晶振16MHZ) 50KBPS的预设值
0x83,0xFF, //;(晶振16MHZ) 80KBPS的预设值
0x43,0x2f, //;(晶振16MHZ) 100KBPS的预设值
0x03,0x1c, //;(晶振16MHZ) 125KBPS的预设值
0x81,0xfa, //;(晶振16MHZ) 200KBPS的预设值
0x01,0x1c, //;(晶振16MHZ) 250KBPS的预设值
0x80,0xfa, //;(晶振16MHZ) 400KBPS的预设值
0x00,0x1c, //;(晶振16MHZ) 500KBPS的预设值
0x80,0xb6, //;(晶振16MHZ) 666KBPS的预设值
0x00,0x16, //;(晶振16MHZ) 800KBPS的预设值
0x00,0x14 //;(晶振16MHZ) 1000KBPS的预设值
};
bit PCan_Set_BandRate(unsigned char CAN_ByteRate)
{
//载入标准波特率的的预设值
unsigned char BTR0_num, BTR1_num;
BTR0_num = SJA_BTR_CODETAB[CAN_ByteRate*2];
BTR1_num = SJA_BTR_CODETAB[CAN_ByteRate*2 + 1];
Sja_PeliCan = REG_BTR0; //访问地址指向总线定时寄存器0
*Sja_PeliCan = BTR0_num; //写入参数
if ( *Sja_PeliCan != BTR0_num ) //校验写入值
{
return 1;
}
Sja_PeliCan = REG_BTR1; //访问地址指向总线定时寄存器0
*Sja_PeliCan = BTR1_num; //写入参数
if ( *Sja_PeliCan != BTR1_num ) //校验写入值
{
return 1;
}
return 0;
}
/************************************************************************
;*函数原型: bit PCan_Set_Object(unsigned char PCan_ACR0, *
unsigned char PCan_ACR1, *
unsigned char PCan_ACR2, *
unsigned char PCan_ACR3, *
unsigned char PCan_AMR0, *
unsigned char PCan_AMR1, *
unsigned char PCan_AMR2, *
unsigned char PCan_AMR3) *
*参数说明: *
* PCan_ACR:存放验收代码寄存器(ACR)的参数设置 *
* PCan_AMR:存放接收屏蔽寄存器(AMR)的参数设置 *
;*返回值: *
;* 0 ;通信对象设置成功 *
;* 1 ;通信对象设置失败 *
;* *
;*说明:设置CAN节点的通讯对象 *
;* 该子程序只能用于复位模式 *
;************************************************************************/
bit PCan_Set_Object(unsigned char PCan_ACR0,
unsigned char PCan_ACR1,
unsigned char PCan_ACR2,
unsigned char PCan_ACR3,
unsigned char PCan_AMR0,
unsigned char PCan_AMR1,
unsigned char PCan_AMR2,
unsigned char PCan_AMR3)
{
Sja_PeliCan = REG_AcceptCode0; //访问地址指向验收代码寄存器(ACR1)
*Sja_PeliCan = PCan_ACR0; //写入参数
if ( *Sja_PeliCan != PCan_ACR0 ) //校验写入值
{
return 1;
}
Sja_PeliCan = REG_AcceptCode1; //访问地址指向验收代码寄存器(ACR2)
*Sja_PeliCan = PCan_ACR1; //写入参数
if ( *Sja_PeliCan != PCan_ACR1 ) //校验写入值
{
return 1;
}
Sja_PeliCan = REG_AcceptCode2; //访问地址指向验收代码寄存器(ACR3)
*Sja_PeliCan = PCan_ACR2; //写入参数
if ( *Sja_PeliCan != PCan_ACR2 ) //校验写入值
{
return 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -