目录
CAN标准
1991年,Bosch发布CAN 2.0 标准协议,随后 ISO 标准化了该协议,发布了ISO 11898 和 ISO 11519 两种标准。
从 1993 第一个版 CAN 国际标准(ISO 11898:1993 和 ISO 11519-2)发布至今,ISO 11898 逐渐被分割整合成了相互独立的 6 个部分。分别以 Part 1 ~ Part 6 来标识。在旧版本(2003年之前)中,ISO 11898 是通信速度为 5kbps - 1Mbps 的 CAN 高速通信标准。规范中同时定义了 数据链路层和高速物理层。ISO 11519 是通信速度为 125kbps 以下的 CAN 低速通信标准,也就是容错CAN(LSFT CAN)。提供从5 Kbit/s到125 Kbits/s的波特率。该标准允许在CAN总线连线失败时CAN总线通信得以继续进行。
从 2003 年开始,ISO 将原先的 ISO 11898 CAN标准的数据链路和高速物理层的标准分离为 ISO 11898-1 和 ISO 11898-2 两部分。后续又发布了其他几个部分,如下:
在 2016 年,又再一次进行了整合。在 2016 年,其中的 Part 2、Part 5 和 Part 6 被合并成了一个新的 Part 2,即:ISO 11898-2-2016。ISO 11898目前现状如下:
1. ISO 11898-1-2015 :
是 ISO 11898-1-2003 的最新修订版本, 全名为 ISO 11898-1:2015 Road vehicles – Controller area network (CAN) – Part 1: Data link layer and physical signalling 指定经典 CAN 帧格式和新引入的CAN FD 帧格式。 经典 CAN 帧格式允许比特率高达1 Mbit/s,有效载荷最高可达每帧 8 字节。 CAN FD 帧格式允许比特率高于 1 Mbit/s,有效载荷超过每帧 8 字节。
(1)这部分综合了 Bosch CAN 2.0 规范 和 Bosch CAN FD。
(2)ISO 11898-2 和 ISO 11898-3 共用 ISO 11898-1。也就是 ISO 11898-1 规定的数据链路层是共用的!
(3)从 2003 开始,ISO 11898-1 不再包含 高速物理层的相关定义,这部分被独立到了ISO 11898-2 中。
2. ISO 11898-2-2016:
ISO 11898-2-2016 是 ISO 11898-2-2003 的最新修订版本,全名为 ISO 11898-2:2016 Road vehicles – Controller area network (CAN) – Part 2: High-speed medium access unit。 此外,11898-5:2007 和 11898-6:2013 被整合到 11898-2:2016 之中,原有的 11898-5:2007 和 11898-6:2013 被撤回。指定了controller area network (CAN) 的高速物理媒体附属层(HS-PMA),包括没有和具有低功耗模式功能以及具有选择性唤醒功能的 HS-PMA(High-Speed Physical Media Attachment) 。依赖于物理媒体的子层不在本文档的范围内。
3. ISO 11898-3:2006/Cor 1:2006:
全名为 ISO 11898-3:2006 Road vehicles – Controller area network (CAN) – Part 3: Low-speed, fault-tolerant, medium-dependent interface . 规定了在配备 CAN 的公路车辆的电子控制单元之间建立数字信息交换的特性,传输速率为 40 kBit/s 至 125 kBit/s。其取代了最早发布的 ISO 11519-2:1994。ISO 11898-3:2006/Cor 1:2006 为勘误和修改版本。
4. ISO 11898-4-2004:
全名为 ISO 11898-4:2004 Road vehicles – Controller area network (CAN) – Part 4: Time-triggered communication. 指定CAN中的时间触发通信。该标准最后一次审查并于2019年确认。因此该版本仍然是最新版本。
物理层
下图为OSI模型各层中CAN定义事项,后续将按此进行物理层定义事项说明。
1. 电气特性(标准中未完全定义,用户根据系统需求确定)
网络拓扑
CAN 收发器根据两根总线(CAN_High 和 CAN_Low)的电位差来判断总线电平。 总线电平分为显性电平和隐性电平两种。总线必须处于两种电平之一。总线上执行逻辑上的线“与”时, 显性电平为“0”,隐性电平为“1”。物理层网络拓扑如下图:
通信速度与电缆
下表为一般特性,仅供参考。
(1)CAN总线采用差分信号传输,如果使用带屏蔽双绞线,屏蔽层应单点接地。
(2)通常电缆截面积越小,其分布电容、分布电感和直流电阻越大。当通讯距离较远时,电容、电感和直流电阻会引起信号衰减,波形失真和抖动。一般情况下,电缆供应商会提供信号衰减图表。 为了保证可靠的数据通讯,一个有用的经验法则是:最末端节点差分电压幅值不小于1.2V。为了把电缆直流电阻引起的电压衰减降到最小,较大的终端电阻值(150~300欧姆)有助于增加总线长度。
(3)阻抗匹配
终端匹配电阻大小等于传输电缆特性阻抗,传输电缆特性阻抗由电缆供应商提供,一般近似为Z=√(L/C)。其中L为电缆单位长度感抗,C为电缆单位长度电容。
由于CAN收发器结构,从隐性变成显性由晶体管驱动,所以都是很陡的,但是从显性回到隐性,却需要终端电阻来放电(减少信号反射,抑制寄生电容),否则就会由于导线分布电容,缓慢放电,导致位宽错误。所以所谓的近距离、低波特率CAN总线不加终端电阻的做法,都是错误的。
在实际项目布线时,容易漏加或者多加终端匹配电阻。我们可以通过测量CAN差分电压幅值来评估是否漏加或多加终端匹配电阻。如果不计导线电阻,终端电阻固定为120欧姆,单节点CAN总线差分电压如下表:
终端电阻个数 | 单节点CAN总线差分电压幅值 |
1 | 2.5V |
2 | 2V |
3 | 1.5-1.7V |
4 | 1.1-1.3V |
(4)节点间距
CAN总线是分布式参数电路,其电气特性和响应主要由沿物理介质分布的电感和电容所决定。这里物理介质包括连接电缆、连接器、终端和沿总线挂接的CAN设备。
空载情况下,传输电缆的特性阻抗近似为Z=√(L/C),其中L为电缆单位长度感抗,C为电缆单位长度电容。随着负载的增加,传输线上的电容增加(负载电容、负载与总线连接线电容),传输电缆特性阻抗相比空载情况下变小。如果负载比较集中,则负载区传输电缆特性阻抗和空闲区电缆特性阻抗相差较大,从而会引起阻抗不匹配。CAN总线阻抗不匹配会产生信号反射,雪上加霜的是CAN的仲裁机制:在仲裁期间,两个或更多个节点可能同时发送多个显性位。
负载与负载之间的最小安全距离d是设备集总负载电容CL和电缆的单位长度分布电容C的函数,定义如下:
设备集总负载电容CL包括CAN收发器引脚、连接器、隔离器件、保护器件、印制电路板走线以及其它物理连线的电容总和。
(5)节点容抗
在CAN通讯电路设计过程中,节点容抗是容易被忽略的。节点容抗包括收发器引脚电容、PCB走线电容、ESD器件电容以及其它连线电容。
CAN标准对节点容抗有严格定义,容抗影响上升沿下降沿斜率,节点容抗增大,上升沿和下降沿会变缓,导致位时间畸变,误码率增加。上升沿和下降沿变缓会使得信号延迟变大,在高波特率下,影响信号传输质量和通讯距离。
节点容抗不易测量,需要专门仪器。在电路设计时,要对结合数据手册中给出的典型值,对CAN接口电路使用的器件总电容值进行估算。对于高波特率情况下,单节点电容推荐<100pF,多节点电容推荐值见下表。低波特率应用可以放宽要求。
(6)节点数量
可以连接到网络上的节点数量由收发器可以驱动的最小负载阻抗来决定。最大节点数量由下面的公式给出(考虑最坏情况):
其中:
Rdiff_min:收发器差动输入阻抗最小值
RL_min:收发器可驱动的负载电阻最小值
RT_min:终端匹配电阻最小值
在上式中,收发器差动输入阻抗最小值(Rdiff_min)和收发器可驱动的负载阻抗最小值(RL_min)由收发器芯片决定,终端匹配电阻最小值(RT_min)由传输电缆特性阻抗以及具体应用决定。
容错性能
高速CAN
低速CAN
2. PLS层:位编码方式
位编码方式对辐射发射具有重大意义。智能设计的位编码有助于显著减少辐射,但必须经常与所需的输送能力进行协调。
归零编码(RZ)和不归零编码(NRZ)
无论是归零编码(return-to-zero,RZ)还是不归零编码(non-return to zero,NRZ),信号都是在正 (+V) 和负 (- V) 电压之间交替。逻辑1 表示正电压下的信号,逻辑 0 表示负电压下的信号。然而,在 NRZ 方法中,从逻辑 0 到逻辑 1 的转换(反之亦然),直接跨越零电压电平,而在 RZ 方法中,转换暂时停留在零电压电平上。如下图所示:
在光通信中,术语 RZ 和 NRZ 使用与以上含义不同,因为没有负光。NRZ 意味着逻辑值 1 (光脉冲)的一个位在位周期的边界上改变它的值(从光到无光或反之亦然)。相反,RZ 表示光脉冲比比特周期窄。在光信号中,逻辑 1 导通大约三分之一的位周期并且关闭大约三分之二。 逻辑 0 在比特周期的三分之二时间内保持关闭状态。
NRZ(Non Return to Zero,不归零)位编码被用于CAN。这意味着二进制信号与物理电平的映射关系:逻辑“1”对应高电平,逻辑“0”对应低电平。NRZ编码的特征在于,相同极性的连续位没有电平变化。NRZ编码能够实现极高的波特率,同时又可将辐射保持在限制范围内。但NRZ编码不是自同步的,即不具有任何同步属性。如果较长时间内没有发生电平变化,则接收方将不能保持同步。因此使用NRZ编码需要显式同步机制,但这会降低传输效率。在CAN总线中,使用位填充方法作为同步机制:发送方在传输五个相同位后,在位流中插入一个相反的位。曼彻斯特(Manchester)编码没有这种机制,因为它是自同步的。
位填充
位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时则添加一个位的反型数据。 位填充的构成如图所示:
(1) 发送单元的工作 在发送数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,在下一个位(第 6 个位)则 要插入 1 位与前 5 位反型的电平。
(2) 接收单元的工作 在接收数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,需要删除下一个位(第 6 个 位)再接收。如果这个第 6 个位的电平与前 5 位相同,将被视为错误并发送错误帧。
3. PMA层:位时序
由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。出于时序目的,CAN总线上的每个位都划分成至少4个时间份额,时间份额逻辑上划分成四个组或段。
• 同步段(SS)
• 传播时间段(PTS)
• 相位缓冲段 1(PBS1)
• 相位缓冲段 2(PBS2)
这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。
1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。
1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。一般CAN节点是每个位采样一次(也可以采样3次,多用于低速场合),采样点位置都在一个位的50%以后的区域,这是为了让信号电平趋于稳定。采样点越靠后,波形越稳定。但也不是越靠后越好,采样点位置超过95%时,因为传输过程中的位偏差,可能会引起错误。CIA推荐采样点为一个位时间的87.5%处,实际项目中,一般设置为70%~90%,大部分汽车厂商规定采样点为70~80%。 采样点略靠后,比如80~90%,有利于远距离传输。提高节点波特率寄存器中的同步跳转宽度SJW值(加大到3个单位时间),可以加大位宽度和采样点的容忍度。
各段的作用和 Tq 数如下图所示:
1 个位的构成如下图所示:
4. MDI层:同步
CAN 协议的通信方法为 NRZ(Non-Return to Zero)方式。各个位的开头或者结尾都没有附加同步信号。发送 单元以与位时序同步的方式开始发送数据。另外,接收单元根据总线上电平的变化进行同步并进行接收工作。 但是,发送单元和接收单元存在的时钟频率误差及传输路径上的(电缆、驱动器等)相位延迟会引起同步偏 差。因此接收单元通过硬件同步或者再同步的方法调整时序进行接收。
硬件同步
接收单元在总线空闲状态检测出帧起始时进行的同步调整。 在检测出边沿的地方不考虑 SJW 的值而认为是 SS 段。 硬件同步的过程如下图所示:
再同步
在接收过程中检测出总线上的电平变化时进行的同步调整。 每当检测出边沿时,根据 SJW 值通过加长 PBS1 段,或缩短 PBS2 段,以调整同步。但如果发生了超出 SJW 值的误差时,最大调整量不能超过 SJW 值。
硬件同步和再同步遵从如下规则。
(1) 1 个位中只进行一次同步调整。
(2) 只有当上次采样点的总线值和边沿后的总线值不同时,该边沿才能用于调整同步。
(3) 在总线空闲且存在隐性电平到显性电平的边沿时,则一定要进行硬件同步。
(4) 在总线非空闲时检测到的隐性电平到显性电平的边沿如果满足条件(1)和(2),将进行再同步。但还要满足下面条件。
(5) 发送单元观测到自身输出的显性电平有延迟时不进行再同步。
(6) 发送单元在帧起始到仲裁段有多个单元同时发送的情况下,对延迟边沿不进行再同步。
数据链路层
下图为OSI模型各层中CAN定义事项,后续将按此进行数据链路层定义事项说明。
1.MAC层
通信方式
仲裁是485和CAN的区别之一。总线空闲时,所有单元都可以发送消息。两个以上单元同时发送消息时,根据标识符决定优先级,对各消息标识符的每个位进行逐个仲裁比较。仲裁获胜的单元可继续发送消息,仲裁失利的单元立刻停止发送而进行接收工作。
CAN的实质是半双工,因为其数据收发不能同时进行。但从应用层的角度来看(从CAN控制器角度看),CAN又可以认为是伪全双工,因为CAN存在仲裁,各应用单元可以随心所欲收发数据,不必关心当前实际正在接收还是发送。
应答方式
CAN是一种基于广播的通讯方式,为了保证总线上的每一个节点都能正确的接收到报文,报文的发送者要求每一个接收节点在报文发送结束前,也就是ACK SLOT 的时间内,作出应答,即在ACK段上,要求接收节点在报文正确性的基础上及时发送一个“显性”位。发送者在发送的同时会监视总线上的数据,如果与发送的数据不一致,则表示发送失败或自己失去仲裁,立即停止发送或转入接收模式。由于发送者在发送数据的同时会向ACK段连续写入2个隐性位,如果发送者在回读过程中监控到ACK SLOT 位为“显性”位,则说明接收者已正确接收;如果发送者在回读过程中监控到ACK SLOT 位为“隐性”位,则说明没有节点正确接收该报文,则发送者会检测到这个隐性位而知道发送失败,此条报文需要重发,ACK应答机制框图如下:
多节点接收工况下若出现仅单节点正确接收,那么又会出现什么情况呢? 由于某节点正常接收,基于线与机制总线上ACK SLOT 位必定为“显性”,隐性失效,从而可以说明:ACK场是用于确定报文被至少一个节点正确接收。该工况下就无法基于ACK场进行判断,但会触发错误帧相关机制,立即开始发送一个错误帧,则接下去总线上的信号就是这个错误帧,其它的节点和发送者也都会收到这个错误帧,那所有的节点都知道出错了,接收者会丢掉此次消息,而发送者会试图重发此次消息。
错误检测
CAN总线具有严格的错误诊断功能,该功能已经固化在芯片中,一旦错误被检测,正在传送的数据帧将会立即停止而待总线空闲时再次重发直至发送成功,该过程并不需要CPU的干涉,除非错误累计该发送器进入总线关闭(Bus Off)。
错误共有 5 种。多种错误可能同时发生。错误的种类、错误的内容、错误检测帧和检测单元如下
(1) 位错误
位错误由向总线上输出数据帧、遥控帧、错误帧、过载帧的单元和输出ACK 的单元、输出错误的单元来检测。
在仲裁段输出隐性电平,但检测出显性电平时,将被视为仲裁失利,而不是位错误。
在仲裁段作为填充位输出隐性电平时,但检测出显性电平时,将不视为位错误,而是填充错误。
发送单元在ACK 段输出隐性电平,但检测到显性电平时,将被判断为其它单元的ACK 应答,而非位错误。
输出被动错误标志(6 个位隐性位)但检测出显性电平时,将遵从错误标志的结束条件,等待检测出连续相同6 个位的值(显性或隐性),并不视为位错误。
(2) 格式错误
即使接收单元检测出EOF(7 个位的隐性位)的最后一位(第8 个位)为显性电平,也不视为格式错误。
即使接收单元检测出数据长度码(DLC)中9∼15 的值时,也不视为格式错误。
错误界定(故障扩散抑制)
节点错误状态: 节点单元始终处于 3 种状态之一。
(1) 主动错误状态
主动错误状态是可以正常参加总线通信的状态。
处于主动错误状态的单元检测出错误时,输出主动错误标志。
(2) 被动错误状态
被动错误状态是易引起错误的状态。
处于被动错误状态的单元虽能参加总线通信,但为不妨碍其它单元通信,接收时不能积极地发送错误通知。
处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。
处于被动错误状态的单元检测出错误时,输出被动错误标志。
另外,处于被动错误状态的单元在发送结束后不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8 个位的隐性位)。
(3) 总线关闭态
总线关闭态是不能参加总线上通信的状态。
信息的接收和发送均被禁止。
这些状态依靠发送错误计数和接收错误计数来管理,根据计数值决定进入何种状态。错误状态和计数值的关系如下表:
发送错误计数值和接收错误计数值根据一定的条件发生变化。
错误计数值的变动条件如下表所示。一次数据的接收和发送可能同时满足多个条件。
错误计数器在错误标志的第一个位出现的时间点上开始计数。
当出现错误时,错误计数器进行累加,并且大部分比的错误,计数器都是直接加8。而正常收发一帧数据,计数器只会减1。这样的设计结合状态迁移的规则,是非常巧妙的,考虑如下几种场景。
1. 总线工作健康,只是由于短时间的干扰偶发一两个错误
所以如果只是偶发的几个错误导致错误计数器增加了一些值,在正常收发数据的节点,错误计数器都会很快会自减,不会超过127。所以节点会一直处于错误主动状态。
2. 总线上有节点工作不正常,经常被发出有错误的数据
如果错误帧/正常帧的比例超过1/8,那么错误计数器的值就会持续累加。如果节点状态短时间恢复正常,那么还可以继续工作。但是如果节点发生了永久性的故障,持续的发生错误,那么错误计数器持续增加超过127或者255,节点就会进入错误被动或者总线关闭状态。
错误帧
用于在接收和发送消息时检测出错误通知错误的帧。错误帧由错误标志和错误界定符构成。
错误帧的构成如下图所示。
(1) 错误标志
错误标志包括主动错误标志和被动错误标志两种。
主动错误标志:6 个位的显性位。
被动错误标志:6 个位的隐性位。
(2) 错误界定符
错误界定符由 8 个位的隐性位构成。
错误通知
检测出满足错误条件的单元输出错误标志通报错误。处于主动错误状态的单元输出的错误标志为主动错误标志;处于被动错误状态的单元输出的错误标志为被动错误标志。发送单元发送完错误帧后,将再次发送数据帧或遥控帧。错误标志输出时点如下表所示。
(1)局部错误(位,填充,ACK错误)
例① 假设总线上所有节点处于主动错误状态;
当一个发送节点监控到总线上的位数值与发送的位数值不一致,或时,检测为位错误,并发送主动错误标志(6个连续的显性位);
接收节点接收到发送节点发送的6个连续的显性位时,会检测为位填充错误,也会发送主动错误标志;
发送节点发送完主动错误标志后,开始监控总线是否为隐性位,当总线为隐性位时,开始发送错误界定符(8个连续的隐性位);
当接收节点发送完主动错误标志后,开始向总线发送错误界定符;
等待错误帧发送完成,总线空闲后,发送节点重新发送出错的报文;
注:由于发送节点发送6个连续的显性位会破坏位填充规则,触发接收节点发送主动错误标志,发送节点和接收节点的结合是形成错误标志叠加部分的原因。如下两图分别表示错误标志重叠部分为6+6个显性位和6+4个显性位的情况:
例② 假设发送节点处于被动错误状态,接收节点处于主动错误状态;
当发送节点监控到总线上的位数值与发送的位数值不一致时,检测为位错误,并发送被动错误标志(6个连续的隐性位);
接收节点接收到发送节点发送的6个连续的隐性位时,会检测为位填充错误,并会发送主动错误标志;
发送节点发送完被动错误标志后,开始监控总线是否为隐性位,当总线为隐性位时,开始发送错误界定符(8个连续的隐性位);
接收节点发送完主动错误标志后,开始监控总线是否为隐性位,当总线为隐性位时,开始发送错误界定符(8个连续的隐性位);
(2)公共错误
例 假设总线上所有节点处于主动错误状态;
当接收节点和发送节点检测到总线上的格式错误时,向总线上发送主动错误标志;
(3)CRC错误
例 假设所有节点都处于主动错误状态;
当接收节点检测到CRC错误后,在ACK界定符之后,向总线发送主动错误标志;
发送节点检测到格式错误(EOF的固定格式为7个连续的隐性位),同时向总线发送主动错误标志;
注:错误标志重叠部分为6+1个显性位
连接控制方式/冲突仲裁
(1) 多主控制
在CAN总线上,每个节点都有往总线上发送消息的能力(多主控制),而且消息的发送不必遵从任何预先设定的时序,通信是事件驱动的。只有当有新的信息传递时,CAN总线才处于忙的状态,这使得节点接入总线速度非常快。CAN总线理论最高数据传输速率为1Mbps,对于异步事件反应迅速,基本上对于毫秒级的实时应用没有任何问题。
(2)CSMA/CA
CAN总线通信原理可简单描述为多路载波侦听+基于消息优先级的冲突检测和仲裁机制(*CSMA/CD+AMP*),CSMA(Carrier Sense Multiple Access )指的所有节点必须都等到总线处于空闲状态时才能往总线上发送消息;
*CD+AMP*(Collision Detection + Arbitration on Message Priority)指的是如果多个节点往总线上发送消息时,具备最高优先级(标识符最小)的消息获得总线占有权。
(3)寻址机制
不同于其它类型的总线,CAN总线不设定节点的地址,而是通过消息的标识符(*Identifier*)来区别消息。CAN总线消息是广播式的,也就是说在同一时刻所有节点都检测到同样的电平信号。接受节点通过识别消息中的标识符,与该节点预设的过滤规则对比,如果满足规则就接收这条消息,发送应答,否则就忽略这条消息,关于这部分介绍见下文“条件接收”部分。这种机制虽然会增加消息帧的复杂度(增加标识符),但是节点在此情况下可以无须了解其它节点的状况,而相互间独立工作,在总线上增加节点时仅须关注消息类型,而非系统上其它节点的状况。这种以消息标识符寻址的方式,让在总线上增加节点变得更加灵活。
(4)线与机制
如果多个节点同时往总线上发送消息,总线的使用权是通过消息帧标识符的逐位仲裁机制决定的,在仲裁过程中消息是不会丢失的。这里的不会丢失的意思是指仲裁完成后,获得总线控制权的消息内容没有被仲裁过程篡改,将继续在总线上发送没有传输完的消息。
在CAN总线上,标识符值越小,消息的优先级越高。标识符全零的消息,由于它将总线电平保持在显性的时间最长,因此优先级最高。CAN总线的仲裁机制如下图所示:
Wire-AND Bus Logic:只有节点发送的全是隐性,总线电平才表现为隐性;
Arbitration Logic:所有发送节点在发送数据的同时,也检测总线上的电平状态。如果总线电平状态与它发送的电平状态一致,则继续发送(Next);如果发送为显性,总线电平状态为隐性,则传输出现故障(Fault);如果发送为隐性,总线电平状态为显性,则该节点退出对总线占用权的竞争(Stop);
如图,节点A和节点C同时向总线上发送数据,在仲裁阶段,逐位对比总线上电平与自身发送的电平,在标识符的第四位(ID7),节点C检测到总线上电平与其自身发送电平不一致,它自动退出对总线的竞争,节点A则继续发送数据
如上介绍,CAN总线上的逐位仲裁机制与 I2C 总线的仲裁都应用到线与逻辑的电路基础,不同的是I2C的仲裁只是在主机间进行,而CAN总线没有主从机的概念。另外I2C的消息本身是不分优先级的;CAN消息则是带优先级,有的消息出身高贵(标识符值越小),在仲裁中总会取胜。
为消息划分优先级比较适合于实时控制系统,这样可以确保重要的信息优先发送,相对次要的消息延迟发送,系统设计师应该根据应用的特点为不同消息确定不同的优先级(标识符),在类似 DeviceNet 这些规范组织的定义中,对于同样类型的消息,比如温度传感器,即使它们可能来自不同的供应商,但消息标识符是一致的。
对于车身控制CAN网络(舒适+信息娱乐),其特点是消息标识符种类多,而且消息发送没有固定频率或规律,在此类应用的CAN控制器,例如 Freescale 的 MSCAN(Motorola Scalable Controller Area Network)的设计中,控制器内部包括 FIFO 寄存器,它将具有相同标识符的消息按顺序保存,从而避免接收缓冲器溢出。而对于动力系统控制的CAN网络,总线上的消息特点是速度快,但是存在一定规律,此类应用的CAN控制器,例如 Freescale 的 *FlexCAN*(CAN 2.0B-Compliant),它包括 16 ~ 64 个称为“*mailbox*”的接收缓冲器,运行时根据特定的过滤规则,将不同标识符的消息送到各自对应的 *mailbox* 。
补充:
如果一个节点参与竞争失败,那么报文数据保留在该节点的MCU内存缓冲区里,如果一直到下个周期报文开始还没赢得竞争,那么前一个周期的报文将丢失,新周期报文参与总线竞争。一般不存在帧丢失的问题,因为在设计时要充分考虑竞争机制问题,也就是要考虑总线负载率不能太高。而且CAN总线传输速率是非常快的,CAN_H可以达到1M每秒,而CAN总线的传输距离一般很短。理论上存在一直没赢得仲裁的情况,那么说明总线设计不合理,或者说总线可能出现突发情况(比如说汽车上的车辆出问题了或者撞车了)。
消息的帧化
通信是通过以下 5 种类型的帧进行的。
• 数据帧
• 遥控帧
• 错误帧
• 过载帧
• 帧间隔
另外,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有11 个位的标识符(Identifier: 以下称ID),扩展格式有29 个位的ID。各种帧的用途如下表所示:
• 数据帧
“D”:显性电平“R”:隐性电平
(1) 帧起始(标准、扩展格式相同)
表示帧开始的段。1 个位的显性位。
用于同步, 总线空闲期间的任何隐性到显性的跳变都将引起节点进行硬同步。只有总线在空闲期间节点才能够发送SOF。
(2) 仲裁段
表示数据的优先级的段。
标准格式和扩展格式在此的构成有所不同。
标准格式的ID 有11 个位。从ID28 到ID18 被依次发送。禁止高7 位都为隐性。
(禁止设定:ID=1111111XXXX)
扩展格式的 ID 有29 个位。基本ID 从ID28 到ID18,扩展ID 由ID17 到ID0 表示。基本ID 和
标准格式的ID 相同。禁止高7 位都为隐性。(禁止设定:基本ID=1111111XXXX)
-
RTR(Remote TransmissionRequest):保证数据帧优先级高于遥控帧;
-
SRR(Substitute Remote Request) :保证标准数据帧的优先级高于扩展数据帧;
-
IDE (Identifier Extension):保证标准遥控帧的优先级高于扩展遥控帧。
(3) 控制段
控制段由 6 个位构成,表示数据段的字节数。标准格式和扩展格式的构成有所不同。
*1 保留位(r0、r1)
保留位必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。
*2 数据长度码(DLC)
数据长度码与数据的字节数的对应关系如下表 所示。
数据的字节数必须为 0~8 字节。但接收方对DLC = 9~15 的情况并不视为错误。
(4) 数据段(标准、扩展格式相同)
数据段可包含 0~8 个字节的数据。每个字节从msb(最高位)开始输出,即位序都是大端模式。
CAN 总线上位序都是大端模式(msb),字节序可选,可以是Intel(LSB )或者是Moto(MSB)
DBC 上的标号其实是Intel,但是当有具体信号时,DBC会有msb和lsb的标注。
Can总线上数据的传输序从第0字节发送,到第7字节结束字节序是
第0字节 第1字节 第二字节 第三字节 …….第7字节
字节内部从高位发
第0字节:第7位 第6位 第5位…第0位
顺序和DBC中的Layout 一样
Intel字节序是低字节存放信号低位,高字节存放信号高位;
Motorola字节序是低字节存放信号高位,高字节存放信号低位;
(5) CRC 段(标准/扩展格式相同)
CRC 段是检查帧传输错误的帧。由15 个位的CRC 顺序和1 个位的CRC 界定符(用于分隔的位)构成。
CRC 顺序是根据多项式生成的CRC 值,CRC 的计算范围包括帧起始、仲裁段、控制段、数据
段。接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。
(6) ACK 段
ACK 段用来确认是否正常接收。由ACK 槽(ACK Slot)和ACK 界定符2 个位构成。
*1 发送单元的ACK 段
发送单元在 ACK 段发送2 个位的隐性位。
*2 接收单元的ACK 段
接收到正确消息的单元在ACK 槽(ACK Slot)发送显性位,通知发送单元正常接收结束。这称作“发
送ACK”或者“返回ACK”。(发送 ACK 的是在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送ACK)。所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。)
(7) 帧结束
帧结束是表示该该帧的结束的段。由 7 个位的隐性位构成。
• 遥控帧
接收单元向发送单元请求发送数据所用的帧。遥控帧由 6 个段组成。遥控帧没有数据帧的数据段。
遥控帧的构成如下图所示。
(1) 帧起始(SOF)
表示帧开始的段。
(2) 仲裁段
表示该帧优先级的段。可请求具有相同 ID 的数据帧。
(3) 控制段
表示数据的字节数及保留位的段。
(4) CRC 段
检查帧的传输错误的段。
(5) ACK 段
表示确认正常接收的段。
(6) 帧结束
表示遥控帧结束的段。
• 数据帧和遥控帧的不同
遥控帧的RTR 位为隐性位,同ID的遥控帧优先级低于数据帧,没有数据段。
没有数据段的数据帧和遥控帧可通过RTR 位区别开来。
• 遥控帧没有数据段,数据长度码该如何表示?
遥控帧的数据长度码以所请求数据帧的数据长度码表示。
• 没有数据段的数据帧有何用途?
例如,可用于各单元的定期连接确认/应答、或仲裁段本身带有实质性信息的情况下。
• 错误帧
如上文所示
• 过载帧
过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。
过载帧的构成如下图所示。
(1) 过载标志
6 个位的显性位。
过载标志的构成与主动错误标志的构成相同。
(2) 过载界定符
8 个位的隐性位。
过载界定符的构成与错误界定符的构成相同。
• 帧间隔
帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间隔。帧间隔的构成如下图所示,有两种形式。
(1) 间隔
3 个位的隐性位。
(2) 总线空闲
隐性电平,无长度限制(0 亦可)。
本状态下,可视为总线空闲,要发送的单元可开始访问总线。
(3) 延迟传送(发送暂时停止)
8 个位的隐性位。只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含该段。对于发送出被动错误标志的节点,总线在帧间隔中加入了8个连续隐性位的延迟传送段,这样的3+8=11个连续隐性位。就能让节点A在这个帧间隔期间失去对总线的控制权,从而优先保证其它正常(处于主动错误状态)节点能够使用总线,而不必等着一个已经不可靠的节点A占据总线。
标准格式和扩展格式的优先级
标准格式 ID 与具有相同ID 的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式的RTR 位为显性位,具有优先权,可继续发送。标准格式和扩展格式的仲裁过程如下图所示。
2.LLC层
错误恢复
标准规定,CAN busoff恢复存在两种不同的方式:
1. 自动恢复:MCU仅开启CAN控制器的自动恢复功能,在检测到128个11位连续的隐性位后,节点可由总线关闭状态可以恢复到主动错误状态。此时 发送错误寄存器 和 接收错误寄存器 ” 清零。
之后 ECU 尝试发送常规报文,一旦常规报文被其它节点成功接收,则节点应完成 Bus off 复位的确认,节点正常通信。
2. 快慢恢复:OEM自定义
我们计算下自动恢复的时间:128x11x位时间,假设总线速率1mbit/s,位时间就是0.0000001ms,一次自动恢复时间就是0.00015ms,各位攻城狮明白这个时间对于硬件来说到底有多短,既然恢复,那肯定这个节点已经相当不可信了,那你这麽快就恢复过来是不是有风险呢?所以oem自定义了快慢恢复,快恢复一般是100ms,进行五次,慢恢复是1000ms左右,进行一次。
快恢复最快恢复时间=自动恢复时间
快恢复最慢恢复时间=128x最长数据帧x位时间-----因为要连续检测11位隐形只有在被动错误的帧间隔才可以,考虑最长的情况就是发送最长数据帧的时候。
CAN BUSOFF快慢恢复过程
节点以正常发送模式发送报文的过程中,如果出现了发送错误,发送错误计数会增加,只要发送错误计数没有超过255, CAN控制器便会自动重发报文,如果出现多次发送错误,使发送错误计数累加超过255,则节点跳转为总线关闭状态。MCU能够第一时间知道节点进入了总线关闭状态(例如在错误中断处理逻辑中查询状态寄存器的相应位),这时MCU控制CAN控制器进入“快恢复”过程,即控制CAN控制器停止报文收发,并进行等待,计时达到需要的时间T1(如100ms)后,MCU重新启动恢复CAN控制器参与总线通信,这样便完成了一次“快恢复”过程。
节点每进入一次“快恢复”过程时,MCU会对此进行计数,当节点“快恢复”计数达到设定的值N(如5次),则后续再次进入总线关闭状态时MCU把恢复总线通信的等待时间T2进行延长(如1000ms),这样便实现了“慢恢复”过程。“快恢复”和“慢恢复”过程的主要区别就在于恢复节点参与总线通信的等待时间的不同。
通过MCU对于总线关闭后的恢复行为进行编程控制,实际上是对CAN控制器的错误管理和恢复机制进行了补充,使得总线关闭状态后的恢复过程更加灵活,更能适应实际应用的需要。对于 “快恢复”和“慢恢复”的等待时间,以及“快恢复”计数多少次后进入“慢恢复”过程,不同厂家可根据具体的需求进行编程实现。
过载通知
接收节点通过过载帧向总线上其它节点报告自身接收能力达到极限。
与错误帧类似,过载帧中有过载帧重叠部分,且形成过载重叠标志的原因与形成错误帧中的错误重叠标志的原因是相同的。过载帧的帧结构如上文所述,我们可以这样理解:接收节点Node_A达到接收极限时,就会发出过载帧到总线上,显然,过载标志的6个连续显性位会屏蔽掉总线上其它节点的发送,也就是说这个时候Node_A通过发送过载帧的方式来破坏其它节点的发送,这样在Node_A发送过载帧期间,其它节点就不能成功发送报文,于是就相当于把其它节点的发送推迟了,也就是说Node_A在其发送过载帧的这段时间得以“休息”。
有如下三种情况会引起过载帧:
1. 接收节点自身原因。接收节点由于某种原因需要延迟接收下一个数据帧或者遥控帧。
2. 在帧间隔的间歇段的第一位和第二位检测到一个显性位(正常的间歇段都是隐性位)
帧间隔的间隔段本应是三个连续的隐性位,如果接收节点Node_A在间隔段检测到显性位,那么就意味着此时有报文发向接收节点Node_A,但这个时候是不应该有报文发来的,于是Node_A发送过载帧。
3. CAN节点在错误界定符或过载界定符的第八位(最后一位)听到一个显性位0,节点会发送一个过载帧,且错误计数器不会增加。
接收节点Node_A在错误界定符和过载界定符的最后一位听到显性位,也意味着有报文发向Node_A,但这个时候是不应该有报文发来的,于是Node_A发送过载帧。
消息过滤
在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。发送者以广播的形式把报文发送给所有的接收者。节点在接收报文时,根据标识符(CAN ID)的值决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报文就被丢弃且无需软件的干预。
以STM32的bxCAN的接收过滤机制为例,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(13~0),以便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用一定的CPU开销。STM32总共提供14个过滤器组来处理CAN接收过滤问题,每个过滤器组包含两个32位寄存器CAN_FxR0和CAN_FxR1组成,在设置为屏蔽位模式下,其中一个作为标识符寄存器,另一个作为屏蔽码寄存器。过滤器组中的每个过滤器,编号(叫做过滤器号)从0开始,到某个最大数值(这时最大值并非13,而是取决于14个过滤器组的模式和位宽的设置,当全部配置为位宽为16,且为标识符列表模式时,最大编号为14*4-1=55)。
STM32提供两种过滤模式供用户设置:屏蔽位模式和标识符列表模式。
屏蔽位模式
为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照“必须匹配”或“不用关心”处理。
标识符列表模式
为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2个标识符寄存器。接收报文标识符的每一位都必须跟过滤器标识符相同
详细机制及底层实现请参考其他文章。