📄 can_z.c
字号:
#pragma large
#include <reg52.h>
#include <SJA_BCANCONF.H>
#include <absacc.h>
#include <string.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*----------------------------lcd---------------------------------*/
#define clear 0x01 //清屏幕,约1.6ms
#define home 0x02 //光标回零(左上角)
#define f_set 0x30 //并行、基本指令
#define dis_on 0x0f //打开显示,光标,闪烁功能
#define in_mode 0x06 //输入方式,地址增1,光标右移
#define panel_num 10
sbit P_RS=P1^3; //P0^1; P1.5 片选CS高电平选中即有效
sbit P_RW=P1^4; //P0^2; SID
sbit P_E=P1^5; // P0^3; CLK
bdata uchar ab,d;
sbit abit0=ab^0;sbit abit1=ab^1;sbit abit2=ab^2;sbit abit3=ab^3;
sbit abit4=ab^4;sbit abit5=ab^5;sbit abit6=ab^6;sbit abit7=ab^7;
//idata uchar teleph0[17]={0x08,0xfd,0x04,0x0d,0,0,0,0,0,0,0,0,0,0,0,0,0};//0x38,0x36,0x31,0x33,0x38,0x34,0x35,0x31,0x32,
//0x34,0x36,0x34,0x32};
idata uchar str[10];
data uchar start;
//data uchar plat_data;
//uchar i;
/******************/
/*---------------------------------------------------------*/
void delay(uint j) // time=j*10+7 (us)延时函数/
{
data uchar ch;
while(j--)
{
ch++; ch--;
}
}
/*---------------------------------------------------------*/
/****************************************************************
CAN总线数据协议:
0 "1" to "20" 目标ID
1 "0x08" 特定
2 "m" or "p" or "d" 关节的选择
3 "1" to "3" 自身ID
4 "C" or "D" 命令口or数据口的选择
5 "R" or "A" 命令字
6-9 ...... 数据
******************************************************************/
sbit SJA_reset=P2^1;
sbit green=P1^1;
sbit red=P1^2;
unsigned char request_flag,interrupt_flag; //是否为查询
unsigned char data SystemBuf[10]; //系统设置的接收数据缓冲区
unsigned char data SendBuf[10]; //系统设置的发送数据缓冲区
/************************************************************************
*以下为基本的函数说明(BasicCAN) *
************************************************************************/
/************************************************************************
*函数原型: bit BCAN_CREATE_COMMUNATION(void) *
*参数说明: 无 *
*返回值: *
* 0 ; 表示SJA1000接口正常 *
* 1 ; 表示SJA1000与处理器接口不正常 *
* *
*说明:该函数用于检测CAN控制器的接口是否正常 *
************************************************************************/
bit BCAN_CREATE_COMMUNATION(void)
{
SJA_BCANAdr=REG_TEST; //访问测试寄存器
*SJA_BCANAdr =0xaa; //写入测试值
if(*SJA_BCANAdr == 0xaa)
{
return 0; //读测试正确
}
else
{
return 1;
}
}
/************************************************************************
*函数原型: bit BCAN_ENTER_RETMODEL(void) *
*参数说明: 无 *
*返回值: *
* 0 ; 表示成功进入复位工作模式 *
* 1 ; 表示不能进入复位工作模式 *
* *
*说明: CAN控制器进入复位工作模式 *
************************************************************************/
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) *
*参数说明: 无 *
*返回值: *
* 0 ; 表示成功退出复位工作模式 *
* 1 ; 表示不能退出复位工作模式 *
* *
*说明: CAN控制器退出复位工作模式 *
************************************************************************/
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_BANDRATE(unsigned char CAN_ByteRate) *
;*参数说明: R7 波特率(Kbit/s) BTR0 BTR1 *
500K
;*返回值: *
;* 0 ;波特率设置成功 *
;* 1 ;波特率设置失败 *
;* * *
;************************************************************************/
bit BCAN_SET_BANDRATE()
{
unsigned char BTR0_num=0x00; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
unsigned char BTR1_num=0x1c; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//将波特率的的预设值装入sja1000的总线定时器
SJA_BCANAdr=REG_BTR0; //访问地址指向总线定时寄存器0
*SJA_BCANAdr=BTR0_num; //写入参数
if(*SJA_BCANAdr != BTR0_num) //校验写入值
{
return 1;
}
SJA_BCANAdr=REG_BTR1; //访问地址指向总线定时寄存器
*SJA_BCANAdr=BTR1_num; //写入参数
if(*SJA_BCANAdr != BTR1_num) //校验写入值
{
return 1;
}
return 0;
}
/************************************************************************
;*函数原型: 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 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); *
;*参数说明: *
* Out_Control:存放输出控制寄存器 (OC) 的参数设置 *
* Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置 *
* *
;*返回值: *
;* 0 ;设置成功 *
;* 1 ;设置失败 *
;* *
;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式 * *
;************************************************************************/
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)*
*参数说明: 特定帧各式的数据? *
*返回值: *
* 0 ; 表示将数据成功的送至发送缓冲区 *
* 1 ; 表示上一次的数据正在发送, *
* ; 表示发送缓冲区被锁定,不能写入数据 *
* ; 表示写入数据错误 *
*说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动 *
* SJA1000发送。 *
* 特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据 *
* 描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位 *
* *
*注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。 *
* 不指示SJA1000将该数据正确发送到CAN总线上完毕与否 *
************************************************************************/
bit BCAN_DATA_WRITE(unsigned char data *SendDataBuf)
{
unsigned char TempCount;
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; //远程帧
}
memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
return 0;
}
/************************************************************************
*函数原型: bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf); *
*参数说明: RcvDataBuf,存放微处理器保存数据缓冲区 *
*返回值: 0;接收成功 *
* 1;接收失败 *
*说明:CAN控制器接收数据,仅限于接收数据 *
************************************************************************/
bit BCAN_DATA_RECEIVE(unsigned char data *RvcDataBuf)
{
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;
}
SJA_BCANAdr = REG_RxBuffer1; //访问地址指向接收缓冲区1
SystemBuf[0]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer2;
SystemBuf[1]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer3;
SystemBuf[2]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer4;
SystemBuf[3]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer5;
SystemBuf[4]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer6;
SystemBuf[5]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer7;
SystemBuf[6]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer8;
SystemBuf[7]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer9;
SystemBuf[8]=*SJA_BCANAdr;
SJA_BCANAdr = REG_RxBuffer10;
SystemBuf[9]=*SJA_BCANAdr;
//memcpy(RvcDataBuf,SJA_BCANAdr,TempCount);//读取接收缓冲区的报文
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -