简介
CAN是控制器局域网络(Controller Area Network,CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO11898),是国际上应用最广泛的现场总线之一。在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。
现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。
一 can总线示例:
二 总线拓扑:
CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平(0)和隐性电平(1),二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。
物理层
CAN通讯是异步通讯,只有CAN_High和CAN_Low两条信号线,共同构成一组差分信号线,以差分信号的形式进行通讯。
一 闭环总线网络:速度快,距离短,它的总线最大长度为40m,通讯速度最高1Mbps,总线两端各有一个120欧的电阻。
二 开环总线网络:低速,远距离,它的最大传输距离为1km,最高的通讯速率为125Kbps,两根总线独立的,两根总线各串联有一个2.2千欧的电阻。
三 通讯节点:
- can总线上可以挂载多个通讯节点,节点之间的信号进过总线传输,实现节点间通讯。由于 CAN 通讯协议不对节点进行地址编码,而是对数据内容进行编码的,所以网络中的节点个数理论上不受限制,只要总线的负载足够即可,可以通过中继器增强负载。
- CAN 通讯节点由一个 CAN 控制器及 CAN 收发器组成,控制器与收发器之间通过CAN_Tx 及CAN_Rx 信号线相连,收发器与 CAN 总线之间使用 CAN_High 及 CAN_Low信号线相连。其中 CAN_Tx 及 CAN_Rx 使用普通的类似 TTL 逻辑信号,而 CAN_High 及CAN_Low 是一对差分信号线,使用比较特别的差分信号,下一小节再详细说明。
- 当 CAN 节点需要发送数据时,控制器把要发送的二进制编码通过 CAN_Tx 线发送到收发器,然后由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High 和 CAN_Low 线输出到 CAN 总线网络。而通过收发器接收总线上的数据到控制器时,则是相反的过程,收发器把总线上收到的 CAN_High 及 CAN_Low 信号转化成普通的逻辑电平信号,通过 CAN_Rx 输出到控制器中。
四 差分信号:
差分信号又称差模信号,与传统使用单根信号线电压表示逻辑的方式有区别,使用差分信号传输时,需要两根信号线,这两个信号线的振幅相等,相位相反,通过两根信号线的电压差值来表示逻辑 0 和逻辑 1。
相对于单信号线,差分信号传输的优点:
- 抗干扰能力强,当外界存在噪声干扰时,几乎会同时耦合到两条信号线上,而接收端只关心两个信号的差值,所以外界的共模噪声可以被完全抵消。
- 能有效抑制它对外部的电磁干扰,同样的道理,由于两根信号的极性相反,他们对外辐射的电磁场可以相互抵消,耦合的越紧密,泄放到外界的电磁能量越少。
- 时序定位精确,由于差分信号的开关变化是位于两个信号的交点,而不像普通单端信号依靠高低两个阈值电压判断,因而受工艺,温度的影响小,能降低时序上的误差,同时也更适合于低幅度信号的电路。
由于差分信号线具有这些优点,所以在 USB 协议、485 协议、以太网协议及 CAN 协议的物理层中,都使用了差分信号传输。
五 CAN协议中的差分信号:
CAN 协议中对它使用的 CAN_High 及 CAN_Low 表示的差分信号做了规定。高速 CAN 协议为例,当表示逻辑 1 时(隐性电平),CAN_High 和 CAN_Low线上的电压均为 2.5v,即它们的电压差 VH-VL=0V;而表示逻辑 0 时(显性电平),CAN_High 的电平为 3.5V,CAN_Low 线的电平为 1.5V,即它们的电压差为 VH-VL=2V。例如,当 CAN 收发器从 CAN_Tx 线接收到来自 CAN 控制器的低电平信号时(逻辑 0),它会使 CAN_High 输出 3.5V,同时 CAN_Low 输出 1.5V,从而输出显性电平表示逻辑 0。
在 CAN 总线中,必须使它处于隐性电平(逻辑 1)或显性电平(逻辑 0)中的其中一个状态。假如有两个 CAN 通讯节点,在同一时间,一个输出隐性电平,另一个输出显性电平,类似 I2C 总线的“线与”特性将使它处于显性电平状态,显性电平的名字就是这样来的,即可以认为显性具有优先的意味。
由于 CAN 总线协议的物理层只有 1 对差分线,在一个时刻只能表示一个信号,所以对通讯节点来说,CAN 通讯是半双工的,收发数据需要分时进行。在 CAN 的通讯网络中,因为共用总线,在整个网络中同一时刻只能有一个通讯节点发送信号,其余的节点在该时刻都只能接收。
CAN的特点
一 多主控制
- 在总线空闲时,所有的单元都可开始发送消息(多主控制)。
- 最先访问总线的单元可获得发送权(CSMA/CA 方式*1)。
- 多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权。
二 消息的发送
- 在 CAN 协议中,所有的消息都以固定的格式发送。
- 总线空闲时,所有与总线相连的单元都可以开始发送新消息。两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。
- ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。
- 两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。
- 仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
三 系统的柔软性
- 与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
四 通信速度
- 根据整个网络的规模,可设定适合的通信速度。
- 在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。
五 远程数据请求
- 可通过发送“遥控帧” 请求其他单元发送数据。
六 错误检测功能·错误通知功能·错误恢复功能
- 所有的单元都可以检测错误(错误检测功能)。
- 检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。
- 正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
七 故障封闭
- CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。
- 当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
八 连接
- CAN 总线是可同时连接多个单元的总线。
- 实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
协议层
一 位时序的分解:
- 为了实现位同步,CAN 协议把每一个数据位的时序分解成 SS 段、PTS 段、PBS1 段、PBS2 段,这四段的长度加起来即为一个 CAN 数据位的长度。分解后最小的时间单位是 Tq,而一个完整的位由 8~25 个 Tq 组成。为方便表示,下图中的高低电平直接代表信号逻辑 0 或逻辑 1(不是差分信号)。
- 下图中表示的 CAN 通讯信号每一个数据位的长度为 19Tq,其中 SS 段占 1Tq,PTS 段 占 6Tq,PBS1 段占 5Tq,PBS2 段占 7Tq。信号的采样点位于 PBS1 段与 PBS2 段之间,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样。
- SS 段(SYNC SEG)
SS 译为同步段,若通讯节点检测到总线上信号的跳变沿被包含在 SS 段的范围之内,则表示节点与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电平。SS 段的大小固定为 1Tq。 - PTS 段(PROP SEG)
PTS 译为传播时间段,这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS 段的大小可以为 1~8Tq。 - PBS1 段(PHASE SEG1),
PBS1 译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长。PBS1 段的初始大小可以为 1~8Tq。 - PBS2 段(PHASE SEG2)
PBS2 这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短。PBS2 段的初始大小可以为 2~8Tq。
二 帧的种类及用途:
帧 | 帧用途 |
---|---|
数据帧 | 用于发送单元向接收单元传送数据的帧。 |
遥控帧 | 用于接收单元向具有相同 ID 的发送单元请求数据的帧。 |
错误帧 | 用于当检测出错误时向其它单元通知错误的帧。 |
过载帧 | 用于接收单元通知其尚未做好接收准备的帧。 |
帧间隔 | 用于将数据帧及遥控帧与前面的帧分离开来的帧。 |
三 数据帧的结构:
数据帧是在CAN通讯中最主要、最复杂的报文。结构如下
数据帧以一个显性位(逻辑 0)开始,以 7 个连续的隐性位(逻辑 1)结束,在它们之间,分别有仲裁段、控制段、数据段、CRC 段和 ACK 段。
-
帧起始
SOF 段(Start Of Frame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平,它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。 -
仲裁段
当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称的由来。
仲裁段的内容主要是数据段的ID信息,数据帧有标准格式和扩展格式两种,区别在于ID信息的长度。ID信息决定着数据帧发送的优先级,也决定着其他节点是否会接受这个数据帧。
报文的优先级,是通过对 ID 的仲裁来确定的。根据前面对物理层的分析我们知道如果总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平,CAN 正是利用这个特性进行仲裁。
如下图两个节点同时竞争CAN总线占有权,很明显ID信息越低优先级越高。
仲裁段除了ID信息外,还有RTR、IDE和SSR位:
1、RTR位(Remote Transmission Request Bit),译作远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。
2、IDE 位(Identifier Extension Bit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。
3、SRR 位(Substitute Remote Request Bit),只存在于扩展格式,它用于替代标准格式中的RTR 位。由于扩展帧中的 SRR 位为隐性位,RTR 在数据帧为显性位,所以在两个 ID相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。 -
控制段
在控制段中的 r1 和 r0 为保留位,默认设置为显性位。它最主要的是 DLC 段(Data Length Code),译为数据长度码,它由 4 个数据位组成,用于表示本报文中的数据段含有多少个字节,DLC 段表示的数字为 0~8。 -
数据段
数据段为数据帧的核心内容,它是节点要发送的原始信息,由 0~8 个字节组成,MSB先行。 -
CRC段
为了保证报文的正确传输,CAN 的报文包含了一段 15 位的 CRC 校验码,一旦接收节点算出的 CRC 码跟接收到的 CRC 码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC 部分的计算一般由 CAN 控制器硬件完成,出错时的处理则由软件控制最大重发数。
在 CRC 校验码之后,有一个 CRC 界定符,它为隐性位,主要作用是把 CRC 校验码与后面的 ACK 段间隔起来。 -
ACK段
ACK 段包括一个 ACK 槽位,和 ACK 界定符位。类似 I2C 总线,在 ACK 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在 ACK 槽和帧结束之间由 ACK 界定符间隔开。 -
帧结束
EOF 段(End Of Frame),译为帧结束,帧结束段由发送节点发送的 7 个隐性位表示结束。
以下不展开描述
四 遥控帧:
接收单元向发送单元请求发送数据所用的帧。遥控帧由 6 个段组成。遥控帧没有数据帧的数据段。
- 帧起始(SOF)
表示帧开始的段。 - 仲裁段
表示该帧优先级的段。可请求具有相同 ID 的数据帧。 - 控制段
表示数据的字节数及保留位的段。 - CRC 段
检查帧的传输错误的段。 - ACK 段
表示确认正常接收的段。 - 帧结束
表示遥控帧结束的段。
- 数据帧和遥控帧的不同
遥控帧的 RTR 位为隐性位,没有数据段。
没有数据段的数据帧和遥控帧可通过 RTR 位区别开来。 - 遥控帧没有数据段,数据长度码该如何表示?
遥控帧的数据长度码以所请求数据帧的数据长度码表示。 - 没有数据段的数据帧有何用途?
例如,可用于各单元的定期连接确认/应答、或仲裁段本身带有实质性信息的情况下。
五 错误帧:
用于在接收和发送消息时检测出错误通知错误的帧。错误帧由错误标志和错误界定符构成。
- 错误标志
错误标志包括主动错误标志和被动错误标志两种。
主动错误标志:6 个位的显性位。
被动错误标志:6 个位的隐性位。 - 错误界定符
错误界定符由 8 个位的隐性位构成。
*1 主动错误标志
处于主动错误状态的单元检测出错误时输出的错误标志。
*2 被动错误标志
处于被动错误状态的单元检测出错误时输出的错误标志。
六 过载帧:
过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。
过载帧的构成如图 26 所示。
- 过载标志
6 个位的显性位。
过载标志的构成与主动错误标志的构成相同。 - 过载界定符
8 个位的隐性位。
过载界定符的构成与错误界定符的构成相同。
七 帧间隔:
帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间隔。
- 间隔
3 个位的隐性位。 - 总线空闲
隐性电平,无长度限制(0 亦可)。
本状态下,可视为总线空闲,要发送的单元可开始访问总线。 - 延迟传送(发送暂时停止)
8 个位的隐性位。
只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。
待续。。。
参考:瑞萨电子 CAN 入门书下载