📄 can初始化程序.c
字号:
#define BASE 0x7F; //定义寻址的基址,P2.7口,低电平有效
#define MODR BASE + 0x00; //PeliCAN模式
#define CMR BASE + 0x01; //设置命令寄存器
#define SR BASE + 0x02; //设置状态寄存器
#define IR BASE + 0x03; //设置中断寄存器
#define IER BASE + 0x04; //中断使能
#define BTR0 BASE + 0x05; //总线定时寄存器的值
#define BTR1 BASE + 0x06;
#define OCR BASE + 0x07; //输出控制寄存器的值
#define ACR0 BASE + 0x10; //设置报文类型
#define ACR1 BASE + 0x11;
#define ACR2 BASE + 0x12;
#define ACR3 BASE + 0x13;
#define AMR0 BASE + 0x14;
#define AMR1 BASE + 0x15;
#define AMR2 BASE + 0x16;
#define AMR3 BASE + 0x17;
#define CDR BASE + 0x1F; //时钟分频寄存器的值
#define BUFDLC BASE + 0x10; //DLC
#define BUFID0 BASE + 0x11; //ID地址
#define BUFID1 BASE + 0x12;
#define BUFID2 BASE + 0x13;
#define BUFID3 BASE + 0x14;
#define BUFDATA0 BASE + 0x15; //数据地址
#define BUFDATA1 BASE + 0x16;
#define BUFDATA2 BASE + 0x17;
#define BUFDATA3 BASE + 0x18;
#define BUFDATA4 BASE + 0x19;
#define BUFDATA5 BASE + 0x1A;
#define BUFDATA6 BASE + 0x1B;
#define BUFDATA7 BASE + 0x1C;
void init_can(void)
{
uchar state;
uchar ACRR[4];
uchar AMRR[4];
ACRR9+[0] = 0x11; // 接收代码寄存器
ACRR[1] = 0x22;
ACRR[2] = 0x33;
ACRR[3] = 0x44;
AMRR[0] = 0x00; // 接收屏蔽寄存器
AMRR[1] = 0Xff;
AMRR[2] = 0x00;
AMRR[3] = 0xff;
Do // 使用do--while语句确保进入复位模式
{ // 设置MOD.0=1--进入复位模式,以便设置相应的寄存器
MODR = 0x09;
state = MODR;
}
while( !(state & 0x01) );
CDR = 0x88; // CDR为时钟分频器,CDR.3=1--时钟关闭,
//CDR.7=0---basic CAN, CDR.7=1---Peli CAN
ACR0 = ACRR[0]; // 初始化接收代码寄存器
ACR1 = ACRR[1];
ACR2 = ACRR[2];
ACR3 = ACRR[3];
AMR0 = AMRR[0]; // 初始化接收屏蔽寄存器
AMR1 = AMRR[1];
AMR2 = AMRR[2];
AMR3 = AMRR[3];
BTR0 = 0x31; // 总线定时寄存器0 ;总线波特率设定
BTR1 = 0x1C; // 总线定时寄存器1 ;总线波特率设定
OCR = 0xAA; // 配置输出控制寄存器
IER = 0x01; // IER.0=1--接收中断使能; IER.1=0--关闭发送中断使能
CMR = 0x04; // 释放接收缓冲器
do // 使用do--while语句确保退出复位模式
{
MODR = 0x08; //MOD.3=0--双滤波器模式
state = MODR;
}
while( state & 0x01 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -