?? testcan.c
字號:
#include <REG52.H>
//#include <AT89X51.H>
#include <SJA_BCANCONF.H>
//#include <SJA_BCANFUNC.C>
#include <display_s.h>
#include <string.h>
void Init_Cpu(void);
void Init_T0(void);
void Sja_1000_Init(void);
void disp_ok(void);
void disp_err(void);
bit flag_sec;
unsigned char data a[5];
unsigned char data send_data[10],rcv_data[10];
unsigned char databuf,sec_data,second;
unsigned char data Tmod_data;
unsigned char bdata flag_init;
sbit rcv_flag=flag_init^0;
sbit err_flag=flag_init^2;
void main(void)
{
Sja_1000_Init(); //initialize Sja100
Init_T0(); //initialize T0
Init_Cpu(); //initialize mcu
flag_init=0x00;
while(1)
{
if(rcv_flag) //if there is receive interrupt
{
rcv_flag=0;
BCAN_DATA_RECEIVE(rcv_data);
BCAN_CMD_PRG(0x04);
disp_ok();
}
if(flag_sec) //
{
flag_sec=0; //send data if reach 1 s
//send_data[0]=0xaa; //Basic can
send_data[0]=0x48; //Pelican
send_data[1]=0xaa;
send_data[2]=0x00;
send_data[3]=second;
BCAN_DATA_WRITE(send_data);
BCAN_CMD_PRG(0x12);
}
if (err_flag)
{
err_flag=0;
disp_err();
Sja_1000_Init();
}
display(a);
}
}
void ex0_int(void) interrupt 0 using 1
{
SJA_BCANAdr=REG_INTERRUPT;
flag_init=*SJA_BCANAdr;
}
void T0_int(void) interrupt 1 using 2
{
TR0=0;
sec_data--;
if(sec_data==0)
{
sec_data=0x10;
TH0=0x80;
TL0=0x60;
flag_sec=1;
second++;
}
TR0=1;
}
void Init_Cpu(void)
{
PX0=1;
IT0=1;
EX0=1;
ET0=1;
EA=1;
sec_data=0x10;
}
void Init_T0(void)
{
Tmod_data=TMOD;
Tmod_data&=0xf0;
Tmod_data|=0x01;
TMOD=Tmod_data;
TH0=0x80;
TL0=0x60;
TR0=1;
sec_data=0x20;
second=0x00;
}
void Sja_1000_Init(void)
{
bit s;
s=BCAN_CREATE_COMMUNATION();
s=BCAN_ENTER_RETMODEL();
s=BCAN_SET_OUTCLK(0xaa,0xc8); //Pelican
s=BCAN_SET_BANDRATE(0x04);
s=BCAN_SET_OBJECT(0xaa,0xff);
//s=BCAN_SET_OUTCLK(0xaa,0x48);
s=BCAN_SET_MOD();
s=BCAN_QUIT_RETMODEL();
SJA_BCANAdr=REG_IER;
*SJA_BCANAdr|=0xff;
SJA_BCANAdr=REG_CONTROL;
//*SJA_BCANAdr|=0x1e;
}
void disp_ok(void)
{
a[0]=0x00;
a[1]=0x11;
a[2]=0x10;
databuf=rcv_data[2];
databuf>>=0x04;
a[3]=databuf;
databuf=rcv_data[2];
databuf=databuf&0x0f;
a[4]=databuf;
}
void disp_err(void)
{
a[0]=0x00;
a[1]=0x0e;
a[2]=0x10;
a[3]=0x0f;
a[4]=0x0c;
}
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)
{
unsigned char TempData;
SJA_BCANAdr = REG_CONTROL; //訪問地址指向控制寄存器
TempData= *SJA_BCANAdr; //保存原始值
*SJA_BCANAdr=(TempData|0x01); //置位復(fù)位請求
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); //清除復(fù)位請求
if((*SJA_BCANAdr&0x01) == 0)
{
return 0; //
}
else
{
return 1; //退出成功
}
}
unsigned char code SJA_BTR_CODETAB[]={
0x53,0x2F, // ;20KBPS的預(yù)設(shè)值
0x87,0xFF, //;40KBPS的預(yù)設(shè)值
0x47,0x2F, //;50KBPS的預(yù)設(shè)值
0x83,0xFF, //;80KBPS的預(yù)設(shè)值
0x43,0x2f, //;100KBPS的預(yù)設(shè)值
0x03,0x1c, //;125KBPS的預(yù)設(shè)值
0x81,0xfa, //;200KBPS的預(yù)設(shè)值
0x01,0x1c, //;250KBPS的預(yù)設(shè)值
0x80,0xfa, //;400KBPS的預(yù)設(shè)值
0x00,0x1c, //;500KBPS的預(yù)設(shè)值
0x80,0xb6, //;666KBPS的預(yù)設(shè)值
0x00,0x16, //;800KBPS的預(yù)設(shè)值
0x00,0x14 //;1000KBPS的預(yù)設(shè)值
};
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];
//將波特率的的預(yù)設(shè)值裝入sja1000的總線定時器
SJA_BCANAdr=REG_BTR0; //訪問地址指向總線定時寄存器0
*SJA_BCANAdr=BTR0_num; //寫入?yún)?shù)
if(*SJA_BCANAdr != BTR0_num) //校驗(yàn)寫入值
{
return 1;
}
SJA_BCANAdr=REG_BTR1; //訪問地址指向總線定時寄存器0
*SJA_BCANAdr=BTR1_num; //寫入?yún)?shù)
if(*SJA_BCANAdr != BTR1_num) //校驗(yàn)寫入值
{
return 1;
}
return 0;
}
bit BCAN_SET_OBJECT(unsigned char BCAN_ACR,unsigned char BCAN_AMR)
{
SJA_BCANAdr=REG_TxBuffer5; //訪問地址指向驗(yàn)收屏蔽寄存器(AMR)
*SJA_BCANAdr=BCAN_AMR; //寫入?yún)?shù)
*(SJA_BCANAdr+1)=BCAN_AMR;
*(SJA_BCANAdr+2)=BCAN_AMR;
*(SJA_BCANAdr+3)=BCAN_AMR;
if(*SJA_BCANAdr != BCAN_AMR) //校驗(yàn)寫入值
{
return 1;
}
SJA_BCANAdr=REG_TxBuffer1; //訪問地址指向驗(yàn)收代碼寄存器(ACR)
*SJA_BCANAdr=BCAN_ACR; //寫入?yún)?shù)
if(*SJA_BCANAdr != BCAN_ACR) //校驗(yàn)寫入值
{
return 1;
}
return 0;
}
bit BCAN_SET_OUTCLK (unsigned char Out_Control,
unsigned char Clock_Out)
{
SJA_BCANAdr=REG_OCR ; //訪問地址指向輸出控制寄存器
*SJA_BCANAdr=Out_Control; //寫入?yún)?shù)
if(*SJA_BCANAdr != Out_Control) //校驗(yàn)寫入值
{
return 1;
}
SJA_BCANAdr=REG_CDR; //訪問地址指向輸出控制寄存器
*SJA_BCANAdr=Clock_Out; //寫入?yún)?shù)
return 0;
}
bit BCAN_DATA_WRITE(unsigned char *SendDataBuf)
{
unsigned char TempCount;
SJA_BCANAdr = REG_STATUS; //訪問地址指向狀態(tài)寄存器
if((*SJA_BCANAdr&0x08) == 0) //判斷上次發(fā)送是否完成
{
return 1;
}
if((*SJA_BCANAdr&0x04)==0) //判斷發(fā)送緩沖區(qū)是否鎖定
{
return 1;
}
SJA_BCANAdr = REG_TxBuffer1; //訪問地址指向發(fā)送緩沖區(qū)1
if((SendDataBuf[0]&0x40)==0) //判斷RTR,從而得出是數(shù)據(jù)幀還是遠(yuǎn)程幀
{
TempCount =(SendDataBuf[0]&0x0f)+3; //輸入數(shù)據(jù)幀
}
else
{
TempCount =3; //遠(yuǎn)程幀
}
memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
return 0;
}
bit BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf)
{
unsigned char TempCount;
SJA_BCANAdr = REG_STATUS; //訪問地址指向狀態(tài)寄存器
if((*SJA_BCANAdr&0x01)==0) //判斷報文是否有效
{
return 1;
}
SJA_BCANAdr = REG_RxBuffer1; //訪問地址指向接收緩沖區(qū)2
if((*SJA_BCANAdr&0x40)==0) //如果是數(shù)據(jù)幀
{
TempCount=(*SJA_BCANAdr&0x0f)+3; //計算報文中數(shù)據(jù)的個數(shù)
}
else
{
TempCount=3;
}
SJA_BCANAdr = REG_RxBuffer1; //訪問地址指向接收緩沖區(qū)1
memcpy(RcvDataBuf,SJA_BCANAdr,TempCount);//讀取接收緩沖區(qū)的報文
return 0;
}
bit BCAN_CMD_PRG(unsigned char cmd)
{
SJA_BCANAdr=REG_COMMAND; //訪問地址指向命令寄存器
*SJA_BCANAdr=cmd; //啟動命令字
switch(cmd)
{
case TR_CMD: //發(fā)送請求命令
return 0;
break;
case SRR_CMD: //自接收請求
return 0;
break;
case AT_CMD: //夭折發(fā)送命令
SJA_BCANAdr = REG_STATUS; //訪問地址指向狀態(tài)寄存器
if((*SJA_BCANAdr & 0x20)==0)//判斷是否正在發(fā)送
{
return 0;
}
else
{
return 1;
}
break;
case RRB_CMD: //釋放接收緩沖區(qū)
SJA_BCANAdr = REG_STATUS; //訪問地址指向狀態(tài)寄存器
if((*SJA_BCANAdr & 0x01)==1)//判斷是否釋放成功
{
return 1;
}
else
{
return 0;
}
break;
case COS_CMD: //清除超載狀態(tài)
SJA_BCANAdr = REG_STATUS; //訪問地址指向狀態(tài)寄存器
if((*SJA_BCANAdr & 0x02)==0)//判斷清除超載是否成功
{
return 0;
}
else
{
return 1;
}
break;
/* case GTS_CMD: //進(jìn)入睡眠狀態(tài)命令
return 0;
break; */
default:
return 1;
break;
}
}
bit BCAN_SET_MOD(void)
{
unsigned char TempData;
SJA_BCANAdr=REG_CONTROL;
TempData= *SJA_BCANAdr;
*SJA_BCANAdr=(TempData|0x04);
if ((*SJA_BCANAdr&0x04)==0)
{
return 1;
}
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -