基于CAN总线通信协议的设计与实现
扫描二维码
随时随地手机看文章
1 前言
控制器局域网(CAN-Controller Area Network)属于现场总线(Fieldbus)的范畴,是众多的属于现场总线标准之一,它适用于工业控制系统,具有通信速率高、可靠性强、连接方便、性能价格比高等诸多特点。它是一种有效支持分布式控制或实时控制的串行通信网络,以其短报文帧及CSMA/CD-AMP(带有信息优先权及冲突检测的载波监听多路访问)的MAC(媒介访问控制)方式而倍受工业自动化领域中设备互连的厚爱。CAN的应用范围遍及从高速网络到低成本的多线路网络,它可以应用于汽车系统、机械、技术设备和工业自动化里几乎任何类型的数据通信。CAN具有如一下优点:
1)使用简单方便。许多CAN控制器实现了CAN物理层及数据链路层的大部分功能,用户只须对CAN控制器进行初始化和对CAN总线上的数据进行收发操作即可实现通信;
2)高可靠性。CAN上的最大通信速率可达1Mbps,CAN总线是多主节点,各节点通过总线仲裁获得总线控制权。完善的错误处理机制保证了高噪声干扰环境下数据传送的安全可靠;
3)系统可扩展性能好。CAN总线是基于发送报文的编码,而不是对CAN控制节点进行编码,故增添或删除CAN节点不会对系统造成太大的影响。
CAN总线以报文为单位进行信息传送,它支持4种不同类型的报文帧:数据帧、远程帧、超载帧和错误帧。报文中包含信息标识符ID,它标志了报文的优先权。CAN总线上各个节点都可主动发送,总线上的报文采用标识符ID进行仲裁,ID值越小,优先级越高。具有最高优先权报文的节点赢得总线使用权,而其它节点自动停比发送。在总线再次空闲后,这些节点将自动重发原报文。网络中的所有节点都可由ID来自动决定是否接收该报文。每个节点都有ID寄存器和屏蔽寄存器接收到的报文只有与该屏蔽的功能相同时,该节点才开始正式接收报文,否则它将不理睬ID后面的报文。这使CAN系统非常灵活,可任意扩展或改变网络组成。
C8051F系列单片机是集成的混合信号片上系统SOC(System on chip),具有与MCS-51内核及指令集完全兼容的微控制器,除具有标准8051的数字外设部件之外,片内还集成数据采集和控制系统中常用的模拟部件和其它数字外设及功能部件。正是由于其体积小、集成度高、功能多、配置容易、使用方便等特点,已被广泛应用于智能仪表、数据采集、自动化控制等领域。因此本文采用C8051F120设计与实现CAN总线通信协议,充分发挥其体积小、可靠性高的特点。C8051F120是完全集成的混合信号片上系统MCU芯片,具有64个数字I/O引脚(100脚TQFP封装)。
2 数据传输格式的制定
在CAN2.0规范中规定,每次收发最多只能传送8字节.这可以满足大多数工业领域中控制命令、工控状态和测试数据的一般要求;但实际应用中,往往出现传送多于8字节的要求,此时应通过报文的拆卸和拼接技术予以实现。本文在CAN2.0A的基础上,定义了简单的传输格式,完成了单帧数据和多帧数据准确快捷的传输。
信息传递格式如表一所示:
500)this.style.width=500;" border="0" />
其中,各位的含义如下:
FF:0表示为标准格式,1表示为扩展格式;
RTR:0表示为数据帧,1表示为远程帧;
DLC.X:数据长度代码位(0~8);
ID.X:信息标识符位:
ID.28~ID.26为信息功能标识
ID.25~ID.21为接收任务标识
ID.20~ID.18为接收节点地址标识
X :保留位,默认为0,不能对保留位进行写操作;
DATAO:数据场的第一个字节,本协议中用来表明数据的属性;
DATA0.7~DATAO.5为发送节点地址标识;
DATA0.4~DATAO.1为数据功能标识
DATA0.0 0为扩展位,‘0’ 表明数据长度小于8不用扩展,‘1’ 表示数据长度大于8需要扩展DATA1作传递次数索引。
DATA1: DATAO.0为0时,传递数据;DATAO.0为1时,为数据传递次数的索引。
本文设计的信息优先级从高到低依次为:信息功能标识、任务功能标识和目标节点地址标识。信息功能标识设在ID的最高几位,通过3位的功能代码可以区分某些情况的8种基本功能:这些功能可以为节点状态控制、节点保护、紧急情况通报以及有时间标记的信息等;接收任务标识表明本帧数据的任务属性,容量为32;目标节点地址指示本次数据的目的地址,容量为8。
DATA0.0在本协议中作为标志位,用来区别单帧传输和多帧传输,解决了大于8字节的字符串的传输问题。当标志位为1时,表示传送的是多帧数据;为0时表明是单帧数据。这样克服了CAN 只能传输小于等于8字节数据的缺点,实现了大于8字节的数据的传输。
为了识别多帧传输中可能会出现的重帧和丢帧现象,本协议规定数据场第一字节作为多帧数据传输次序的索引。按照本协议制定的格式传输数据时,单帧最多传输7字节的实际数据:当数据流长度大于7字节时,就要分成多帧传送。
3 应用层协议设计
在CANV2.0规范标准中,只规定了ISO参考模型的物理层和数据链路层,没有规定媒体的连接单元以及驻留媒体,也没有规定应用层。物理层负责譬如物理信号传输、译码、位时序和位同步等功能,而数据链路层负责总线仲裁、信息分段以及数据安全、数据确认、错误检测、信号传输和错误控制的功能。实际上,即使在执行一些非常简单的基于CAN的分布式系统时。除了基本的两层服务之外,还要求或希望有更多功能,如发送长于8字节的字符串、响应或确定数据传送、标识符分配、网络启动或监控节点。
由于这些附加的功能直接支持应用过程,所以它可以被认作“应用层”。如果正确执行,则应用层以及相应的应用层接口(子协议)为通讯和应用过程提供了一个清晰定义的分界以便把它们区分开来。在一些利用简单的通信协议就可以满足要求的情况下,采用复杂的协议会造成资源的浪费,而且,使用起来也很不方便,反而限制了CAN的灵活性。所以在一些情况下制定适合要求的通信协议,对CAN的开发和使用至关重要。本文根据实际系统设计的需要,在2.0A技术规范的基础上制定了CAN应用层通信协议。
CAN应用层协议主要负责建立CPU与底层之间的桥梁,它主要由四部分组成:节点的开关机制、数据的收发机制、错误处理机制和中断管理机制五部分组成。四种机制互相联系、互相制约,共同维护系统的运转。限于篇幅本文主要介绍关键的数据收发机制。
3.1 数据发送机制
发送机制主要实现将CPU要发送的数据接过来,并整理为符合应用层协议规定的帧格式,将拆卸好的小包(数据帧)顺序放入循环队列中等待发送,并负责管理和维护发送循环队列的止常运转。在定时器定时中断中定期对循环队列进行扫描,如果发现队列中有数据等待发送,则调用发送函数将数据发送到CAN总线。
在底层开辟了一个临时缓冲区用于暂时存放等待发送的小包,临时缓冲区采用循环队列的存储结构,对数据实行先入先出的管理模式。循环队列是一个42*11的二维数组,用来暂时安置CPU即将发送的数据,数据被顺序安排在循环队列中等待发送。每增加一帧数据,循环队列的尾指针加1;每成功发送完一帧数据,循环队列的头指针减1。当循环队列中没有数据时,队列的状态为空,否则指示为不空;若循环队列的头指针和尾指针重合而队列又处于不空的状态,此时队列为满的状态。当队列处于满的状态时,禁止向队列再写入数据,否则容易导致数据的覆盖或丢失。队列中数据遵循先入先出的原则,CPU将数据从队列尾部装入,向CAN总线发送数据时则从队列头部将数据读走。发送循环队列的曾理单位为帧,每次操作都是11个字节为单位。在发送机制运转前,首先对发送循环队列初始化,将循环队列的头指针、尾指针赋值为零,将已占用的空间也赋值为零。
CAN发送机制主要由两大模块组成:打小包模块和帧发送模块。当CPU有数据需要发送时,调用打小包函数,要求给出待发送数据的存放地址。打小包函数将会按照本协议规定的格式将发送节点地址、接收节点地址、信息类型、任务标识、数据标识等参数整理为CAN数据链路层ID的格式,将数据组装成符合应用层协议所规定的数据帧(小包),实现对长度大于7字节的数据的打小包处理,按照所填加索引号的顺序放到发送循环队列中等待发送。打小包函数的流程图如图1所示:
500)this.style.width=500;" border="0" />
3.2 数据接收机制
CAN接收机制负责将数据从CAN总线上接收下来,按照数据源节点的地址将其还原为发送前的格式,准确无误的传递给上层,并负责为上层提供接口函数。在CPU将数据取走以后,清空相应的数组。
在底层开辟了一个临时缓冲区用于暂时存放从CAN总线上接收下的数据,临时缓冲区采用二维数组的格式,容量为4*3*64。第一维的容量为4,分别指示发送节点的地址;第二维容量为3,作为数据的扩展缓存,指示可连续存放来自于同一节点的包的数目;第三维的容量为64,用来存放经过整理以后的数据。一般来说,开辟一个二维的空间就可以使协议周转,但是,在实际系统中可能会出现CPU还未能将整理完毕的数据取走此时又接到来自于同一节点的新的数据,这样就可能导致新的数据覆盖掉原来的数据,造成数据的丢失。为避免这种潜在地危险,因此开辟了三维空间,在最坏的情况下,每个节点都可同时容纳来自于同一节点连续发送的3包数据,大大降低了数据丢失的可能性。接收数据流程如图二所示。
500)this.style.width=500;" border="0" />
图 二: 数据发送流程
5 总结
本文创新点:CAN总线以其卓越的特性、极高的可靠性和独特的设计,在工业过程监控设备的互联方面得到广泛的应用,受到工业界的广泛重视,并被公认为是最有前途的现场总线之一。作为通用、有效、可靠及经济的平台,CA N协议也已经广泛地受到了欢迎。由于CAN2.0规范固有的局限性,客观上要求用户建立高层协议对CAN进行完善。本文所设计的CAN总线应用层协议已经投入使用,具有简单、灵活、移植方便等特点。