一、CAN总线简介CAN是控制器局域网络(ControllerAreaNetwork,CAN)的简称,是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的,并最终成为国际标准(ISO11898)。是国际上应用最广泛的现场总线之一。在建立之初,CAN总线就定位于汽车内部的现场总线,具有传输速度快、可靠性高、灵活性强等优点。上世纪90年代CAN总线开始在汽车电子行业内逐步推广,目前已成为汽车电子行业首选的通信协议,并且在医疗设备、工业生产、楼宇设施、交通运输等领域中取得了广泛的应用。二、CAN总线技术及其规范2.1性能特点(1)数据通信没有主从之分,任意一个节点可以向任何其他(一个或多个)节点发起数据通信,通信方式灵活,且无需站地址等节点信息;(2)CAN网络上的节点信息分成不停的优先级,可满足不同的实时要求,高优先级节点信息最快可在134μs内得到传输;(3)采用非破坏性总线仲裁技术,当多个节点同时向总线发送信息时,优先级较低的节点会主动退出发送,而高优先级的节点可不受影响的继续发送数据,从而大大节省了总线冲突仲裁时间。尤其是在网络负载很重的情况下也不会出现网络瘫痪的情况;(3)通信距离最远可达10KM(速率低于5Kbps)速率可达到1Mbps(通信距离小于40M);(4)通信的硬件接口简单,通信线少,传输介质可以是双绞线,同轴电缆或光缆。CAN总线适用于大数据量短距离通信或者长距离小数据量,实时性要求比较高,多主多从或者各个节点平等的现场中使用。(5)采用短帧结构,传输时间短,受干扰概率低,每帧信息都有CRC校验及其他检验措施,数据出错率极低;(6)节点在严重错误的情况下具有自动关闭输出的功能,以使总线上其他节点的操作不受影响。(7)CAN总线使用两根信号线上的差分电压传递信号,显性电平可以覆盖隐形电平。2.2技术规范2.2.1CAN的分层结构图1CAN的分层结构逻辑链路控制子层(LLC)的功能:为数据传送和远程数据请求提供服务,确认由LLC子层接收的报文实际上已被接收,为恢复管理和通知超载提供信息。在定义目标处理时,存在许多灵活性。介质访问控制子层(MAC)的功能:主要是传送规则,即控制帧结构、执行仲裁、错误检测、出错标定和故障界定。MAC子层也要确定当开始一次新的传送时,总线是否开放或者是否马上开始接收。位定时特性也是MAC子层的一部分。2.2.2CAN的报文传送和帧结构报文传送由以下四种不同的帧类型所表示和控制。·数据帧:数据帧携带数据从发送器至接收器;·远程帧:总线单元发出远程帧,请求发送具有同一识别符的数据帧;·错误帧:任何单元检测到一总线错误时发出的错误帧;·超载帧:超载帧用来在先行的和后续的数据帧(或远程帧)之间提供一附加的延时。数据帧或远程帧通过帧空间与前述的各种帧分开。2.2.2.1数据帧数据械是用来传输数据的帧,由7个位场组成:1.帧起始位场、2.仲裁场、3.控制场、4.数据场、5.CRC场、6.应答场、7帧结尾。数据帧的组成如图2所示。CAN2.0B中存在两种不同的帧格式,其主要区别在于仲裁场的标示符长度。具有11位标示符的帧称为标准帧,包括29位标示符的帧称为扩展帧。标准帧和扩展帧的仲裁场格式如图3所示。图3标准帧和扩展帧的仲裁场格式·帧起始帧的起始场仅仅包含一个显性位,当CAN总线空闲时,总线保持隐性位,出现一个显性位即表示总线开始数据传输。CAN总线上的节点只能在总线空闲时发送数据,而检测到起始位之后节点就进入接收状态。·仲裁场仲裁场由标识符和远程发送请求位(RTR位)组成。RTR位在数据帧中为显性,在远程帧中为隐性。其结构如图4所示。图4CAN总线数据帧仲裁场结构对于CAN2.0B标准,标准格式帧与扩展格式帧的仲裁场标识符格式不同。标准格式里,仲裁场由11位识别符和RTR(RTR=0)位组成。识别符位由ID.28~ID.18组成。而在扩展格式里,仲裁场包括29位识别符、替代远程请求位SRR、标识位IDE、远程发送请求位RTR(RTR=1)。其识别符由ID.28~ID.0组成,其格式包含两个部分:11位(ID.28~ID.18)基本ID、18位(ID.17~ID.0)扩展ID。扩展格式里,基本ID首先发送,其次是SRR位和IDE位。扩展ID的发送位于SRR位和IDE位之后。SRR的全称是“替代远程请求位(SubstituteRemoteRequestBIT)”,SRR是一隐性位。它在扩展格式的标准帧RTR位上被发送,并代替标准帧的RTR位。因此,如果扩展帧的基本ID和标准帧的识别符相同,标准帧与扩展帧的冲突是通过标准帧优先于扩展帧这一途径得以解决的。IDE的全称是“识别符扩展位(IdentifierExtensionBit)”,对于扩展格式,IDE位属于仲裁场;对于标准格式,IDE位属于控制场。标准格式的IDE位为“显性”,而扩展格式的IDE位为“隐性”。·控制场控制场由6个位组成,包括数据长度码和两个将来作为扩展用的保留位。其结构如图5所示。图5CAN总线数据场结构图标准格式和扩展格式的控制场格式不同。标准格式里的帧包括数据长度代码、IDE位(为显性位)及保留位r0。扩展格式里的帧包括数据长度代码和两个保留位:r1和r0。其保留位必须发送为显性,但是接收器认可“显性”和“隐性”位的任何组合。·数据场数据场由数据帧里的发送数据组成。它可以为0~8个字节,每字节包含了8个位,首先发送最高有效位(MSB)。·CRC场CRC场由15位CRC序列和1位隐性CRC界定符组成,,其结构如图6所示。图6CAN总线CRC场结构图CRC序列用于检测报文传输错误,CRC校验是由硬件完成的。·应答场应答场长度为两个位,包含应答间隙(ACKslot)和应答界定符(ACKdelimiter),其结构如图7所示。图7CAN总线应答场结构图在应答场里,发送站发送两个“隐位”。当接收器正确的接收到有效的报文时,接收器就会在应答间隙期间(发送ACK信号)向发送器发送一“显性”位以示应答。所接收到匹配CRC序列的站会在应答间隙期间用一“显性”位写入发送器的“隐性”位来做出回答。ACK界定符是ACK场的第二个位,并且必须为隐位。因此应答间隙被两个“隐性”位所包围,也就是CRC界定符和ACK界定符。·帧结束每一个数据帧或远程帧均由一串七个隐性位的帧结束域结尾。这样,接收节点可以正确检测到一个帧的传输结束。2.2.2.2远程帧通过发送远程帧,作为某数据接收器的站通过其资源节点对不同的数据传送进行初始化设置。远程帧由6个不同的位场组成,即帧起始、仲裁场、控制场、CRC场、应答场、帧结束。其结构如图8所示。图8CAN总线远程帧结构与数据帧相比,远程帧的RTR位为隐性,没有数据域,数据长度编码域可以是0~8个字节的任何值,这个值是远程帧请求发送的数据帧的数据域长度。当具有相同仲裁域的数据帧和远程帧同时发送时,由于数据帧的RTR位为显性,所以数据帧获得优先。发送远程帧的节点可以直接接收数据。2.2.2.3错误帧错误帧由两个不同的域组成:第一个域是来自控制器的错误标志;第二个域为错误分界符。其结构如图9所示。图9CAN总线错误帧结构错误标志:有两种形式的错误标志。①激活(Active)错误标志。它由6个连续显性位组成。②认可(Passive)错误标志。它由6个连续隐性位组成。它可由其他CAN控制器的显性位改写。错误界定:错误界定符由8个隐性位组成。传送了错误标志以后,每一站就发送一个隐性位,并一直监视总线直到检测出1个隐性位为止,然后就开始发送其余7个隐性位。2.2.2.4超载帧过载帧由两个区域组成:过载标识域及过载界定符域。其结构如图10所示。图10CAN总线超载帧结构下述三种状态将导致过载帧发送:1)接收方在接收一帧之前需要过多的时间处理当前的数据(接收尚未准备好);2)在帧空隙域检测到显性位信号;3)如果CAN节点在错误界定符或过载界定符的第8位采样到一个显性位节点会发送一个过载帧。2.2.2.5帧空间帧空间包括间歇场和总线空闲的位场。其结构如图11所示。图11CAN总线帧空间结构对于数据帧或远程帧无论前面的帧为何种类型他与前面帧的隔离都是通过帧空间实现的。所不同的是过载帧和错误帧之间没有帧空间,多个过载帧之间也不是由帧空间隔离的。2.2.3错误类型和故障界定2.2.3.1错误检测CAN总线协议定义了5种错误类型用于监测总线上的数据传输。这五种错误包括:1.位错误(BitError):CAN总线上的节点在发送数据的同时也在检测总线上的电平。如果在仲裁域之外,所发送的数据与节点监测到的数据不一致,则CAN总线产生了一次位错误。但是,如果在发送ACK段或者被动错误标志时,节点检测到总线上电平与发送值不一致,并不判定产生了位错误。2.填充规则错误(StuffError):在CAN总线传输中,报文的侦起始、仲裁域、控制域、数据域以及CRC校验部分只要连续出现五个相同的位就需要额外插入一个相反的位,这是CAN总线位填充的机制。在CAN总线通信中,如果一个节点检测到六个连续相同的电平就判断总线出现了位填充错误。3.CRC校验(CRCError):CAN总线的数据帧自带了CRC校验,在发送数据的同时也计算这一帧的CRC校验码,将校验码在数据帧的末尾部分发送。接收节点接收到数据帧后计算接收到的数据帧中数据域的CRC码,并与接收到的CRC校验码比较以确定接收到的数据是否准确,如果不正确,则出现了一次CRC校验错误。4.格式错误(FormError):在固定格式的位场中出现了非法位,比如,在本该是隐性位的CRC界定符中出现了显性电平,则监控节点判断出现了一次格式错误。5.应答错误(AcknowledgementError):在CAN总线传输中,发送节点发送的应答场为隐性位,接收节点需要在应答场中向总线发送显性位覆盖隐性位以表示接受完成。如果发送节点监测到帧的应答场仍然是隐性位,则表明出现了一次应答错误,没有节点接收到数据,发送失败。2.2.3.2错误界定当节点检测到一个错误之后,会向总线发送错误帧,同时本地错误计数器递增。在CAN总线上的每个节点都设有两个错误寄存器:接收错误计数器和发送错误计数器,分别用来计数接收和发送错误。检测到错误,相应的错误计数器递增;成功发送或者接收一愤消息,相应的错误计数器递减直到为0。当错误计数器小于127时,节点处于主动错误状态,错误计数器在127到255时,节点处于被动错误状态,错误计数器超过255时,节点进入离线状态,处于离线状态的节点将不再参与总线上的数据传输。2.2.3.3错误标定检测到错误条件的站通过发送错误标志指示错误。对于错误主动节点,错误信息为主动错误标志;对于错误被动的节点,错误信息为被动错误标志。站检测到的错误无论是位错误、填充错误、形势错误、还是应答错误,这个站都会在下一位时发送错误标志信息。检测到CRC错误时,错误标志的发送开始于ACK界定符之后的位,除非其他错误标志已经开始发送。