📄 can.txt
字号:
采集版程序
void CAN_init(void):初始化CAN
void CAN_send(void):CAN发送数据
变量:unsigned char LsStatA[8],LsStatB[8]; //模块状态帧
unsigned char LsOrderA[8],LsOrderB[8];//联锁命令帧
unsigned char AddrA; //模块地址
unsigned char LedCount; //LED通讯指示灯点亮计时
unsigned int OrderStopCount;//通讯中断计时
unsigned char CommStat;//收到新命令标识 0x55代表收到新命令,其它表示未收到新命令
常量:(CANBT1)Baud_BT1;(CANBT2)Baud_BT2;(CANBT3)Baud_BT3;
PG0控制通讯灯
void set_band(void)
{
CANBT1=Baud_BT1;
CANBT2=Baud_BT2;
CANBT3=Baud_BT3;
}
//初始化参CAN
void CAN_init(void)
{
CANGCON |= (1<<SWRES); //设置为复位模式
//---------设置波特率-----------
set_band();
//----------CAN使能---------------
//设置接收MOB(mob0)
CANPAGE = 0x00;
CANSTMOB = 0x00;
CANCDMOB = 0x08;
//初始化标识码寄存器CANIDT
CANIDT4 = 0x00;
CANIDT3 = 0x00;
CANIDT2 = 0x00;
CANIDT1 = AddrA;
//初始化标识码屏蔽寄存器CANIDM
CANIDM4=0x00;
CANIDM3=0x00;
CANIDM2=0x00;
CANIDM1=0xFF;
//设置发送MOB(mob1)
CANPAGE = 0x10;
CANSTMOB = (1 << TXOK);
CANCDMOB = 0x08;
//初始化标识码寄存器CANIDT
CANIDT4 = 0x00;
CANIDT3 = 0x00;
CANIDT2 = 0x80;
CANIDT1 = AddrA;
//初始化标识码屏蔽寄存器CANIDM
CANIDM4=0x00;
CANIDM3=0x00;
CANIDM2=0xFF;
CANIDM1=0xFF;
CANGIE = 0xA0; //使能接收中断
//CANEN1 = 0x00;
//CANEN2 = 0x01;
CANIE1 = 0x00;
CANIE2 = 0x01;
CANPAGE = 0x00;
CANCDMOB = 0x88; //CAN MOB接收使能,CAN报文数据长度为8字节
CANGCON = 0x02; //设置CAN使能
}
/***********canit中断服务程序**************/
#pragma interrupt_handler canit_isr:iv_CAN
void canit_isr(void)
{
unsigned int i,data;
CANGIE &= ~(1 << ENRX); //关接收中断
CANPAGE = 0x00;
data = CANSIT2;
if(data & (1 << 0))//若是收到信息MOB0中断
{
for(i = 0;i < 8; i++)
LsOrderA[i] = CANMSG;
}
else
{
CANGIE |= (1 << ENRX); //设置CAN使能
return;
}
for(i = 0;i < 8; i++)
LsOrderB[i] = LsOrderA[i];
CANSTMOB &= ~(1 << RXOK); //清中断标志
PORTG &= ~(1 << PG0); //PG0清零,通信灯亮
LedCount = 0; //计数器清零
OrderStopCount=0; //通讯中断计时
CommStat = 0x55;
//更新标识码寄存器CANIDT
CANIDT4 = 0x00;
CANIDT3 = 0x00;
CANIDT2 = 0x00;
CANIDT1 = AddrA;
//更新标识码屏蔽寄存器CANIDM
CANIDM4=0x00;
CANIDM3=0x00;
CANIDM2=0x00;
CANIDM1=0xFF;
CANGIE |= (1 << ENRX); //设置CAN使能
CANCDMOB = 0x88;
}
void CAN_send(void)
{
unsigned int i;
if(CommStat!=0x55) //判断是否通信处理
{
return;
}
CommStat=0xaa;
//-----------发送-----------------
CANGIE &= ~(1 << ENRX);
CANPAGE = 0x10;
//CANCDMOB = 0x08;
for(i = 0; i < 8; i++)
CANMSG = LsStatA[i];
CANCDMOB = 0x48;
for(i = 0; i < 5000; i++)
{
if(CANSTMOB&(1<<TXOK))
{
CANSTMOB&=~(1<<TXOK);
break;
}
}
CANCDMOB = 0x00;
//更新标识码寄存器CANIDT
CANIDT4 = 0x00;
CANIDT3 = 0x00;
CANIDT2 = 0x00;
CANIDT1 = AddrA;
CANGIE |= (1 << ENRX); //设置CAN使能
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -