一、CAN是什么?
CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO*1 国际标准化的串行通信协议。
在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需要, 1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后, CAN 通过 ISO11898 及 ISO11519 进行了标准化,现在在欧洲已是汽车网络的标准协议。
现在, CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。
总线括扑图
CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。
二、CAN的特点
- 多主控制
在总线空闲时,所有的单元都可开始发送消息(多主控制)。
最先访问总线的单元可获得发送权(CSMA/CA 方式*1)。
多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权。 - 消息的发送
在 CAN 协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以开始发送新消息。两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。
并没有地址的概念,就是通过ID确定发送优先级罢了。当两个以上的单元同时发送消息,ID优先级低的则马上停止发送并进入接收状态。 - 系统的柔软性
与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。 - 通信速度
根据整个网络的规模,可设定适合的通信速度。
在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。
理解为连接在同一条CAN总线上就属于同一个网络,一条CAN就是一个网络,在一个网络中又没有SCL时钟信号,所以为了发送信息,需要定义一个通信速率以至于连接在该CAN的单元能正常通信。 - 远程数据请求
通过发送“遥控帧” 请求其他单元发送数据。 - 错误检测功能·错误通知功能·错误恢复功能
所有的单元都可以检测错误(错误检测功能)。
发送单元:一般都是检测当前自己发送的信号与总线上的信号是否一致,不一致则表明出现错误(即位错误:假如发送方A正发送一个隐性信号,但是在这一时刻,发送方B发送了一个显性信号,总线就会显示为显性信号,那此时发送方A就会检测到当前自己发送的信号跟总线上的信号不一致,出错了)
接收单元:出错的就多了,CRC错误、格式错误、补充错误等等。
检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。
正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。 - 故障封闭
CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
当单元的错误计数累计到了一定阀值之后,它就会自动关闭收发器与CAN断开。当过一段时间计数器减少到一定值后,其又可以重新连接。 - 连接
CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
例如:
CAN的ID仲裁,当连接单元多了,仲裁就更加复杂了。
或者单元多了,电压方面的问题。
三、错误
错误的种类
单元始终处于 3 种状态之一。
主动错误状态
主动错误状态是可以正常参加总线通信的状态。
处于主动错误状态的单元检测出错误时,输出主动错误标志。
根据错误计数值来定,错误数值(0~127)则属于该状态(少错误状态),该状态的
单元如果检测到错误时,它就可以发送错误标志为主动错误标志的错误帧(六个连
续的显性:显性肯定不受干扰、六个一样的信号符合填充错误),它这么一发呀,
总线上所有的单元都能检测到错误了(当然得看什么阶段,如果是仲裁阶段那自然
不叫错误,而是仲裁失败),这也就达到目的了(通知大家出错啦)
被动错误状态
被动错误状态是易引起错误的状态。
处于被动错误状态的单元虽能参加总线通信,但为不妨碍其它单元通信,接收时不能积极地发送错误通知。
处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。
处于被动错误状态的单元检测出错误时,输出被动错误标志。
另外,处于被动错误状态的单元在发送结束后不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8 个位的隐性位)。
根据错误计数值来定,错误数值(128~255)则属于该状态(少错误状态),该状
态的单元如果检测到错误时,只能发送错误标志为被动错误标志的错误帧(六个连
续的隐性:隐性很容易受显性覆盖、六个一样的信号符合填充错误),它这么一
发呀,大家很难得知其发送的错误信号,因为期间但凡有一个人发送了一个显性信
号,它发送的信号都无效了。
这也就是为什么说它:
虽能参加总线通信,但为不妨碍其它单元通信
不能积极的发送错误通知
其他人没发送主动的错误,那就代表没有错误
总线关闭态
总线关闭态是不能参加总线上通信的状态。
信息的接收和发送均被禁止。
这些状态依靠发送错误计数和接收错误计数来管理,根据计数值决定进入何种状态。错误状态和计数值的关系如表 1 及图 4 所示。
错误计数值
发送错误计数值和接收错误计数值根据一定的条件发生变化。
错误计数值的变动条件如表 2 所示。
一次数据的接收和发送可能同时满足多个条件。
错误计数器在错误标志的第一个位出现的时间点上开始计数。
四、CAN协议的基本概念
CAN 协议如表 3 所示涵盖了 ISO 规定的 OSI*1 基本参照模型中的传输层、数据链路层及物理层。
CAN 协议中关于 ISO/OSI 基本参照模型中的传输层、数据链路层及物理层,具体有哪些定义如图 5 所示。
数据链路层分为 MAC 子层和 LLC 子层, MAC 子层是 CAN 协议的核心部分。数据链路层的功能是将物理层收到的信号组织成有意义的消息,并提供传送错误控制等传输控制的流程。具体地说,就是消息的帧化、仲裁、应答、错误的检测或报告。数据链路层的功能通常在 CAN 控制器的硬件中执行。
在物理层定义了信号实际的发送方式、位时序、位的编码方式及同步的步骤。但具体地说,信号电平、通信速度、采样点、驱动器和总线的电气特性、连接器的形态等均未定义*1。这些必须由用户根据系统需求自行确定。
五、CAN 协议及标准规格
ISO 标准化的 CAN 协议
CAN 协议经 ISO 标准化后有 ISO11898 标准和 ISO11519-2 标准两种。 ISO11898 和 ISO11519-2 标准对于数据链路层的定义相同,但物理层不同。
(1) 关于 ISO11898
ISO11898 是通信速度为 125kbps-1Mbps 的 CAN 高速通信标准。
目前, ISO11898 追加新规约后,成为 ISO11898-1 新标准。
(2) 关于 ISO11519
ISO11519 是通信速度为 125kbps 以下的 CAN 低速通信标准。
ISO11519-2 是 ISO11519-1 追加新规约后的版本。
图 6 表示 CAN 协议和 ISO11898 及 ISO11519-2 标准的范围。
ISO11898 和 ISO11519-2 的不同点
(1) 物理层的不同点
如图 6 所示, ISO11898 和 ISO11519-2 在 CAN 协议中物理层的标准有所不同。 CAN 协议的物理层如图 7 所示,定义了三个子层, ISO11898 和ISO11519-2 在物理层中的 PMA 层和 MDI 层有所不同。
(2) 驱动 IC 的选择
ISO11898 与 ISO11519-2 的物理层的规格不同,每种规格需要有专门的驱动 IC 与之相对应。 ISO11898 及ISO11519-2 所对应的主要的驱动 IC 如表 5 所示。
CAN 和标准规格
六、CAN协议
帧的种类
通信是通过以下 5 种类型的帧进行的。
• 数据帧
• 遥控帧
• 错误帧
• 过载帧
• 帧间隔
数据帧
数据帧由 7 个段构成。
数据帧的构成如图 16 所示。
(1) 帧起始(SOF)
表示数据帧开始的段。
具体表示:一个显性位
(2) 仲裁段
表示该帧优先级的段。
标准格式和扩展格式在此的构成有所不同。
(3) 控制段
表示数据的字节数及保留位的段。
控制段由 6 个位构成,表示数据段的字节数。标准格式和扩展格式的构成有所不同。
标准:IDE(1:显)、r0(1:显)、DLC(4)
扩展:r1(1:显)、r0(1:显)、DLC(4)
(4) 数据段
数据的内容,可发送 0~8 个字节的数据。
(5) CRC 段
检查帧的传输错误的段。由 15 个位的 CRC 顺序*1 和 1 个位的 CRC 界定符(用于分隔的位)构成。
(6) ACK 段
表示确认正常接收的段。由 ACK 槽(ACK Slot)和 ACK 界定符 2 个位构成。
(7) 帧结束
表示数据帧结束的段。由 7 个位的隐性位构成。
遥控帧
接收单元向发送单元请求发送数据所用的帧。遥控帧由 6 个段组成。遥控帧没有数据帧的数据段。
遥控帧的构成如图 24 所示。
(1) 帧起始( SOF)
表示帧开始的段。
(2) 仲裁段
表示该帧优先级的段。可请求具有相同 ID 的数据帧。
(3) 控制段
表示数据的字节数及保留位的段。
(4) CRC 段
检查帧的传输错误的段。
(5) ACK 段
表示确认正常接收的段。
(6) 帧结束
表示遥控帧结束的段。
错误帧
用于在接收和发送消息时检测出错误通知错误的帧。错误帧由错误标志和错误界定符构成。
错误帧的构成如图 25 所示。
(1) 错误标志
错误标志包括主动错误标志和被动错误标志两种。
主动错误标志: 6 个位的显性位。
被动错误标志: 6 个位的隐性位。
(2) 错误界定符
错误界定符由 8 个位的隐性位构成。
过载帧
过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。
过载帧的构成如图 26 所示。
(1) 过载标志
6 个位的显性位。
过载标志的构成与主动错误标志的构成相同。
(2) 过载界定符
8 个位的隐性位。
过载界定符的构成与错误界定符的构成相同。
帧间隔
帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间隔。
(1) 间隔
3 个位的隐性位。
(2) 总线空闲
隐性电平,无长度限制(0 亦可)。
本状态下,可视为总线空闲,要发送的单元可开始访问总线。
(3) 延迟传送(发送暂时停止)
8 个位的隐性位。
只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。
优先级的决定
多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。
(1) 数据帧和遥控帧的优先级
(2) 标准格式和扩展格式的优先级
至于为什么可以去看具体帧的每一位,根据显隐性的特点,就可以得知优先级。
位填充
位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时则添加一个位的反型数据。
(1) 发送单元的工作
在发送数据帧和遥控帧时, SOF~CRC 段间的数据,相同电平如果持续 5 位,在下一个位(第 6 个位)则要插入 1 位与前 5 位反型的电平。
(2) 接收单元的工作
在接收数据帧和遥控帧时, SOF~CRC 段间的数据,相同电平如果持续 5 位,需要删除下一个位(第 6 个位)再接收。如果这个第 6 个位的电平与前 5 位相同,将被视为错误并发送错误帧。
错误的种类
错误共有 5 种。多种错误可能同时发生。
• 位错误
• 填充错误
• CRC 错误
• 格式错误
• ACK 错误
(1) 位错误
位错误由向总线上输出数据帧、遥控帧、错误帧、过载帧的单元和输出 ACK 的单元、输出错误的单元来检测。
在仲裁段输出隐性电平,但检测出显性电平时,将被视为仲裁失利,而不是位错误。
在仲裁段作为填充位输出隐性电平时,但检测出显性电平时,将不视为位错误,而是填充错误。
发送单元在 ACK 段输出隐性电平,但检测到显性电平时,将被判断为其它单元的 ACK 应答,而非位错误。
输出被动错误标志( 6 个位隐性位)但检测出显性电平时,将遵从错误标志的结束条件,等待检测出连续相同 6 个位的值(显性或隐性),并不视为位错误。
(2) 格式错误
即使接收单元检测出 EOF( 7 个位的隐性位)的最后一位(第 8 个位)为显性电平,也不视为格式错误。
即使接收单元检测出数据长度码( DLC)中 9∼15 的值时,也不视为格式错误。
错误帧的输出
检测出满足错误条件的单元输出错误标志通报错误。
处于主动错误状态的单元输出的错误标志为主动错误标志;处于被动错误状态的单元输出的错误标志为被动错误标志。
发送单元发送完错误帧后,将再次发送数据帧或遥控帧。
位时序
由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。
• 同步段( SS)
• 传播时间段( PTS)
• 相位缓冲段 1( PBS1)
• 相位缓冲段 2( PBS2)
这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。
1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。
1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。
各段的作用和 Tq 数如表 11 所示。 1 个位的构成如图 32 所示。
取得同步的方法
CAN 协议的通信方法为 NRZ(Non-Return to Zero)方式。各个位的开头或者结尾都没有附加同步信号。发送单元以与位时序同步的方式开始发送据。另外,接收单元根据总线上电平的变化进行同步并进行接收工作。
但是,发送单元和接收单元存在的时钟频率误差及传输路径上的(电缆、驱动器等)相位延迟会引起同步偏差。因此接收单元通过硬件同步或者再同步的方法调整时序进行接收。
硬件同步
接收单元在总线空闲状态检测出帧起始时进行的同步调整。
在检测出边沿的地方不考虑 SJW 的值而认为是 SS 段。
硬件同步的过程如图 33 所示。
检测到起始信号(总线空闲时信号由隐性跳变成显性的边沿),不管在接收单元的
哪个段,接收单元该位都同步为同步段(SS)
再同步
在接收过程中检测出总线上的电平变化时进行的同步调整。
每当检测出边沿时,根据 SJW 值通过加长 PBS1 段,或缩短 PBS2 段,以调整同步。但如果发生了超出 SJW值的误差时,最大调整量不能超过 SJW 值。
再同步如图 34 所示。
调整同步的规则
硬件同步和再同步遵从如下规则。
(1) 1 个位中只进行一次同步调整。
(2) 只有当上次采样点的总线值和边沿后的总线值不同时,该边沿才能用于调整同步。
(3) 在总线空闲且存在隐性电平到显性电平的边沿时,则一定要进行硬件同步。
(4) 在总线非空闲时检测到的隐性电平到显性电平的边沿如果满足条件( 1)和( 2),将进行再同步。但还要满足下面条件。
(5) 发送单元观测到自身输出的显性电平有延迟时不进行再同步。
(6) 发送单元在帧起始到仲裁段有多个单元同时发送的情况下,对延迟边沿不进行再同步。