/*RS232_basiccan.c*/
#include<REG52.H>
#include <intrins.h>
#include<SJA_BCANCONF.H>
#include<SJA_BCANFUNC.C>
//************************函数声明*****************************//
void T1_int(void);
void Sja_1000_Init(void);
//************************变量定义*****************************//
unsigned char data  send_data[10],rcv_data[10];    //发送和接收数组定义
unsigned char bdata flag_init;
unsigned char j,k=2;
sbit rcv_flag=flag_init^0;                          //接收中断标志
sbit err_flag=flag_init^2;                          //错误中断标志
sbit over_flag=flag_init^3;                        //溢出中断
bit  send_flag=0;
sbit CAN_RESET=P2^0;
sbit LED1=P3^4;
sbit LED0=P3^5;
bit  send_over_flag;                                //发送一次结束标志位
//******************************外部中断0*******************//
void ex0_int(void) interrupt 0 using 1
{
SJA_BCANAdr=REG_INTERRUPT;
flag_init=*SJA_BCANAdr;
}
//******************************T1初始化********************//
void T1_int(void)
{
TMOD=0x20;            //定时器1设为方式2
TL1=0xFD;              //定时器初值
TH1=0xFD;
SCON=0x50;            //串口设为方式1,REN=1允许接收
TR1=1;                //启动定时器1
}
void UART_int(void) interrupt 4 using 3/*串口中断接受数据*/
{   
send_data[k]=SBUF;  //写串口数据到发送数组
RI=0;              //接收中断清零
k++;                //
if(k==10)          //接收到8组数据
{k=2;              //
send_flag=1;      //置位发送标志
}
}
//******************************SJA1000初始化********************//
void Sja_1000_Init(void)
{  BCAN_ENTER_RETMODEL();        //进入复位
BCAN_SET_BANDRATE(0x06);      //200K
BCAN_SET_OBJECT(0xa8,0x00);  //设置地址ID:540
BCAN_SET_OUTCLK(0xaa,0x48);  //设置输出方式,禁止COLOCKOUT输出
BCAN_QUIT_RETMODEL();        //退出复位模式
SJA_BCANAdr=REG_CONTROL;      //地址指针指向控制寄存器
*SJA_BCANAdr|=0x1e;          //开放错误\接收\发送中断
}
/
////////////////////////////////////////////////////////////
void can_over_prg(void)
{
EA=0;                                    //总中断关
BCAN_CMD_PRG(0x0c);                      //清数据溢出状态位,释放接收缓冲区
EA=1;     
write的返回值}
/////////////////////////////////////////////////////////////
void can_rcv_prg(void)
{
EA=0;
BCAN_DATA_RECEIVE(rcv_data);            //接收数据
BCAN_CMD_PRG(0x04);                    //释放接收缓冲区
ES=0;                                  //串口中断禁止
for(j=2;j<10;j++)                      //发送8组数据到串口
{
SBUF=rcv_data[j];
while(TI==0)
{}
TI=0;
}
ES=1;                                  //串口中断开放
EA=1;
///////////////把接收到的数据传回
到发送方ID为550的节点///////////////////         
if(send_over_flag==0)
{
rcv_data[0]=0xAA;       
rcv_data[1]=0x08;                      //报文ID:550
EA=0;
BCAN_DATA_WRITE(rcv_data);              //写入数据到缓冲区函数
BCAN_CMD_PRG(0x01);                    //调用发送请求
EA=1;
}
send_over_flag=0;
}
/////////////////////////////////////////////////////////////
void can_send_prg(void)
{
send_data[0]=0xAA;       
send_data[1]=0x08;                      //报文ID:550
EA=0;
BCAN_DATA_WRITE(send_data);            //写入数据到缓冲区函数
BCAN_CMD_PRG(0x01);                    //调用发送请求
EA=1;
send_over_flag=1;
}
//***********************主函数*******************************//
void main(void)
CAN_RESET=0;                                    //SJA1000退出硬件复位模式
Sja_1000_Init();        //initialize Sja100
T1_int();          //initialize T1
PX0=1;                                          //外部中断0高优先级
EX0=1;                                          //外部中断0开放
ES=1;                                          //串口中断开放
EA=1;                                          //开放全局中断
flag_init=0x00;
while(1)
{
if(_testbit_(over_flag))                    //can总线溢出处理
{can_over_prg();} 
if(_testbit_(rcv_flag))                      //can总线接收数据
{can_rcv_prg();}
if(_testbit_(send_flag))                    //can总线发送数据   
{can_send_prg();}
if(_testbit_(err_flag))                      //错误中断
EA=0;
Sja_1000_Init();
EA=1;
}
}
}
/*SJA_BCANFUNC.c*/
#include    "SJA_BCANCONF.H"
#include    <string.h>
/
************************************************************************
*以下为基本的函数说明(BasicCAN)                                      *
************************************************************************/
/************************************************************************
*函数原型:      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             
/
/;*          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                 
//;*返回值:                                                             
//;*          0 ;波特率设置成功                                         
//;*          1 ;波特率设置失败                                         
//;*         
//;*说明:设置CAN控制器SJA1000通讯波特率.SJA1000的晶振为必须为16MHZ,     
//;*    其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于       
//;*    复位模式                                                         
//;************************************************************************/
unsigned  char code 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的预设值
};
bit  BCAN_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];//将波特率的的预设值装入sja1000的总线定时器
SJA_BCANAdr=REG_BTR0;            //访问地址指向总线定时寄存器0
*SJA_BCANAdr=BTR0_num;        //写入参数
if(*SJA_BCANAdr != BTR0_num)  //校验写入值
{
return  1;
}
SJA_BCANAdr=REG_BTR1;          //访问地址指向总线定时寄存器0
*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  ; 表示上一次的数据正在发送,                          *
*                ; 表示发送缓冲区被锁定,不能写

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。