📄 canc.c
字号:
#include "2407c.h"
//rbx2 id-0x18 加入标准id标识符调试程序
//rbx2 id-0x100-0x1ff 加入标识符屏蔽调试
//0-7 save data, 8 save word number save received data
unsigned int CanRxBuff[9];
int i;
int NUM;
int CAN_FLAG;
void system_init(); //声明程序中要用到的函数
void CAN_INIT();
void CANMBX_ISR();
void inline disable() //中断屏蔽子程序
{
asm(" setc INTM");
}
void inline enable() //中断使能子程序
{
asm(" clrc INTM");
}
/*main program*/
main()
{
system_init(); //系统初始化
CAN_FLAG=0x00; //清CAN用户标识,CAN_FLAG=01表示接收到数据
NUM=0X00;
CAN_INIT(); //CAN初始化程序
enable(); //中断使能
for(;;)
{
*CANTCR=0X20; //请求发送
while(*CANTCR&0x2000==0)
*CANTCR=0X2000;
// while((*CANIFR&0X0400)!=0X0400)
// continue;
// *CANRCR=0X0040;
while(CAN_FLAG==0);
CAN_FLAG=0; //接收到中断标志
NUM=0;
*CANMDER=0X0000; //邮箱不使能
*CANMCR=0X0140; //CDR=1,邮箱数据改变请求
*CANMBX3A=*CANMBX2A+1; //更新邮箱3的数据
*CANMBX3B=*CANMBX2B+1;
*CANMBX3C=*CANMBX2C+1;
*CANMBX3D=*CANMBX2D+1;
*CANMCR=0x04C0; //DBO=1,CDR=0,ABO=1,STM=1
*CANMDER=0X04C; //ME2=ME3=1,MBX2接收,MBX3发送
}
}
/*system initialization*/
void system_init()
{
asm(" setc INTM"); //禁止所有中断
asm(" setc SXM"); //抑制符号位扩展
asm(" clrc OVM"); //B0被配置为数据存储空间
asm(" clrc CNF"); //累加器中结果正常溢出
*WDCR=0xE8; //不使用看门狗
*SCSR1=0x83FE; //cpu时钟,保留为设1,pll时钟频率为20MHZ,预分频选择2分频
WSGR=0x01c0; /*Data space & Prog Space 0 wait state,IO space 7 wait states*/
*IMR=0x0010; //只开通中断优先级5
*IFR=0xFFFF; //清中断标志位
}
/*CAN initialization*/
void CAN_INIT()
{
*MCRB=*MCRB|0x0C0; //设置管脚IOP6、IOP7为CANRX,CANTX
*CANIFR=0xFFFF; //清所有can中断标志
*CANLAM1H=0x60ff; //设置邮箱2、3的屏蔽ID寄存器
*CANLAM1L=0xffff; //0则ID必须匹配
*CANMCR=0x1040; //CCR=1,改变配置请求;STM=1,自测试模式
while(*CANGSR&0x0010==0); //当cce=1时可配置bcr1,bcr2寄存器
*CANBCR2=0x0f; //波特率预分频寄存器,设置为125kbps
*CANBCR1=0x073;
*CANMCR=*CANMCR&0xEFFF; //CCR=0,改变配置结束请求
while(*CANGSR&0x0010!=0); //当cce=0时 bcr1,bcr2寄存器配置成功
*CANMDER=0x040; //MD2配置成接收邮箱,MD3为发送邮箱
*CANMCR=0x0143; //CDR=1,选择邮箱3,数据域改变请求位,接收邮箱的数据不能改变
*CANMSGID2H=0x4f00; //设置邮箱2的控制字及标识符,AME1=1,使能标识符屏蔽
*CANMSGID2L=0xffff; //AAM=0,不自动应答远程帧请求
// *CANMSGCTRL2=0x08; 如果对接收邮箱数据域进行写入操作,可能引起错误中断
// *CANMBX2A=0x0000;
// *CANMBX2B=0x0000;
// *CANMBX2C=0x0000;
// *CANMBX2D=0x0000;
*CANMSGID3H=0x4fff; //配置邮箱3的控制域和数据域
*CANMSGID3L=0xffff;
*CANMSGCTRL3=0x08;
*CANMBX3A=0x2211;
*CANMBX3B=0x4433;
*CANMBX3C=0x6655;
*CANMBX3D=0x8877;
*CANMCR=0x04C0; //数据字节次序位DBO=1,自动恢复总线位ABO=1,自测试模式
*CANMDER=0x4C;
*CANIMR=0xF7FF; //中断MBX3不使能,中断MBX2使能,低中断级优先
*CANIFR=0xFFFF; //清全部中断标志
for(i=0;i<9;i++)
{
CanRxBuff[i]=0x00;
}
}
/*interrupt program*/
void interrupt GRIS5()
{
switch(*PIVR)
{
case 64: //邮箱2接收到相应的信息,进入中断服务程序。64是十进制数
if(((*CANIFR)&0x0400)!=0) //判断MIF2标志位,信息接收成功则该位置1
{
CanRxBuff[0]=((*CANMBX2A)&(0x00ff));
NUM+=1;
CanRxBuff[1]=(*CANMBX2A&0Xff00)>>8;
NUM+=1;
CanRxBuff[2]=*CANMBX2B&0X00ff;
NUM+=1;
CanRxBuff[3]=(*CANMBX2B&0X00ff)>>8;
NUM+=1;
CanRxBuff[4]=*CANMBX2C&0X00ff;
NUM+=1;
CanRxBuff[5]=(*CANMBX2C&0X00ff)>>8;
NUM+=1;
CanRxBuff[6]=*CANMBX2D&0X00ff;
NUM+=1;
CanRxBuff[7]=(*CANMBX2D&0X00ff)>>8;
NUM+=1;
CanRxBuff[8]=NUM;
CANMBX_ISR();
}
break;
default:
break;
}
}
void CANMBX_ISR()
{
*CANRCR=0X040;
CAN_FLAG=1;
}
void interrupt nothing() //假中断程序
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -