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

📄 r591_init.c

📁 这是在KEIL环境下写的CAN源码
💻 C
字号:

 /*******************************底层数据处理 written by Meng Zhao   BJUT********************************/
/*********this program is used to exchange data format & set CANfilter & initiate CAN Controller *******/

/* Get data from receivebuffer or send data to transmitbuffer,exchange data fromat between buffer and CANOpen*/

#include "can.h"
#include "canpc.h"
#include "can.h"
#include "REG591.h"

unsigned char rec_status=0;
unsigned char send_status=0;


/*Receive*/
void Rec_message(CAN_MSG data *ReceiveBuf)
{
  unsigned long identifier;
  unsigned char length;
  unsigned char i;

   if(CANSTA&0X01)
  {
     CANADR=RX;
     length=CANDAT&0X0F;
     identifier=(unsigned long )CANDAT;
     identifier<<=8;
         identifier  |= (unsigned long) CANDAT;
     identifier>>=5;

        for(i=0;i<length;i++)
	{
	   ReceiveBuf->BUF[i]=CANDAT;
    }

       ReceiveBuf->ID=identifier;
	 ReceiveBuf->LEN=length;
	 CANCON=0X0C;
	 rec_status=1;
 }
 }

/*Send*/
void Trans_message(CAN_MSG data *TransBuf)
 {
   unsigned long ID;
   unsigned char length;
   unsigned char i;

  while(!TBS);
	 length=TransBuf->LEN;
	 ID=(unsigned char)(TransBuf->ID<<5);
	 CANADR=TX;
	 CANDAT=0X0F&length;
	 CANDAT=(unsigned char)(TransBuf->ID>>3);
	 CANDAT=ID&0XF0;
	 for(i=0;i<length;i++)
	   {
	     CANDAT=TransBuf->BUF[i];
	   }
	 CANCON=0X01;
	 send_status=1;
  }

/*set CANfilter*/
 void SetCanfilter(unsigned char filternum,unsigned long CANID,bit RTR,unsigned char AMR0,unsigned char AMR1,unsigned char AMR2,unsigned char AMR3)
{
  CANADR=ACFEN;
  switch(filternum)
   {
     case 0:
	  CANDAT&=0XFE;
	   break;
	  case 1:
	  CANDAT&=0XFB;
	   break;
	   case 2:
	  CANDAT&=0XEF;
	   break;
	   case 3:
	  CANDAT&=0XBF;
	   break;
	}


  CANADR=ACR10+(filternum*8);//* 验收滤波器的配置 Bank1的滤波器1配置为接收ID  */
  CANDAT=(unsigned char)(CANID>>3);
   if(RTR)
  CANDAT=((unsigned char)(CANID<<5))|0X10;
  else
  CANDAT=(unsigned char)((CANID<<5)&0XE0);
  CANADR=AMR10+(filternum*8);
  CANDAT=AMR0;
  CANDAT=AMR1;
  CANDAT=AMR2;
  CANDAT=AMR3;
  CANADR=ACFEN;
  switch(filternum)
   {
     case 0:
	  CANDAT|=0X01;
	   break;
	  case 1:
	  CANDAT|=0X04;
	   break;
	   case 2:
	  CANDAT|=0X10;
	   break;
	   case 3:
	  CANDAT|=0X40;
	   break;
	}

  }
/*initiate the pelican*/
  void Can_init() //将BTR0,BTR1 做形参,以便进行波特率变换
{
unsigned char j;
CANMOD=0X01;   //复位
P1M1=P1M1&0XFD;//TXDC设置为推免模式
P1M2=P1M2|0X02;
EA=1;
ECAN=1;

CANSTA=0X03;//使能接收和发送中断
CANADR=BTR0;//CAN为速率为125kbit/s
CANDAT=0X42;
CANADR=BTR1;
CANDAT=0X2B;
CANADR=ACR10;//初始化滤波器
 for(j=0;j<32;j++)
  {
  CANDAT=0X00;
  }

CANADR=ACFMOD;//使用单验收滤波器,仅使用标准桢
CANDAT=0X55;
CANADR=ACFPRIO;//如果信息通过滤波器,产生接收中断
CANDAT=0X55;
CANADR=ACFEN;//使能各滤波器
CANDAT=0X55;
CANMOD=0X00;//选择操作模式,退出CAN控制器复位模式
}


void reset_communication(void)
{
  CANOpen_init(0X46);
}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -