基于C8051F040的CAN总线控制接口设计浅析
2020-06-03侯庆果成彦林
侯庆果?成彦林
摘 要 以往的CAN总线设计往往采用单片机和外围CAN控制器的方式设计,该设计集成度不高,软件设计灵活度不高,本文介绍了内部集成了CAN控制器的单片机C8051F040的使用方法,设计了相应的外围接口电路,分析了内部CAN控制器及通信接口的硬件及软件设计,并给出了其软件实现方法。
关键词 C8051F040;CAN控制器;接口
引言
CAN总线最初应用在早期的汽车工业中,由德国Bosch公司最先提出。CAN总线是一种功能强大的控制器局域网总线,速率高达1Mbps,并且具有极强的抗干扰能力和软件纠错能力,软硬件开发流程相对简单,产品维护性好、可靠性高,此外,CAN总线传输数据实时性好,因此,在汽车工业、数控机床及军工设备等领域得到广泛应用。
1C8051F040内部CAN控制器
CAN 控制器包含一个CAN 控制器内核、消息RAM、消息处理状态机和控制寄存器。因此, CAN控制器只能完成协议的解析,无法完成接口的物理驱动。图1 所示为CAN 控制器的原理框图。
CAN控制器内核由CAN协议控制器和用于消息传输的串行移位寄存器组成。消息RAM中的32个消息对象可以任意配置为数据传输对象。输入数据、消息对象及其标识掩码被协议控制器解析后存储在CAN消息RAM中。在没有CPU干预的情况下,CAN控制器即可完成所有数据传输过滤协议处理。 这样可以最小化用于CAN通信的CPU带宽[1]。
2CAN总线硬件接口设计
因为C8051F040中内部集成了CAN总线控制器,因此,硬件接口设计时只需外接总线接口驱动模块以及相应的滤波电路就可建立CAN总线接口。本设计采用广州金升阳公司生产的TD301DCANH3作为CAN总线接口驱动模块,该驱动模块是将隔离电源、芯片信号隔离及收发控制集成于一体的CAN总线收发模块,可实现2500VDC的电气隔离,并具有ESD保护功能。其硬件设计原理图如图2所示[2]。
3CAN总线接口软件设计
CAN总线接口软件主要完成各子模块的设计,子模块之间相互独立,封装性较好,可以方便地用于基于该单片机设计的相关项目的开发应用,对不同的工程或者要求可以很方便地进行新的功能开发。具体子模块如下所示[3]。
3.1 系统初始化
系统初始化主要完成总线波特率设置并启动CAN总线,软件设计如下所示。
/************************************
* 函数名称:StartCAN;
* 函数功能描述:CAN启动函数;
***********************************/
void StartCAN (void)
{
SFRPAGE = CAN0_PAGE;
CAN0CN |= 0x41;
CAN0ADR = BITREG;
CAN0DAT = 0x5EC3;
CAN0ADR = IF1CMDMSK;
CAN0DAT = 0x0088;
CAN0ADR = IF2CMDMSK;
CAN0DATL = 0x1F;
CAN0CN |= 0x06;
CAN0CN &= ~0x41; //启动CAN
}
3.2 发送和接收程序
发送接收程序通过设置或者读取相关寄存器的值来完成数据的收发过程,具体发送及接收程序如下所示。
/************************************* 函数名称:CANTransmitdata;
* 函数功能描述:CAN发送一帧数据函数;
************************************/
void CANTransmitdata(unsigned char MsgNumber,unsigned char *pdtr,unsigned char len)
{
unsigned char num;
SFRPAGE = CAN0_PAGE;
CAN0ADR = IF1CMDMSK;
CAN0DAT = 0x0087;
CAN0ADR = IF1DATA1;
for(num=0;num { CAN0DATH = *++pdtr; CAN0DATL = *--pdtr; pdtr=pdtr+2; } CAN0ADR = IF1CMDRQST; CAN0DATL = MsgNumber; } /************************************* 函数名称:CANReceivedata; * 函数功能描述:CAN接收一帧数据函数; ************************************/ void CANReceivedata (unsigned char MsgNumber,unsigned char *pdtr,unsigned char len) { unsigned char i; SFRPAGE = CAN0_PAGE; CAN0ADR = IF2CMDMSK; CAN0DATL = 0x0f; CAN0ADR = IF2CMDRQST; CAN0DATL = MsgNumber; CAN0ADR = IF2DATA1; for(i=0;i { *++pdtr = CAN0DATH; *--pdtr = CAN0DATL; pdtr=pdtr+2; } } 4结束语 本文论述了基于C8051F040 的CAN总线接口设计,介绍了CAN控制器内部原理、接口硬件及软件设计方法,该设计硬件上简单、可靠,軟件设计简便、易懂,在速度控制伺服系统产品充分验证了软硬件运行的正确性及可靠性,达到了预期的效果。 参考文献 [1] 童长飞.C8051F系列单片机开发与C语言编程[M].北京:北京航空航天大学出版社,2005:117. [2] 牛跃听,周立功.CAN总线嵌入式开发[M].北京:北京航空航天大学出版社,2016:56. [3] 张培仁,孙力.C8051F系列单片机原理与应用[M].北京:清华大学出版社,2013:209. 作者简介 侯庆果(1980-),男,江苏南京人;现就职单位:南京长江电子信息产业集团有限公司,研究方向:电子设备整机技术管理。 成彦林(1980-),男,江苏连云港人;现就职单位:南京长江电子信息产业集团有限公司,研究方向:电子设备整机系统联调。