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

📄 can总线局域网.txt

📁 对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 + -