CANTCON=0x00; //CAN时钟寄存器清零
CANGCON |=0x01; //软件复位
CANBT1=0x06;
CANBT2=0x2a;
CANBT3=0x13; //将通信波特率设定为250kbps
CANIE2 |=0x60; 使MOB5、MOB6有效
CANIE1 |=0x01; 使MOB0有效
CANGIE=0xA0;//启用can中断
CANGCON |=0x02; //CAN控制器启动
}
3 AT90CAN单片机与PCcan通信实例
在此,以如何实现AT90CAN单片机和PC间的CAN通信为例,进一步说明了AT90CAN单片机的CAN功能模块驱动的创建过程,如图2所示,用C语言创建的CAN功能模块驱动PC通过专用的PCICAN模块接收从扩展的CAN接口发送的数据,并将接收到的数据与验收过滤寄存器中设定的ID值进行比较的功能。 如果ID值匹配,则重新创建数据并将其发送到PC。
图2与2PCcan的通信软件流程
以下程序通过实验调试,通信效果良好,可以直接应用。
#include 'ioCAN128v.h '
#包含
#包含
#define fosc 11059200//水晶振动11.0592 MHz
unsignedcharpcsj[8 ]={0x 00,0x 00,0x 00,0x 00,0x 00,0x 00,0x 00,0x 00,0x 00,000,0x 00 }; //数组存储接收到的数据
void main ()//主程序
CLI (; //关闭总中断
void CAN_INIT (; //CAN控制器的初始化
CANPAGE=0x50; 设置MOB5
CANSTMOB=0x00; //清除状态寄存器
CANIDT1=0x02; //CANIDT1~CANIDT4
CANIDT2=0x01; 设置//id过滤器寄存器
CANIDT3=0x00;
CANIDT4=0x00;
CANIDM1=0xff; //canidm 1至canidm 4
CANIDM2=0xff; //设置验收寄存器
CANIDM3=0x00;
CANIDM4=0x00;
CANCDMOB=0x98; //设为可接收
SEI (; //打开总中断
wile(1) {
CANPAGE=0x10; 设置MOB4
CANSTMOB=0x00;
CANIDT1=0x01; //CANIDT1~CANIDT4
CANIDT2=0x01; //设置发送帧ID值寄存器
CANIDT3=0x00;
CANIDT4=0x00;
for(I=0; i8; I ) {
CANMSG=PCSJ[i]; //将收到的数据发回上位机
}
CANCDMOB=0x58; //允许发送
canst mob=~(1,1 )
}
}
中央数据接收由MOB5产生的中断完成,中断服务子程序如下。
# pragma interrupt _ handler can _ ISR :19//can控制器中断向量入口
voidcan_ISR(void ) {
if () cansit20x20 )==0x20 )确定是否由MOB5引起中断
CANPAGE=0x50;
for(I=0; i 8; I ) {
PCSJ[i]=CANMSG;
}
CANSTMOB=0x00; //清除状态位
CANCDMOB=0x98; //重新启用接收功能
}
}
4结论
AVR系列单片机内部有可编程Flash,自带EEPROM,支持JTAG接口芯片内的调试和Flash、EEPROM、保险丝位和锁位编程其内部集成了独立CAN控制器的AT90CAN系列单片机,弥补了单片机在CAN总线通信APP中的缺陷,无需扩展外围CAN通信控制芯片,简化了硬件电路设计本文通过对AT90CAN系列单片机CAN通信模块的详细介绍,旨在说明如何对其编程实现CAN通信功能,为使用单片机进行CAN通信的初学者编程
打开APP阅读更多精彩内容
点击阅读全文