1983年,德国的Bosch开始了一个内部研究项目,旨在开发一种车用网络,将所有的车载电子设备连在一起。1986年,他们在世界汽车工程师会议上,第一次介绍了这种基于串行总线的CAN网络的概念。
CAN协议是基于广播传输技术原理的,其本质是一种通信技术,被传输数据在网络中传输到包括其目的节点在内的所有网络节点。各个节点解析数据包并判断该数据是否是传给它们的,如果不是就丢弃,如果是,则下载数据并做相应处理。
CAN的传输速度、数据长度以及事件触发机制,使得CAN非常普及。在CAN网络中,数据传输速度可高达1Mbit/s,这对于要求延时短的实时控制非常有利,高速、低时延特性使得高效时间控制也成为可能。CAN的数据帧很短,这使消息接收时延很短。
CAN是基于事件触发机制的,这意味着只有某一事件发生时才传输数据。例如,当一个按钮被按下或者一个操作杆被推上时,数据才发送。这一特性,使总线上负载很小,进而使得网络带宽可被充分利用。
传输速度高、信息长度短的特点使CAN时延很低,因此可以用于对时延要求苛刻的控制系统。
值得注意的是,在网络中,寻址系统并不是基于各节点在网络中的物理地址的,网络中的传输是面向消息的。传输的每一个消息都被赋予一个特定的消息标示符,该标示符在整个网络中是独一无二的,否则网络将会被具有相同标示符的消息挤满,且节点也无法判断哪个消息是新的哪个是旧的。事实上,消息标示符不仅定义了消息的内容,而且还定义了消息的优先级。这个优先级在位一级被解析。每个消息标示符由一个二进制数构成,二进制数值越小,代表的信息优先级越高,反之亦然。消息标示符在定义优先级的同时,还包含了消息的内容。如果实现信息的传输,节点会把待发送信息以及该信息的专用标示符一起发送给它的CAN控制器,CAN控制器收到后调整数据结构使之成为一个可用于整个CAN网络的格式,然后发送到总线上。一旦发出以后,网络上所有其他节点都接收这一消息,如果该消息不是给它们的,将自动把消息丢弃。
4.8.2.1 CAN消息的格式
如图4-53所示,每一个CAN消息[49]由一个帧起始域开始,它标志着一个消息的开始。起始域之后是仲裁域。仲裁域包含了消息标示符和一个远程传输请求位,该请求位用于区分数据请求帧和数据帧。控制域在仲裁域之后,它包含了区别CAN帧和扩展CAN帧的必要信息。数据域在控制域之后,包含了8字节数据。循环冗余校验码CRC域用来检测消息中的错误,这是目前大多数网络用的检错方法。响应域由接收方使用,用来表示接收方已经正确接收了数据,据此,发送方也可知道接收方已成功接收数据。最后是帧尾域,其作用是数据结束标志,可以告诉所有的相关单元当前数据帧传输结束。
图4-53 CAN消息格式
4.8.2.2 CAN消息仲裁
CSMA/CD负责分配总线给不同的节点,它是载波监听多路访问/冲突检测(Carrier Sense Multiple Access/Collision Detection)的缩写,是一种仲裁方法[50]。按照这个方法,想要传输的节点首先要“监听”总线以确定总线是否空闲。如果总线忙,节点就推迟传输时间。如果总线空闲,节点就开始传输数据。这能避免总线上数据包冲突。当然,这也将导致总线带宽的浪费。
节点之间优先级是根据节点传输的消息标示符判别的。节点不光传输标示符,还不停地监听总线状态。总线仲裁方法可以用下例说明。假设某一个节点的信息标示符为逻辑值“0”,另一个节点的信息标示符为“1”,前面已经提到拥有小二进制值的标识符优先级高,因此标示符为0的节点拥有高优先级,而标示符为1的节点优先级低,因而数据不能传输。同时,此时总线状态是“0”,这是因为位“0”代表显性位,“1”代表隐性位。当这个节点完成传输时,原来1标识符的节点试着获得总线的控制权,重新开始仲裁过程。
4.8.2.3 CAN错误检测
错误检测和纠正是网络的重要部分。节点出错,传输通道出错,或者仅仅是环境噪声都可以造成网络错误。网络的容错能力各不相同,有些网络比别的网络容错能力更强。例如,简单连接几台电脑的网络,其容错能力就强于用于汽车内的网络。容错能力取决于网络的类型和网络的用途。网络中的错误可能是位一级的,也可能是帧一级的,幸运的是,两种错误CAN都可以处理[49]。CAN协议可处理的主要错误有位错误、填充错误、CRC错误、结构错误和应答错误。
当一个节点开始传输的时候,它要不断跟踪总线状态。如果一个节点传输一个0,但在总线上被读成了1,就产生了一个错误,这种错误被称作bit错误。
当数据域出现长序列相同位时,很多网络会采用一种被称作位填充的方法。在这个方法中,如果数据域中一个特定的位连续出现5次,那么在这个连续出现的相同的位的后面加上额外的位,这个位叫填充位,它和前5个相同的位相反。例如,如果一列连续5个0出现,这连续5个0后就要跟上一个1。这个位告知接受者不用怀疑具有上述特性的数据列是否真的出现了,还可用于和主时钟同步。然而,有时这个填充位可能被破坏,成了和前面5个连续相同位一样的位,也就是说会出现连续6个相同的位。这种错误就叫做位填塞错误。
前面提到,循环冗余校验码CRC被用来检查发生在传输过程中的错误。接收者和传输者都保存有一个约定好的多项式P(x)。传输者将这个将要被传输的数据代表为多项式G(x)。然后,G(x)被P(x)除。余数被放入帧内一起传输给接收者。然后,接收者做相同的除法来看是否得到相同的余数。如果余数不同,那么接收者就可以推断发生了错误。
当数据长度编码表明的数据大小和实际数据域中的数据大小不同时,就产生了一个结构错误。(www.xing528.com)
当节点正确接收到消息后,它会将该数据的ACK域的值设为显性位。如果传输者没有在ACK区域检测到显性位,那么它就认为要么接收者没有正确接收到数据,要么ACK域被破坏了。
CAN规范还详细介绍了“错误计数器”,错误计数器在硬件中实现。传输者和接收者各自有两个错误计数器。当检测到一个错误的时候,错误计数器的值增加8,当一个消息被正确无误地传输后,错误计数器的值减少1。在正常情况下,一个节点的错误量较少时,称其工作在错误有效状态。此时,如果检测到一个错误,节点会传输一个有效错误帧来指示该错误。一旦计数器的值达到了128,这个节点就进去错误无效状态。计数器的值有上限,为256。一旦计数器到达这个值,总线就进入总线关闭,停止所有传输,直到CAN控制器重启总线后,才能再次开始传输。
CAN控制器由以下部分组成:
1)CPU接口逻辑处理总线上传输的数据;
3)错误管理逻辑与错误管理有关;
4)位定时逻辑负责比特流的同步;
5)传输—接收控制逻辑处理错误检测和纠正,数据传输、接收和仲裁;
6)消息缓存被用来存储将来要传输的消息。
CAN控制器包括完全CAN和基本CAN两种。在完全CAN控制器中,缓存空间用于接收有特定标示符的消息。如果一个消息的标示符数字不是所要的,该消息就会被拒绝。在基本CAN中,所有的消息都被存储在缓存里,因此,要由软件决定是否接收这个消息。
图4-54 CAN协议栈
为了简化和透明,CAN协议由三层组成。其中,每一层都为其上层提供服务。协议的三个层分别是CAN目标层、CAN传输层和CAN物理层,如图4-54所示。
应用层主要关注某一具体功能的实现问题,一般是基于硬件的。目标层用来处理和过滤消息,选择适当的消息进行传输,同时过滤掉不需要的消息。传输层负责诸如错误检测等功能,并且负责检测到错误后传输错误帧,同时还负责总线仲裁和帧形成的任务。物理层负责数据帧的传输。多家公司联合建立了物理层和应用层的标准,并写入了CAN2.0规范之中。例如,使用的物理介质为40m长的双绞线。根据协议,CAN可以最多使用2032个标示符。最近,在CAN基础上发展出了一种被称作CANopen新协议[50],其基础是基本CAN应用层协议。通过这个协议,各种不同类型的设备得以互相通信,这要归功于一个叫profiling的程序。通过这个方法,我们得以将CANopen协议建立在别的协议之上。因此,实时数据传输和控制以及不同设备间的同步才变为可能。CANopen协议包含了ISO/OSI模型的七层结构。因此,使用CAN-open协议,我们就可以让运行不同协议的不同网络集成为一个网络。
CAN网络的优点是速度快、时延短、灵活性和安全性高。讽刺的是,CAN规范也造成了一些特定问题的存在。CAN规则规定一个帧的最后7位应该为隐性位。就接收者而言,一个接收到的消息如果直到倒数第二位都没有错误发生就将被认为是正确的。这样,最后一位就被完全无视了。因此,即使最后一位是显性位,这个消息也被认为是正确的。
CAN网络的另一个问题是消息重复问题,当一个节点正确收到消息,而另一个节点没有正常收到这条消息时,此时,没有收到消息的节点会发送一个重传输请求给传输者,传输者会立刻响应。这时就会造成消息重复问题。
CAN可通过多种方式用于汽车。在此,我们考虑Jaguar公司在运动型汽车XK8中使用CAN几种方式[51]。该车型中,CAN的应用包括发动机控制单元、刹车防抱死系统、传输控制单元、仪表和驾驶员信息单元、J门照明单元和内悬挂数据传送系统。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。