📄 r591_init.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 + -