CAN总线与CANOpen协议一CAN总线简介1.1 引言在20世纪90年代的汽车研究领域,采用总线分布式控制获得了很大的成功。
用户要求汽车的控制系统具有优越的性能以保证汽车的安全性和舒适性,因此越来越多的具有超强计算能力的电子设备加载在汽车上。
这就要求不同的电子设备之间能够进行通信和数据交换,以达到信息共享协调工作的目的。
德国的博世公司(Bosch)率先将CAN总线(Controller Area Network)应用于汽车电子控制系统,解决了控制系统的部件之间的以及控制系统与测试设备主机的数据交换问题,替代了原有网络(用于车体控制的LIN网络、用于厂内环境控制的MOST 网络及原有车内通信的Flecray网络等)实现的功能。
由于其独特的设计思想和高可靠性,在不同总线标准的竞争中获得了广泛的认可,并逐渐成为汽车最基本的控制网络,广泛应用于火车、机器人、楼宇控制、机械制造、数字机床、医疗器械、自动化仪表等领域。
图1.1 早期的ECU(汽车电子控制单元)通信CAN总线是一种串行通信协议,具有较高的通信速率的和较强的抗干扰能力,可以作为现场总线应用于电磁噪声较大的场合。
由于CAN总线本身只定义ISO/OSI模型中的第一层(物理层)和第二层(数据链路层),通常情况下CAN 总线网络都是独立的网络,所以没有网络层。
在实际使用中,用户还需要自己定义应用层的协议,因此在CAN总线的发展过程中出现了各种版本的CAN应用层协议,现阶段最流行的CAN应用层协议主要有CANopen、DeviceNet和J1939等协议。
图1.2 基于总线(CAN)的ECU通信1.2 CAN总线的特点CAN总线并不采用物理地址的模式传送数据,而是每个消息有自己的标识符用来识别总线上的节点。
标识符主要有2个功能:消息滤波和消息优先级确定。
节点利用标识符确定是否接收总线上的传送的消息当有2个或更多节点需要传送数据时,根据标识符确定消息的优先级。
总线访问采用多主原则,所有节点都可以作为主节点占用总线。
CAN总线相对于Ethernet具有非破坏性避免总线冲突的特点(CSMA/CA协议,与CSMA/CD协议相似),这种方式可以保证在产生总线冲突的情况下,具有更高优先级的信息没有被延时传输。
其物理传输层详细和高效的定义,使得CAN总线具有其它总线无法达到的优势,注定其在工业现场总线中占有不可动摇的地位,CAN总线通信主要具有如下所示的优势和特点:(1)CAN总线上任意节点均可在任意时刻主动的向其它节点发起通信,节点没有主从之分,但在同一时刻优先级高的节点能获得总线的使用权,在高优先级的节点释放总线后,任意节点都可使用总线;(2)CAN总线传输波特率为5Kbps~1Mbps,在5Kbps的通信波特率下最远传输距离可以达到10Km,即使在1Mbps的波特率下也能传输40m的距离。
在1Mbps波特率下节点发送一帧数据最多需要134μs;(3)CAN总线采用载波监听多路访问、逐位仲裁的非破坏性总线仲裁技术。
在节点需要发送信息时,节点先监听总线是否空闲,只有节点监听到总线空闲时才能够发送数据,即载波监听多路访问方式。
在总线出现两个以上的节点同时发送数据时,CAN协议规定,按位进行仲裁,按照显性位优先级大于隐性位优先级的规则进行仲裁,最后高优先级的节点数据毫无破坏的被发送,其它节点停止发送数据(即逐位仲裁无破坏的传输技术)。
这样能大大的提高总线的使用效率及实时性;(4)CAN总线所挂接的节点数量主要取决于CAN总线收发器或驱动器,目前的驱动器一般都可以使同一网络容量达到110个节点。
CAN报文分为两个标准即CAN2.0A标准帧和CAN2.0B扩展帧,两个标准最大的区别在于CAN2.0A 只有11位标识符,CAN2.0B具有29位标识符;(5)CAN总线定义使用了硬件报文滤波,可实现点对点及点对多点的通信方式,不需要软件来控制。
数据采用短帧发送方式,每帧数据不超过8字节,抗干扰能力强,每帧接收的数据都进行CRC校验,使得数据出错机率极大限度的降低。
CAN节点在错误严重的情况下具有自动关闭的功能,避免了对总线上其它节点的干扰;(6)CAN总线通信介质可采用双绞线、同轴电缆或光纤,选择极为灵活。
可大大节约组网成本。
1.3 CAN总线的物理连接和电平特性CAN总线采用差分信号传输,通常情况下只需要两根信号线(CAN-H和CAN-L)就可以进行正常的通信。
在干扰比较强的场合,还需要用到屏蔽地即CAN-G(主要功能是屏蔽干扰信号),CAN协议推荐用户使用屏蔽双绞线作为CAN总线的传输线。
在隐性状态下,CAN-H与CAN-L的输入差分电压为0V(最大不超过0.5V),共模输入电压为2.5V。
在显性状态下,CAN-H与CAN-L的输入差分电压为2V(最小不小于0.9V),其物理连接和电平特性如下图所示:图1.3 CAN总线物理连接图1.4 CAN总线的基本结构图1.5 CAN总线的电平特性1.4 CAN总线的数据格式CAN协议有以下5中不同类型的帧格式:表1 帧的种类及用途帧帧用途数据帧用于发送单元向接收单元传送数据的帧远程帧用于接收单元向有相同ID的发送单元请求数据的帧错误帧用于当检测出错误时向其他单元通知错误的帧过载帧用于接收单元通知尚未做好接收准备的帧帧间隔用于数据帧及远程帧与前面的帧分隔开来的帧CAN2.0B总线规范定义了2种不同的数据格式(标准帧和扩展帧),其主要区别在于标识符的长度不同:标准帧有11位的标识符,扩展帧有29位的标识符。
CAN总线的标准帧数据长度是44~10位,而扩展帧的长度是64~128位。
根据数据流代码的不同,标准帧可以插入32位的填充位,扩展帧可以插入28为的填充位。
因此标准数据帧最长为131位,扩展帧最长为156位。
图1.6 数据帧图1.7 远程帧图1.8 错误帧图1.9 过载帧图1.10 帧间隔在数据帧,各数据位的意义如下:SOF(1 bit)标识一个消息帧的开始,在空闲时间的下降沿同步所有的总线模块;ID(11/29 bits)标准帧11位,扩展帧29位,标识了此消息的优先级和过滤信息;RTR(1 bit)远程传输请求,如果RTR=1表示在数据帧中没有有效数据,请求远程节点向发出请求帧的节点发送数据;IDE(1 bit)标识符扩展,如果IDE=1,则采用扩展的数据帧传送数据;r0(1 bit)保留;DLC(4 bit)数据长度代码,数据帧允许的数据字节数为(0~8),其他长度数值不允许使用;DATA(0~64 bits)消息数据;CRC(15 bits)循环冗余校验码,只用于检测错误而不能校正;ACK(2 bits)每一个接听者收到消息后必须发送响应位(ACK);EOF(7 bits)帧的结束;IFS(3 bits)内部帧空间,将接收到的消息从总线处理单元复制到缓冲,只有扩展模式有该位;SRR(1 bit)代替标准帧中的远程帧请求位(RTR);r0(1 bit)保留。
根据系统通信速率的要求,CAN总线的物理布线长度具有严格的限制。
每个数据帧由几个字节(最多8个字节)组成,从而提高了总线对于新的数据帧的响应时间。
但另一方面,CAN总线不适合高数据吞吐类型的信息传输,比如实时图像处理。
1.5 CAN总线的仲裁CAN总线采用的是一种叫做“载波监听,多主访问/冲突避免”(CSMA/CA)的通信模式。
这种总线仲裁方式允许总线上的任何一个设备都有机会取得总线的控制权并向外发送数据。
如果在同一时刻有2个或2个以上的设备要求发送数据,就会产生总线冲突,CAN总线能够实时地检测这些冲突并对其进行仲裁,从而使具有高优先级的数据不受任何损坏地传输。
总线处于空闲状态时呈现隐形电平,此时任何节点都可以向总线发送显性电平作为帧的开始。
如果2个或2个以上同时发送就会产生竞争。
CAN解决这种冲突的方法和CSMA/CD相似,并对其进行了改进采用CSMA/CA,访问总线,按位对标识符进行仲裁。
各节点在向总线发送电平的同时,也对总线上的电平读取,并与自身发送的电平比较,如果电平相同继续发送下一位,不同则停止发送退出总线竞争。
剩余的节点继续上述过程,直到总线上只剩下一个节点发送的电平,总线竞争结束,优先级高的节点获得总线的控制权。
如下图所示:图 1.11 总线仲裁过程1.6 CAN协议层CAN总线是个开放的系统,其标准遵循ISO的OSI七层模式,而CAN的基本协议只有物理层和数据链路层。
实际上,CAN总线的核心技术是其MAC 应用协议,主要解决数据冲突的CSMA/CA协议。
CAN总线一般用于小型的现场控制网络中,如果协议的结构过于复杂,网络的信息传输速率势必会变慢。
因此,CAN总线只用了7层模型中的3层:物理层,数据链路层,应用层。
如下图12所示:(1)物理层:传输线的物理接口l差分双绞线;l IC集成方式和接收数据;l可采用光纤传输;l可选的编码格式:PWM、NRZ、曼侧斯特编码。
(2)数据链路层l定义消息格式和传输协议;l CSMA/CA避免总线冲突。
(3)应用层l工业标准和汽车应用有细微区别;l为通信、网络管理和实时操作系统提供接口。
图1.12 CAN协议层结构1.7 CAN的通信错误及其处理在CAN总线中存在5中错误类型,它们互相并不排斥,下面介绍一下它们的区别、产生的原因及处理方法。
(1)位错误:向总线发送出一位的某个节点同时也在监视总线,当监视总线位的电平与送出的电平不同时,则在该位时刻检测到一个位错误。
但是在仲裁的填充位流期间或应答间隙送出隐形位而检测到显性位时,不认为是位错误。
送出认可错误标注的发送器,在检测到显性位时也不认为是位错误;(2)填充错误:在使用位填充方法进行编码的报文中,出现了第6个连续相同的位电平时,检测出一个填充错误;(3)CRC错误:CRC序列是由发送器CRC计算的结果组成的。
接收器以与发送器相同的方法计算CRC。
如果计算的结果与接收到的CRC序列不同,则检测出一个CRC错误;(4)形式错误:当固定形式的位区中出现一个或多个非法位时,则检测到一个形式错位;(5)应答错误:在应答间隙,发送器未检测到显性位时,则由它检测出一个应答错误。
检测到出错条件的节点通过发送错误标志进行标定。
当任何节点检测出位错误、填充错误、形式错误、或应答错误时,有该节点在下一位开始发送出错误标志。
当检测到CRC错误时,出错标志在应答界定符后面那一位开始发送,除非其他出错条件的标志已经开始发送。
CAN总线中,任何一个单元可能处于下列3中故障状态之一:错误激活状态(Error Active)、错误认可状态(Error Passive)和总线关闭状态(Bus off)。
具体的错误计算方式可以参考CAN 2.0协议标准。