基于C8051F560的CAN总线通信节点设计
2017-06-26张喜文
李 建,张喜文,黄 勇
(西安机电信息技术研究所 2部,陕西 西安 710085)
基于C8051F560的CAN总线通信节点设计
李 建,张喜文,黄 勇
(西安机电信息技术研究所 2部,陕西 西安 710085)
针对汽车、航空等领域中系统内各设备之间的通信对高传输速率、高可靠性的要求,以C8051F560单片机为核心设计CAN总线通信节点来组成CAN总线通信系统以实现系统设备之间的通信,利用C8051F560内集成的CAN控制器进行CAN总线硬件电路设计和软件程序设计,该系统可在最高1 Mbit·s-1的速率下实现多个设备之间的CAN总线通信,且误码率低,方便增加和减少设备,适合用于系统内各设备之间的高速率、高可靠性通信。
CAN总线;C8051F560; CAN控制器;报文对象
现场总线[1]技术是计算机技术、通信技术和控制技术的综合与集成,而CAN总线是国际上应用广泛的现场总线之一,由于具有高性能、高可靠性以及独特的设计,能有效地支持具有较高安全等级的分布式实时控制系统[2]。
CAN总线节点使用较多的是独立CAN 控制器,即把CPU、总线控制器和总线收发器依次连接好后再接入CAN总线网络,为了简化电路、提高总线的利用率、数据的实时性及系统的可靠性,使用Silicon Laboratories公司的内部集成CAN控制器的单片机C8051F560进行CAN 总线的通讯接口的设计及应用[3]。在对CAN模块结构和原理分析的基础上,设计了基于C8051F560内部集成CAN控制器的硬件电路, 并设计了相应的总线数据发送、接收和管理程序,该系统可在最高1 Mbit·s-1的速率下实现多个设备之间的CAN总线通信,误码率低,方便增加和减少设备,适合用于系统内各设备之间的高速率、高可靠性通信[4]。
1 CAN总线技术
CAN总线(Controller Area Network)即控制器局域网,是德国Bosch公司为解决现代汽车中大量的控制与测试仪器间的数据交换而提出的串行数据通信协议,是应用最广泛的现场总线之一。CAN总线是一种多主方式的串行通信总线,基本设计规范要求有高的位速率、高抗电磁干扰性,而且能够检测出产生的任何错误[5]。数据传输速率最高可达1 Mbit·s-1,当传输距离达到10 km时,CAN仍可提供5 kbit·s-1的数据传输速率。由于CAN 串行通讯总线具有这些特性,因此在汽车制造业以及航空工业中受到广泛应用[6]。
CAN总线属于现场总线的范畴,是一种有效支持分布式控制或实时控制的串行通信网络,其优越性在于:CAN控制器工作于多主方式,网络中的各节点都可根据总线访问优先权采用无损结构的逐位仲裁的方式竞争向总线发送数据[7],且CAN协议废除了节点地址编码,而代之以对通信数据进行编码,即CAN总线面向的是数据而不是节点,可使不同节点同时接收到相同数据,并且加入或撤消节点都不会影响网络的正常工作,因此提高了CAN总线网络各节点之间的数据通信实时性以及系统的可靠性和灵活性[8]。
2 C8051F560功能简介
2.1 基本特性
本文使用Silicon公司的内部集成CAN控制器的单片机C8051F560进行CAN总线的通讯接口的设计及应用。Silicon公司的C8051Fxxx系列单片机采用Silicon公司的专利CIP-51微控制器,采用流水线指令结构,70%的指令的执行时间为一个或两个系统时钟周期,在相同时钟下,指令运行速度比一般的80C51系列单片机提高了约10倍,处理能力大幅提高,并且各种外设资源丰富,有利于CAN总线通讯节点上发送和接收的数据的处理,有利于保证CAN总线上数据传输的实时性[9]。而在Silicon公司的内部集成CAN控制器的单片机中,使用较多的C8051F040其MCU需要通过CAN0ADR、CAN0DAT 特殊寄存器, 采用间接寻址方式对CAN模块内的寄存器和RAM 进行访问和传输数据,而C8051F560的CPU可直接访问CAN寄存器,对CAN的应用操作相对更方便,且可以使用50 MHz的外部时钟,比C8051F040具有更高的处理速度,同时C8051F560内部资源丰富,具有32 kB Flash存储器,2 304 Byte的RAM存储器,17个中断源,12 位A/D转换器,2个比较器SPI,UART,CAN,LIN,SMBUS等接口,便于节点对接收到的CAN数据进行处理和通信[10]。
2.1 内置CAN控制器
C8051F560中的CAN控制器是Bosch全功能CAN模块的完全实现,完全符合CAN规范CAN2.0A和CAN2.0B,CAN控制器的原理框图如图1所示[11]。
图1 CAN控制器原理框图
CAN控制器核提供移位(CANTX和CANRX)、消息的串/并转换及其它与协议相关的任务。报文RAM可存储32个可以在CAN网络上发送和接收的报文对象。CAN寄存器和报文处理器为CAN控制器和MCU之间的数据传送和状态通知提供接口。CAN寄存器分为CAN控制器协议寄存器、报文对象接口寄存器、报文处理器寄存器3类[13]。
CAN数据传送流程为MCU通过报文对象接口寄存器访问CAN报文RAM。当向报文接口寄存器IF1或IF2的命令请求寄存器写一个报文对象时,相关接口寄存器(IF1或IF2)的内容被传送到CANRAM中的报文对象或报文对象被传送到接口寄存器。而CAN核通过CAN收发串行寄存器将CANRAM 中的对象发送到CAN总线或接收CAN总线的数据保存在相应的报文RAM中。CAN数据传送流程,如图2所示[13]。
图2 CAN数据传送流程
3 硬件电路设计
C8051F560单片机内部的CAN模块是协议控制器,在使用时需要外加CAN总线收发器提供物理层驱动。采用Philips公司的CAN高速收发器TJA1050,其传输速率最高可达1 Mbit·s-1,TJA1050供电电压为5 V,C8051F560单片机的工作电压为3.3 V,在单片机与收发器之间的数据传输采用光耦隔离,可降低CAN总线上各节点对系统的干扰,并起到匹配电平的作用。常用的方法是采用两个独立的高速光耦对两路CAN信号CANTX和CANRX进行隔离,为进一步简化电路,采用Silicon公司的双通道数字隔离器SI8621隔离CAN信号,SI8621利用光电耦合实现隔离,转换速度可达150 Mbit·s-1,两通道输入输出方向相反,正适合CAN控制器发送数据通道CANTX和接收数据通道CANRX的隔离,因此使用SI8621满足了信号隔离的要求并进一步简化了系统电路。图3为系统电路原图。
图3 CAN总线节点电路图
4 系统软件设计
系统软件采用结构化设计,实行各个子程序模块化,使其对于不同的系统功能或不同的应用环境具有良好的可移植性,方便再次开发。相对于独立CAN控制器的软件设计,C8051F560通过特殊功能寄存器配置内部CAN控制器,读取接收到的数据和写入待发送的数据,使得MCU与CAN模块之间的数据传输更加方便和快速[14]。
系统设计CAN总线的传输波特率为800 kbit·s-1,接收长度为2 Byte的报文后发送长度为2个字节的报文,报文ID为29位扩展标识符,IF1寄存器用于向报文RAM发送数据,IF2寄存器用于从报文RAM读取数据。CAN总线节点的通信主要包括系统初始化程序、接收程序、发送程序等[15]。
4.1 系统初始化
CAN控制器的初始化主要包括:设置CAN模块的传输波特率为800 kbit·s-1,通过IF1设置发送数据的报文对象的报文号为TRANSMIT_MO1,发送报文为扩展帧,ID为29位扩展标识符00000002,发送报文长度为2 Byte,设置接收报文对象的报文号为RECEIVE_MO1,29位扩展标识符用于接收过滤,接收报文ID为00000001,接收报文长度为2 Byte,使能接收中断。CAN初始化流程图如图4所示。
(1)初始化。设置CAN控制寄存器CAN0CN,将Init位置1以允许初始化;将CCE位置1,允许CPU对位时序寄存器进行写操作;将IE位置1,使能模块中断;
(2)设置波特率。对位时间寄存器CAN0BT赋值,将CAN模块的传输波特率设为800 kbit·s-1。位时间寄存器CAN0BT由4部分组成,分别为:
TSeg1 采样点前的时间段
TSEG1=Prop_Seg+Phase_Seg1-1
(1)
TSeg2 采样点后的时间段
TSEG2=Phase_Seg2-1
(2)
图4 系统初始化流程
SJW 同步跳变宽度
SJW=min(Phase_Seg1,4)-1
(3)
BRPE 波特率预分频值
BRPE=BRP-1
(4)
其中,Prop_Seg、Phase_Seg1、Phase_Seg2,分别为位时间的传播时段、相位缓冲时段一、相位缓冲时段二,与同步时段Sync_Seg一起组成位时间,即
BitTime=Sync_Seg+Prop_Seg+Phase_Seg1+Phase_Seg2
(5)
位时间组成如图5所示。
图5 位时间组成
位时间及其4个部分都由时间量子tq的整数倍表示,BitTime=1/tq,tq=BRP/fsys,fsys为CAN控制器系统时钟频率,BRP为波特率预分频系数。同步时段Sync_Seg固定为1个时间量子的长度,即1tq,系统总的传播延迟时间为400 ns,因此Prop_Seg≥400 ns。波特率为800 kbit·s-1,所以BitTime=1 250 ns,CAN控制器时钟为24 MHz,时间量子tq=BRP/24 MHz=41.667 ns×BRP,选择适当的BRP值,使满足以上关系的位时间符合设计要求。
当BRP=2时,tq=83.334 ns,BitTime=15tq,Prop_Seg=5tq,Phase_Seg1=4tq,Phase_Seg2=5tq,TSEG2=4,TSEG1=8,SJW=3,BRPE=1。
位时间寄存器
CANOBT=TSEG2×0×1 000+TSEG1×0×0100+SJW×0×004 0+BRPE=0×48C1
时钟误差容许度为
当BRP=3时,tq=125 ns,bittime=10tq,Prop_Seg=4tq,Phase_seg1=2tq,Phase_Seg2=3tq,TSEG2=2,TSEG1=5,SJW=1,BRPE=2。
CANOBT=TSEG2×0×1 000+TSEG1×0×010 0+
SJW×0×004 0+BRPE=0×2 542
时钟误差容许度为
当存在多个配置可能时,选择时钟误差容许范围大的配置,因此选择位时间寄存器为0x48C1的配置;
(3)设置命令屏蔽寄存器为写数据。设置命令屏蔽寄存器为CAN0IF1CM=0xffff,将数据从所选的报文缓冲寄存器,传送到由命令请求寄存器寻址的报文对象;
(4)设置掩码寄存器为29位ID过滤。设置IF1掩码寄存器CAN0IF1M1=0xffff,CAN0IF1MC=0xffff,29位扩展标识符用于接收过滤;
(5)设置报文控制寄存器为报文发送。设置IF1报文控制寄存器为CAN0IF1MC=0x0080|MESSAGE_SIZE_T,MESSAGE_SIZE_T为发送报文长度,这里MESSAGE_SIZE_T=2;
(6)由仲裁寄存器设置发送ID。设置IF1仲裁寄存器CAN0IF1A1=0x0040,CAN0IF1A2=0xf002,29位扩展标识符00000002用于报文对象;
(7)设置命令请求寄存器。设置IF1命令请求寄存器 ,将发送设置传送给待发送报文对象,数据传送中,根据报文号 选择发送的报文对象;
(8)设置报文控制寄存器为报文接收。设置IF1报文控制寄存器CAN0IF1MC=0x1 480|MESSAGE_SIZE_R|;接收中断允许;接收报文长度为MESSAGE_SIZE_R=2;
(9)由仲裁寄存器设置接收过滤ID。设置IF1仲裁寄存器CAN0IF1A1=0x2 040,CAN0IF1A2=0xc200, 29位扩展标识符00000001用于报文对象;
(10)设置命令请求寄存器。设置IF1命令请求寄存器CAN0IF1CR=RECEIVE_M01,将接收设置传送给待接收报文对象,数据传送中,根据报文号RECEIVE_M01选择接收的报文对象;
(11)结束初始化并启动CAN。设置CAN0CN为正常模式并禁止对位时序寄存器进行写操作,使能CAN中断。
4.2 发送报文
通过IF1发送内容为0304的2 Byte报文。
(1)设置数据寄存器为待发送数据。设置CAN0IF1DA1L=0x04,CAN0IF1DA1H=0x03,0x0304为待发送数据;
(2)设置命令屏蔽寄存器为写数据。设置CAN0IF1CM=0x008 7,将数据从所选的报文缓冲寄存器传送到由命令请求寄存器寻址的报文对象;
(3)设置命令请求寄存器。设置IF1命令请求寄存器为CAN0IF1CR=TRANSMIT_M01,将待发送数据传送给待发送报文对象并向总线发送该报文对象,TRANSMIT_M01为待发送报文号。
4.3 接收报文
当接收到符合过滤匹配的ID的报文时,CAN控制器产生中断,MCU执行中断处理程序,通过IF2读取接收到的报文字节。
(1)CAN中断响应。读取状态寄存器 以清除状态中断,读取引起中断的报文ID号;
(2)设置命令屏蔽寄存器为读数据。设置命令屏蔽寄存器为CAN0IF2CM=0x007F,将数据从命令请求寄存器寻址的报文对象传送到所选的报文缓冲寄存器;
(3)设置命令请求寄存器。设置IF2命令请求寄存器为CAN0IF2CR=Interrupt_ID, 从引起中断报文对象读取数据,Interrupt_ID为从消息RAM中读取的报文号;判断中断源Interrupt_ID是否要接收的报文对象,是则从报文缓冲寄存器中读取数据。
5 实验结果与分析
5.1 实验方法
使用CAN测试仪对所设计CAN节点进行测试,由CAN测试仪向CAN节点发送一帧2 Byte数据0102,格式为扩展帧,ID为00000001,CAN节点收到数据后,向CAN测试仪返回一帧2 Byte数据0304,ID为00000002。
5.2 实验结果及分析
实验发送接收数据结果和CAN节点发送数据波形分别如图6和图7所示。
图6 CAN总线发送接收数据
图7 CAN节点发送数据波形
通过实验,证明所设计的CAN节点接收和发送数据工作稳定,可与其他硬件配置的CAN总线节点可靠通讯,可以在有多个节点的复杂CAN总线系统中稳定工作,能够及时接收到其他节点发送的报文和将报文发送到其他节点,在保证不丢帧的同时也没有干扰其他节点的正常工作,验证了该设计方案的正确性与可行性。
6 结束语
以C8051F560单片机为核心设计CAN总线通信节点,由于使用了C8051F560内部集成的CAN控制器和单隔离光耦,简化了整个CAN总线通信节点的硬件电路设计。对C8051F560内部集成的Bosch全功能CAN模块的结构、功能和相关配置寄存器的使用方法进行了分析,并依此设计了系统的初始化程序,包括系统传输波特率的设置、报文发送配置、报文接收配置,以及报文的发送程序和报文的接收程序,对所设计CAN节点进行了数据通信实验,实验表明该系统可在最高1 Mbit·s-1的速率下实现多个设备之间的CAN总线通信,误码率低,具有高的可靠性和灵活性,适合用于分布式实时控制系统内各设备之间的高速率、高可靠性通信。
[1] 牛跃听,周立功,方丹.CAN总线嵌入式开发——从入门到实战[M].北京:北京航空航天大学出版社,2012.
[2] 张培仁.CAN总线设计及分布式控制[M].北京:清华大学出版社,2012.
[3] Silicon Laboratories.C8051F55x-F56x-F57x datasheet[M].SD:Silicon Laboratories,2011.
[4] Bosch.Bosch_CAN_user’s_manual revision 1.2[M].Berlin:Bosch,2006.
[5] Silicon Laboratories.C8051F040/1/2/3/4/5/6/7 datasheet [M].SD:Silicon Laboratories,2004.
[6] Philips Semiconductors.Data sheet SJA1000 CAN Standalone controller[M].USA: Philips Semiconductors,2000.
[7] 袁越阳,鲁植雄,陈明江.C8051F040的CAN模块应用研究[J].单片机与嵌入式系统应用,2008(10):153-156.
[8] 李刚.基于PCI_CAN的数据转换系统设计[J].电子科技,2015,28(2):59-62.
[9] 王云亮,马龙翔.基于ARM11的CAN总线设计[J].计算机测量与控制,2013(3):32-35.
[10] 刘鹏.基于STM32F407的双CAN总线设计与实现[J].科技视界,2016(13):66-68.
[11] 张正扬,刘方.一种基于CAN总线的电动车电池管理系统[J].电子科技,2014,27(3):45-48.
[12] 王加加,杨钏钏,贾伟岗.基于CAN总线的煤矿通信网络设计[J].电子科技,2014,27(3):33-37.
[13] 宋明权,周纯杰,杨樊,等.基于C8051F040 的CAN 通讯接口的开发与应用[J].计算技术与自动化,2005(3):185-189.
[14] 张弘,于盛林.基于C8051F040的CAN总线数据采集模块设计[J].测控技术,2007(6):39-42.
[15] 陈锐,张鑫,孙景龙.基于STM32F4xx的CAN总线设计与应用[J].黑龙江科技信息,2013(28):7-10.
Design of CAN Bus Communication Node Based on C8051F560
LI Jian,ZHANG Xiwen,HUANG Yong
(No.2 Department, Xi’an Institute of Mechanical and Electrical Information Technology, Xi’an 710085, China)
A CAN bus node based on the microcontroller C8051F560 is designed to form the CAN bus communication system for the high-speed reliable communication between the system devices. The hardware circuit and software program of the system are designed with the can controller integrated in C8051F560. The system communication can be realized at a rate of up to 1Mbps, and the error rate is low, with easy increasing and decreasing the number of devices. The system is suitable for high speed and high reliability communications.
C8051F560; CAN bus; CAN controller; message objects
2016- 07- 30
李建(1978-),男,工程师。研究方向:光电子技术。
10.16180/j.cnki.issn1007-7820.2017.06.021
TN915;TP336
A
1007-7820(2017)06-077-05