1、CAN 总线CAN(Controller Area Network )总线即控制器局域网络,是上世纪把八十年代最先由德国的 Bosch 公司为解决汽车的监测与控制而设计的总线方案,其可靠性高,性能好,应用方便,现在已经成为工业控制种不可或缺的一种现场控制总线,并被广泛应用于工业自动化、医疗设备、工业设备、汽车电子等领域。CAN 总线网络组建方式和计算机局域网类似,其常用的网络拓补结构为总线型拓补结构,相对其他总线,CAN 总线具有以下特点: 其工作模式为多主工作模式;(节点不分主从) 其具有非破坏性的总线总裁技术(CSMA/CD); 其能进行点对点通信,也能进行一点对多点的广播式通信; 其具有
2、短帧结构,传输报文可靠性高;(短帧抗干扰能力强, ) 其具有较高的节点容错机制,当一个节点发生故障时会自动退出网络,避免对网络的影响; CAN 上的节点数主要取决于总线驱动电路,目前可达 128 个;报文标识符可达 2032 种(CAN2.0A) ,而扩展标准(CAN2.0B)的报文标识符几乎不受限制。 CAN 的通信介质可为双绞线、同轴电缆或光纤,选择灵活。 总线配置灵活;CAN 总线具有以下通信技术规范: 带有冲突检测的载波侦听机制(CSMA/CD) ;(局域网介质访问控制) 报文传输不基于目的地址; 高速且强容错机制;CAN 总线传输介质CAN 总线在现场应用中,一般式利用双绞线做为其传
3、输介质,双绞线实现简单,价格低廉,对有一定的抗电磁辐射干扰能力,但是在使用时要注意下面几个问题: 要采用抗干扰的差分信号传输方式; 如果使用屏蔽的双绞线作为物理层,除 2 根差分信号线连接以外,还需要注意在同一段中屏蔽层单点接地问题。 CAN 总线两端必须有两个 118-130 欧的匹配电阻; 确保不要在干扰源附近布置 CAN 总线,或者使用屏蔽双绞线; 使用适当的电缆类型,必须确定电缆的电压衰减;当然,由于 CAN 总线有其特殊性,因此目前有专用的 CAN 总线传输线CAN 总线技术规范1 CAN 总线分层结构如图 1 所示,CAN 具有 OSI 规定的标准分层结构,可以看出,其底层只具有数
4、据链路层和物理层,而上层 ISO 并为对其标准化,这也是 CAN 总线应用灵活的原因之一,我们可以基于底层开发自己的应用层,当然目前也有现成的 CAN 总线应用层协议如DeviceNet(ODVA) 、CAL (CiA) 、CANopen(CiA) 、CANKingdom(Kvaser) 、J1939(SAE) 、SDS(Honeywell) ,但是目前真正占领市场协议为 DeviceNet 和 CANopen。CAN 的分层机构和各层对应的功能如下图 2 所示。图 1:OSI 标准化的 CAN 分层结构其中逻辑链路子层 LLC 子层的主要功能是报文滤波、超载通知和恢复管理。媒体访问控制子层
5、MAC 子层的功能主要是传送规则,以及控制帧结构、执行仲裁、错误检测、出错标定和故障界定。MAC 子层也要确定为开始一次新的发送,总线是否开放或者是否马上开始接收,位定时也是 MAC 子层的一部分。物理层的功能是有关全部电气特性不同的节点间位的实际传送。图 2 CAN 的分层结构及其功能2 CAN 总线工作原理当 CAN 总线上的一个节点(站)发送数据时,它以报文的形式广播给网络中所有节点,对每个节点来说,无论数据是否是发给自己的,都对其接收。每组报文开头的 11 位字符为标识符,定义了报文的优先级,这种报文格式成为面向内容的编制方案。同一系统中标识符是唯一的,不可能有两个站发送具有相同标识符
6、的报文,当几个站同时竞争总线读取时,这种配置十分重要。CAN 总线收发器通过两根总线的电平差来判断总线电平,总线电平为显性和隐性电平两种,总线必须处于两者之一,总线执行逻辑上得线“与”时,显性电平为“0” ,隐性电平为“1”器物理层表示如下图 3 所示:图 3 CAN 总线物理层特征上图左边为 ISO11898 标准,其总线传输信号为 TTL 电平,总线为隐性时, CANL 和 CANH电平相同,电压差为“0” ;总线为显性时, CANH 变高, CANL 变低,电压差为“1” ;上图右边为 ISO11519 标准,器总线传输信号为差分信号,表示方法和前面一样,这里就不赘述了。这里看到一段网络
7、上关于显性和隐性电平的解释,可以参考下:首先 CAN 数据总线有两条导线,一条是黄色的,一条是绿色的。分别是CAN_High 线和 CAN_Low 线当静止状态时,这两条导线上的电平一样。这个电平称为静电平。大约为 2.5伏。这个静电平状态就是隐形状态,也称隐性电平。也就是没有任何干扰的时候的状态称为隐性状态.当有信号修改时,CAN_High 线上的电压值变高了,一般来说会升高至少 1V,而 CAN_Low 线上的电压值会降低一个同样值,也是 1v,那么这时候。CAN_High 就 是 2.5v+1v=3.5v,它就处于激活状态了。而 CAN_Low 降为 2.5v-1v=1.5v。可以看看这
8、个图由此我们得到在隐性状态下,CAN_High 线与 CAN_Low 没有电压差,这样我们看到没有任何变化也就检测不到信号。但是在显性状态时,改值最低为 2V,我们就可以利用这种变化才传输数据了。所以出现了那些帧,那些帧中的场,那些场中的位,云云在总线上通常逻辑 1 表示隐性。而 0 表示显性。这些 1 啊,0 啊,就可以利用起来为我们传数据了。3 CAN 报文格式CAN 的报文格式有两种,不同之处其实就是识别符长度不同,具有 11 位识别符的帧称为标准帧,而还有 29 位识别符的帧为扩展帧,CAN 报文有以下 4 个不同的帧类型。分别是(1) 数据帧:数据帧将数据从发送器传输到接收器。(2)
9、 远程帧:总线节点发出远程帧,请求发送具有同一标识符的数据帧(3) 错误帧:任何节点检测到总线错误就发出错误帧(4) 过载帧:过载帧用已在先行的后续的数据帧(或远程帧)之间提供一附加的延时这里以数据帧为例,说明一下 CAN 报文的帧格式数据帧格式如下:图 4 数据帧组成结构其一共分为七个段(这里有几种不同的叫法,有的书称作域,有的书称作场,个人觉得段更好理解)分别为帧起始(SOF) 、仲裁段、控制段、数据段、CRC 段、ACK 段、帧结束。这里就分别对各个段进行简单的解释帧起始:这个应该很好理解,其表示一个帧的开始,其有一个单独的“显性”位组成。一个 CAN 节点只在总线空闲时才允许发送报文,
10、所有节点必须同步与首先开始发送的节点的帧起始前沿(即总线从隐性变为显性时产生的跳变沿)仲裁段:仲裁段表示帧的优先级,这点标准帧和扩展帧不同,可以从图 4 看出,标准帧有 11 位标识符和 RTR 组成,在扩展帧中其由 11 位标志符和 SRR、IDE 及 18 为扩展标志符组成。RTR 为远程发送请求位,表示改报文为数据帧或是远程帧,为数据帧时其为显性,为远程帧时其为隐性,而扩展帧中 SRR 为隐性为,故标准数据帧优先级高于扩展数据帧,关于这点解释,我同样可以参考网络上一段解释:这个仲裁很抽象,其实在这里就是为了解决一个问题。如果 2 个或 2 个以上的单元同时开始传送报文,那么就会有总线访问
11、冲突。那么仲裁机制就是用来根据标识符优先级来一个一个的去掉低级别的数据。我们可以详细的描述这场生动的争抢总线的战斗。当总线处于空闲状态时呈隐性电平,此时任何节点都可以向总线发送显性电平作为帧的开始。2 个或 2 个以上的节点同时发送开始争抢总线,但是总线只能被一个人抢走。总线只属于一个他。这时候到底怎么决定谁留下,谁滚蛋呢。我们开始考虑,思索,我们以前定义了标识符,标识符有优先级,它越小,它优先级越高。那么怎么实现的呢。看下面把首先搞明白两点,一 下面的图 低波形代表 0,高波形代表 1 二 当隐性碰到显性,就变为显性。如图所示,节点 A 和节点 B 的标识符的第 lO、9 、8 位电平相同,
12、因此两个节点侦听到的信息和它们发出的信息相同。第 7 位节点 B 发出一个“1” ,但从节点上接收到的消息却是“0” ,为什么呢,因为 A 节点同时发出显性位,让总线也变成显性了,也就是 0。节点B 会退出发送处于单纯监听方式而不发送数据;节点 A 成功发送仲裁位从而获得总线的控制权,继而发送全部消息。总线中的信号持续跟踪最后获得总线控制权发出的报文,本例中节点 A 的报文将被跟踪。这种非破坏性位仲裁方法的优点在于,在网络最终确定哪个节点被传送前,报文的起始部分已经在网络中传输了,因此具有高优先级的节点的数据传输没有任何延时。在获得总线控制权的节点发送数据过程中,其他节点成为报文的接收节点,并
13、且不会在总线再次空闲之前发送报文在这逐位的比较中,最终节点 B 因为第七位的偏差丢掉了总线。从此单纯监听,江山就拱手让给了节点 A 了,这就是仲裁机制。这里我们涉及到总线值总线有二个互补的逻辑值:“显性” 或“隐性” 。 “显性” 位和 “隐性”位同时传送时,总线的结果值为“显性”。比如,在总线的“写与” 执行时,逻辑 0 代表“显性” 等级,逻辑 1 代表“隐性”等级。上面我们说过,报文有两种格式,标准和扩展。这里,不同的格式仲裁场是不一样的。标准格式下,仲裁场由 11 位识别符和 RTR 位组成。但在扩展格式里,包括 29 位识别符,SRR 位,IDE 位, RTR 位。RTR 位。Rem
14、ote Tranmission Request BIT 全称为 远程发送请求位。它在数据帧里必须为显性 0 ,但在远程帧里为隐性 1。我晕,为什么这么搞呢,不急,先留着这个问题。SRR 位,替代远程请求位, SRR 是一隐性位,也就是 1,它在扩展格式的标准帧 RTR 位位置,那么标准帧怪不得优先于扩展帧了,因为在传输完 11 位标识符之后(扩展帧的后 18位在最后发送,先发送 11 位标识符) ,轮到标准帧的 RTR 位和扩展帧的 SRR 位了。这时候,标准帧的 RTR 为显性,而扩展帧 SRR 为隐性,这样,总线自然就被标准帧占据。同时上面那个问题,也一目了然了,CAN 总线协议设计者,肯
15、定是设计了数据帧优先于远程帧所以IDE 全称识别符扩展位(Identifier Extension Bit),它属于扩展格式的仲裁场标准格式的控制场标准格式的 IDE 位为显性,扩展格式里 IDE 位为隐性。这样扩展格式的数据帧优先级又落下了一截。控制段:表示数据的字节数即保留位的段,其结构如下图所示:图 5 控制段结构示意图其总共有六位,标准的跟扩展的又不同。标准的格式里的帧先是 IDE 位,然后保留位 r0,然后数据长度代码(共四位,分别是 DLC3,DLC2,DLC1,DLC0 )而扩展格式里,IDE 替换为 r1 保留位,其余不变。数据长度代码指示了数据场里的字节数量。数据段:数据段由
16、数据帧要发送的数据组成,其可以包含 0-8 个字节的数据,每字姐 8 位,高位在前。CRC 段:CRC 即循环冗余校验码,其主要用于检测帧传输是否错误。应答段:表示确认接受正常的段。应答场(ACK)长度为 2 个位,包含应答间隙和应答界定符,在 ACK 场里,发送站发送两个隐性位。当接收器正确接收到有效地报文,接收器就会在应答间隙期间(发送 ACK 信号) 向发送器发送一显性位以示应答。图 6 应答段结构示意图帧结束:表示帧结束的段。帧结构就介绍到这里,关于远程帧、错误帧、过载帧可以去参考相关资料和书籍,都有很明确的讲解,这里就不多说了。关于帧间间隔:数据帧(或远程帧)与先行帧的隔离是通过帧间
17、空间实现的。无论此先行帧类型如何。所不同的是过载帧与错误帧之间没有帧间空间。多个过载帧之间也不是由帧间空间隔离的。帧间空间包括间歇,总线空闲的位场。如果错误被动的站已作为前一报文的发送器,则其帧空间除了间歇,总线空闲外,还包括称作挂起传送的位场。间歇(Intermission )间歇包括3个“隐性”的位。间歇期间,所有的节点均不允许传送数据帧或远程帧,唯一要做的是标示一个过载条件。如果 CAN 节点有一报文等待发送并且节点在间歇的第三位采集到一显性位,则此位被解释为帧的起始位,并从下一位开始发送报文的标识符首位,而不用首先发送帧的起始位或成为一接收器。总线空闲(Bus Idle)总线空闲的时间
18、是任意的。只要总线被认定为空闲,任何等待发送报文的节点就会访问总线。在发送其他报文期间,有报文被挂起,对于这样的报文,其传送起始于间歇之后的第一个位。4 CAN 应用层协议前面讲过,目前应用较广泛的 CAN 应用层协议有 DeviceNet 何 CANopen,DeviceNet 是为工厂自动控制而特别制定的,目前在美国自动化领域应用广泛。其具有以下特点: 最多支持 64 个节点; 生产者/消费者的网络模型; 支持 125kbps(500m)、250kbps(150m)、500kbps(100m)等多种波特率; 数据包为 0-8 字节; 支持设备热插拔,无需网络断电; 线性干线/支线,电源与信号在同一网络电缆中; 带多点传送的点对点,多主站和主/从轮询或状态改变()基于事件;CANopen 为基于 CAL 的子协议,用于产品部件和内部网络的空盒子,器不仅定义了应用层和通信子协议,也为可编程系统、不同器件、接口、应用子协议定义了页/帧状态,其具有以下特点; 网络结构简单; 网络设备可同步操作; 网络容量可达 127 个节点; 高传输速率 1Mbps; 极强的抗干扰能力和总线冲突仲裁方式; 统一的机构管理 开放性结构,对不同厂家设备具有好的兼容性。iCAN 协议