📄 can.c
字号:
#include "f2407_c.h" //引用头部文件
int RECEIVE2[4]={0,0,0,0}; //定义标志寄存器
int *p = &RECEIVE2[0];
//int RECEIVE2 = 0;
void system_init(); //声明在程序中需要用到是函数
void CANMBX_ISR();
void CAN_INIT();
void inline disable()
{
asm(" setc INTM");
}
void inline enable()
{
asm(" clrc INTM");
}
//////////////////////////主程序/////////////////////////////////////////////
main()
{
system_init(); //系统初始化子程序
CAN_INIT(); //CAN初始化子程序
enable();
for(;;)
{
switch(RECEIVE2[0])
{
case 0x0AB:
{
MBX3A = 0x2211;
MBX3B = 0x4433;
MBX3C = 0x6655;
MBX3D = 0x8877;
TCR = 0x0020; //MBX3请求发送
while(TCR & 0x2000 == 0); //等待发送成功后进入下一步
TCR=0x2000; //清TA3和MIF3标志位
RECEIVE2[0] = 0;
break;
}
default:
break;
}
}
}
//////////////////////系统初始化子程序///////////////////////////////////////
void system_init()
{
asm(" setc SXM"); // 抑制符号位扩展
asm(" clrc OVM"); // 累加器中结果正常溢出
asm(" clrc CNF"); // B0被配置为数据存储空间
asm(" setc INTM"); // 禁止所有中断
SCSR1 = 0x8312; // CLKIN=20M,CLKOUT=2CLKIN=40M
WDCR = 0x0E8; // 不使能看门狗
IMR = 0x0010; // 开中断优先级5
IFR = 0x0FFFF; // 清除全部中断标志,"写1清0"
}
//////////////////////CAN初始化子程序////////////////////////////////////////
void CAN_INIT()
{
MCRB=MCRB | 0x0C0; //设置IOPC6、IOPC7为CANRX,CANTX
CAN_IFR = 0x0FFFF; //清所有中断标志
LAM1_H = 0x7FFF; //设置邮箱2、3的屏蔽ID寄存器
LAM1_L = 0x0FFFF; //0则ID必须匹配
////////////////////配置位定时器///////////////////////////////////////////
MCR = 0x1000; //CCR=1改变配置请求,正常收发模式
while(GSR & 0x0010 == 0) continue; //CCE=1时,配置BCR2、BCR1寄存器
BCR2 = 0x03; //波特率预分频寄存器
BCR1 = 0x057; //波特率设置为500Kbps
MCR = MCR&0x0EFFF; //配置结束,配置请求位CCR=0
while(GSR & 0x0010 != 0) continue; //当CCE=0时,BCR2、BCR1寄存器配置成功
///////////////////////////////////////////////////////////////////////////
////////////////////初始化油箱/////////////////////////////////////////////////////////
MDER = 0x040; //不使能所有邮箱,邮箱2为接收方式,油箱3为发送方式
MCR = 0x0100; //CDR=1,数据区改变请求
MSGID2H = 0x0447; //设置邮箱2为标准标识符,标准方式为MSGID2H[12~2]
MSGID2L = 0x0FFFF; //与标准信息帧无关
MSGCTRL2 = 0x08; //设置油箱2的控制域,数据帧,数据长度8字节
MBX2A = 0x0000; //邮箱2信息初始化
MBX2B = 0x0000;
MBX2C = 0x0000;
MBX2D = 0x0000;
MSGID3H = 0x0447; //设置邮箱3为标准标识符,标准方式为MSGID2H[12~2]
MSGID3L = 0x0FFFF; //与标准信息帧无关
MSGCTRL3 = 0x08; //设置油箱3的控制域,数据帧,数据长度8字节
MBX3A = 0x0000; //邮箱3信息初始化
MBX3B = 0x0000;
MBX3C = 0x0000;
MBX3D = 0x0000;
MCR = 0x0480; //CDR=0进入正常工作模式
MDER = 0x04C; //使能邮箱2和3,邮箱2为接收方式,3为发送方式
CAN_IMR = 0x0C4FF; //MBX2中断使能,MBX3不使能,低中断优先级
CAN_IFR = 0x0FFFF; //清中断标志
}
//////////////////////中断服务程序///////////////////////////////////////////////////////////
void interrupt CANMBINT5() //邮箱2接收到相应信息则进入中断服务程序
{
switch(PIVR)
{
case 0x040: CANMBX_ISR();
break;
}
IFR = 0X10; //清IFR相应中断标志
enable();
return;
}
void CANMBX_ISR() //邮箱2接收中断服务子程序
{
RCR = 0x040; //RMP2和MIF2位清0
*p = MBX2A;
*(p+1) = MBX2B;
*(p+2) = MBX2C;
*(p+3) = MBX2D;
//RECEIVE2 = MBX2A;
}
////////////////////// 直接返回主程序//////////////////////////////////////////////
void interrupt nothing()
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -