⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sja1000.h

📁 这是一个用单片机控制CAN总线芯片SJA1000传输的C51程序,89C51单片机,sja1000.h是内部寄存器的定义,main.c是传输主程序
💻 H
字号:
#ifndef _BASICCANCONF_H
#define _BASICCANCONF_H
/*定义SJA1000的片选基址*/
#define SJA_BaseAdr 0xFA00
#define REG_CONTROL      SJA_BaseAdr+0x00
#define REG_COMMAND	 SJA_BaseAdr+0x01
#define REG_STATUS	 SJA_BaseAdr+0x02
#define REG_INTERRUPT    SJA_BaseAdr+0x03
#define REG_ACR		 SJA_BaseAdr+0x04
#define REG_AMR		 SJA_BaseAdr+0x05
#define REG_BTR0	 SJA_BaseAdr+0x06
#define REG_BTR1	 SJA_BaseAdr+0x07
#define REG_OCR 	 SJA_BaseAdr+0x08
#define REG_TEST	 SJA_BaseAdr+0x09
/*定义发送缓冲区寄存器定义*/
#define REG_TxBuffer1	 SJA_BaseAdr+0x0A
#define REG_TxBuffer2	 SJA_BaseAdr+0x0B
#define REG_TxBuffer3	 SJA_BaseAdr+0x0C
#define REG_TxBuffer4	 SJA_BaseAdr+0x0D
#define REG_TxBuffer5	 SJA_BaseAdr+0x0E
#define REG_TxBuffer6	 SJA_BaseAdr+0x0F
#define REG_TxBuffer7	 SJA_BaseAdr+0x10
#define REG_TxBuffer8	 SJA_BaseAdr+0x11
#define REG_TxBuffer9	 SJA_BaseAdr+0x12
#define REG_TxBuffer10	 SJA_BaseAdr+0x13
/*定义接受缓冲区寄存器定义*/
#define REG_RxBuffer1	 SJA_BaseAdr+0x14
#define REG_RxBuffer2	 SJA_BaseAdr+0x15
#define REG_RxBuffer3	 SJA_BaseAdr+0x16
#define REG_RxBuffer4	 SJA_BaseAdr+0x17
#define REG_RxBuffer5	 SJA_BaseAdr+0x18
#define REG_RxBuffer6 	 SJA_BaseAdr+0x19
#define REG_RxBuffer7 	 SJA_BaseAdr+0x1A
#define REG_RxBuffer8	 SJA_BaseAdr+0x1B
#define REG_RxBuffer9	 SJA_BaseAdr+0x1C
#define REG_RxBuffer10	 SJA_BaseAdr+0x1D
#define REG_CDR		 SJA_BaseAdr+0x1F
unsigned char xdata 	 *SJA_BCANdr;
/*定义命令字*/
#define  TR_CMD  0x01
#define  AT_CMD  0x02
#define  RRB_CMD 0x04
#define  COS_CMD 0x08
#define  GTS_CMD 0x10
#define  CAN_INTERFACE_0K	0
#define  CAN_BUS_0K		0
#define  CAN_INTERFACE_ERR	0xFF
#define  CAN_ENTRESET_ERR	0xFE
#define  CAN_QUITRESET_ERR	0xFD
#define  CAN_INITOBJECT_ERR	0xFC
#define  CAN_INITBTR_ERR	0xFB
#define  CAN_INITOUTCTL_ERR	0xFA
#define  CAN_INTCLKDIV_ERR	0xF9
#define  CAN_BUS_ERR		0xF8
#define  ByteRate_5k    0x00
#define  ByteRate_10k   0x01
#define  ByteRate_20k 0x02
#define  ByteRate_40k   0x03
#define  ByteRate_50k   0x04
#define  ByteRate_80k   0x05
#define  ByteRate_100k  0x06
#define  ByteRate_160k  0x07
#define  ByteRate_250k  0x08
#define  ByteRate_320k  0x09
#define  ByteRate_500k  0x0a
#define  ByteRate_800k  0x0b
#define  ByteRate_1000k 0x0c
unsigned char xdata *SJA_BCANAdr;
unsigned char idata SJA_BTR_CODETAB[];
bit BCAN_SET_BANDRATE(unsigned char CAN_ByteRate)
{unsigned char BR_Num=CAN_ByteRate,BTR0_num,BTR1_num;
switch(BR_Num)
{case ByteRate_5k:
BTR0_num=0xef;
BTR1_num=0xff;
break;
case ByteRate_10k:
BTR0_num=0xd7;
BTR1_num=0xff;
break;
case ByteRate_20k:
BTR0_num=0xcb;
BTR1_num=0xff;
break;
case ByteRate_40k:
BTR0_num=0xc5;
BTR1_num=0xff;
break;
case ByteRate_50k:
BTR0_num=0xc9;
BTR1_num=0xa7;
break;
case ByteRate_80k:
BTR0_num=0xc2;
BTR1_num=0xff;
break;
case ByteRate_100k:
BTR0_num=0x84;
BTR1_num=0xa7;
break;
case ByteRate_500k:
BTR0_num=0x01;
BTR1_num=0x12;
break;
case ByteRate_1000k:
BTR0_num=0x0;
BTR1_num=0x12;
break;
default:
return 1;
break;}}
bit BCAN_ENTER_RETMODEL(void){
unsigned char TempData;
SJA_BCANAdr = REG_CONTROL; //访问地址指向控制寄存器
TempData= *SJA_BCANAdr; //保存原始值
*SJA_BCANAdr=(TempData|0x01); //置位复位请求
if((*SJA_BCANAdr&0x01) == 1){
return 0;
}
else{
return 1;
}
}
bit BCAN_QUIT_RETMODEL(void) {
unsigned char TempData;
SJA_BCANAdr = REG_CONTROL; //访问地址指向控制寄存器
TempData = *SJA_BCANAdr; //保存原始值
*SJA_BCANAdr=(TempData&0xfe); //清除复位请求
if((*SJA_BCANAdr&0x01) == 0){
return 0;
}
else{
return 1;
}
}
bit BCAN_SET_OBJECT(unsigned char BCAN_ACR,unsigned char BCAN_AMR){
SJA_BCANAdr=REG_ACR; //访问地址指向验收代码寄存器(ACR)
*SJA_BCANAdr=BCAN_ACR; //写入参数
if(*SJA_BCANAdr != BCAN_ACR) { //校验写入值
return 1;
}
SJA_BCANAdr=REG_AMR; //访问地址指向验收屏蔽寄存器(AMR)
*SJA_BCANAdr=BCAN_AMR; //写入参数
if(*SJA_BCANAdr != BCAN_AMR) { //校验写入值
return 1;
}
return 0;
}
bit BCAN_SET_OUTCLK (unsigned char Out_Control,
unsigned char Clock_Out)
{
SJA_BCANAdr=REG_OCR ; //访问地址指向输出控制寄存器
*SJA_BCANAdr=Out_Control; //写入参数
if(*SJA_BCANAdr != Out_Control) { //校验写入值
return 1;
}
SJA_BCANAdr=REG_CDR; //访问地址指向输出控制寄存器
*SJA_BCANAdr=Clock_Out; //写入参数
return 0;
}
bit BCAN_DATA_WRITE(unsigned char *SendDataBuf){
unsigned char TempCount,status;
SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
if((*SJA_BCANAdr&0x08) == 0) { //判断上次发送是否完成
return(1);
}
if((*SJA_BCANAdr&0x04)==0) { //判断发送缓冲区是否锁定
return(1);
}
SJA_BCANAdr = REG_TxBuffer1; //访问地址指向发送缓冲区 1
if((SendDataBuf[1]&0x10)==0) { //判断 RTR 从而得出是数据帧还是远程帧
TempCount =(SendDataBuf[1]&0x0f)+2; //输入数据帧
}
else{
TempCount =2; //远程帧
}
}
bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf) {
unsigned char TempCount;
SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
if((*SJA_BCANAdr&0x01)==0) { //判断报文是否有效
return 1;
}
SJA_BCANAdr = REG_RxBuffer2; //访问地址指向接收缓冲区 2
if((*SJA_BCANAdr&0x10)==0) { //如果是数据帧
TempCount=(*SJA_BCANAdr&0x0f)+2; //计算报文中数据的个数
}
else{
TempCount=2;
}
}
bit BCAN_CMD_PRG(unsigned char cmd) {
SJA_BCANAdr=REG_COMMAND; //访问地址指向命令寄存器
*SJA_BCANAdr=cmd; //启动命令字
switch(cmd){
case TR_CMD: //发送请求命令
return 0;
break;
case AT_CMD: //夭折发送命令
SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
if((*SJA_BCANAdr & 0x20)==0) { //判断是否正在发送
return 0;
}
else{
return 1;
}
break;
case RRB_CMD: //释放接收缓冲区
SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
if((*SJA_BCANAdr & 0x01)==1) { //判断是否释放成功
return 1;
}
else{
return 0;
}
break;
case COS_CMD: //清除超载状态
SJA_BCANAdr = REG_STATUS; //访问地址指向状态寄存器
if((*SJA_BCANAdr & 0x02)==0) { //判断清除超载是否成功
return 0;
}
else{
return 1;
}
break;
case GTS_CMD: //进入睡眠状态命令
return 0;
break;
default:
return 1;
break;
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -