📄 can总线局域网.txt
字号:
#define ID 0xa1 /*本节点ID*/
#define TOID 0xa0 /*目标ID*/
static unsigned char data Rxbuff[13]; /*CAN接收缓冲区*/
static unsigned char data Txbuff[13]; /*发送到CAN的缓冲区*/
void Delay1ms(unsigned int count);
void TJA1000_Init(void);
void tdata_can(void); /*发送CAN*/
void trdata_can(void); /*报文回送*/
void canfarm(void); /*前端发送*/
void sys_init(void); /*部分系统初始化*/
/**************************初始化CAN**************************/
void TJA1000_init(void)
{
unsigned char i;
SJA_adr=MODE; /*指向模式寄存器*/
*SJA_adr=0x01; /*进入复位模式*/
while(*SJA_adr&0x01); /*等待进入复位模式*/
SJA_adr=CDR; /*指向时钟分频*/
*SJA_adr=0x88; /*指向中断允许寄存器*/
SJA_adr=IER;
*SJA_adr=0x0d;
SJA_adr=AMR;
for(i=0;i<4;i++)
{
*(SJA_adr+i)=0x00;
}
SJA_adr=ACR;
*SJA_adr=0x00;
SJA_adr=ACR+1;
*SJA_adr=0x00;
SJA_adr=ACR+2;
*SJA_adr=0x00;
SJA_adr=ACR+3;
*SJA_adr=ID;
SJA_adr=BTR0;
*SJA_adr=0x07;
SJA_adr=BTR1;
*SJA_adr=0xFF; /*设置为50kbps 要为100kbps 则84A7H*/
SJA_adr=OCR;
*SJA_adr=0xaa;
SJA_adr=RBSA;
*SJA_adr=0x00;
SJA_adr=TXERR; /*指向发送错误寄存器*/
*SJA_adr=0x00; /*清除*/
SJA_adr=ECC; /*指向错误代码寄存器*/
i=*SJA_adr; /*通过读清除*/
SJA_adr=MODE;
*SJA_adr=0x00; /*设置双滤波接收*/
}
/****************CAN发送函数****************************/
void tdata_can(unsigned char *p)
{
unsigned char st,i,tt;
SJA_adr=SR;
do{ st=*SJA_adr; } /*读CAN状态*/
while(st&0x10); /*是否在接收*/
do{ st=*SJA_adr; }
while(!(st&0x08)); /*先前是否成功*/
do{ st=*SJA_adr; }
while(!(st&0x04)); /*判断缓冲区是否锁定*/
SJA_adr=TXB;
*SJA_adr=tt=Rxbuff[0];
tt=tt&0x0f;
tt+=4;
for(i=1;i<=tt;i++)
{
*(SJA_adr+i)=Txbuff[0];
}
SJA_adr=CMR;
*SJA_adr=0x01; /*启动发送*/
}
/*************报文回送**********************************/
void trdata_can(void)
{
Txbuff[0]=0x88;
Txbuff[1]=0;
Txbuff[2]=TOID;
Txbuff[3]=0;
Txbuff[4]=ID;
Txbuff[50]=0xAA;
tdata_can();
}
/***********************CAN接收*******************************/
void rec_can(void) interrupt 2 using 1
{
unsigned char st,i;
SJA_adr=SR;
st=*SJA_adr;
st&=0xc3;
recok=0; /*报文成功接收*/
huisong=0; /*回送成功是否*/
if(st)
{
if(st&0x80)
{
SJA_adr=IR;
st=*SJA_adr;
SJA_adr=MODE;
*SJA_adr=0x00; /*恢复总线*/
}
else
{
SJA_adr=IR;
st=*SJA_adr;
if(st&0x08)
{
SJA_adr=CMR;
*SJA_adr=0x0c;
}
else
{
if(st&0x01)
{
SJA_adr=RXB;
st=*SJA_adr;
Rxbuff[0]=st;
st&=0x0f;
st=st+4;
for(i=1;i<st;i++)
{
Rxbuff[i]=*(SJA_adr+i);
}
/**********注意ID不是的话回不回送**********/
if(Rxbuff[5]==0x55) huisong=0;
else huisong=1;
recok=1; /*接收报文成功*/
SJA_adr=CMR;
*SJA_adr=0x04;
SJA_adr=ALC;
st=*SJA_adr;
SJA_adr=ECC;
st=*SJA_adr;
}
else
{
recok=0;
SJA_adr=ALC;
st=*SJA_adr;
SJA_adr=ECC;
st=*SJA_adr;
}
}
}
}
}
/*********************DELAY1MS********************/
void Delay1ms(unsigned int count)
{
unsigned int loop0,loop1,loop3;
for(loop0 = 0; loop0 < count; loop0++ )
for(loop1 = 0 ;loop1 < 65; loop1++)
{
loop3 = 10 ;
while(loop3!=0) loop3-- ;
}
}
/*******************部分系统初始化********************/
void sys_init(void)
{
IE=0;
IT1=0;
EX1=1;
EA=1;
}
/****************************下层发送***************************/
void canfarm(void)
{
unsigned char i,j,ljh;
j=0;
Txbuff[0]=0x88;
Txbuff[1]=0;
Txbuff[2]=TOID;
Txbuff[3]=0;
Txbuff[4]=ID;
Txbuff[5]=??;
Txbuff[6]=??;
Txbuff[7]=??;
Txbuff[8]=??;
Txbuff[9]=??;
Txbuff[10]=??;
ljh=0;
for(i=5;i<=10;i++) ljh=ljh+Txbuff[i];
Txbuff[11]=ljh;
/*********发送**********/
do
{
tdata_can();
while(!recok);
recok=0;
if(huisong)
{
for(i=0;i<13;i++)
Txbuff[i]=Rxbuff[i];
trdata_can();
huisong=0;
}
if(Rxbuff[11]==ljh) j=1;
}
while(j);
j=0
}
/****************************PC发送***************************/
void cansend(void)
{
unsigned char i,j,ljh;
j=0;
/*********发送**********/
do
{
tdata_can();
while(!recok);
recok=0;
if(huisong)
{
for(i=0;i<13;i++)
Txbuff[i]=Rxbuff[i];
trdata_can();
huisong=0;
}
if(Rxbuff[11]==ljh) j=1;
}
while(j);
j=0
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -