本系列是在同公司硬件设计、验证的同事1、在完成了CANFD硬件接口IP开发 2、熟悉ISO-11898系列、ISO16845、CAN2.0协议、CANFD协议等以及大量学习资料 3、深入研究其他家CANFD IP(NXP、BOSCH)4、独立开发了对应底层驱动 5、通过CANoe和周立功CAN分析仪完成前述各协议要求的场景 6、以及对autosar底层接口适配后,基本上对CAN协议有了深入的理解。将过程中整理了一些文档分享出来,希望能给新入门和从业多年的相关工程师提供一点点帮助。
主要包含CAN2.0及CANFD协议,后面对CAN2.0及CANFD的不同点做些说明。

  • 可作为入门CAN协议
  • 另外也有深入硬件的理解,从业多年软件工程师也可以学习一二
  • 亦可作为后续查阅使用,常看常新嘛。

CAN(-FD)协议介绍—— 深入浅出理解CAN协议(一)
CAN_FD和CAN2.0的不同点——深入浅出理解CAN协议(二)
CAN error情况及处理机制——深入浅出理解CAN协议(三)
CAN协议一致性测试——深入浅出理解CAN协议(四)

CAN协议之所以能在汽车、工业自动化、航天航空船舶、医疗等等安全度要求很高的领域广泛应用,除了其可靠性、实时性、抗干扰能力强等,另外一个重要原因就是的对各类异常错误的处理机制。
我们公司的CANFD,在设计之初的目标就是要通过车规ISO-16845认证,所以这一块内容上,花了大量时间和精力测试(1、仿真上是testbench来干扰CAN总线行为 2、FPGA阶段主要是通过vector家的VH6501来干扰CAN总线测试CAN控制器行为),但这里对只谈理论上CAN error和控制器的处理机制,有时间在把测试的情况整理分享下。

0、错误帧格式

错误帧由两个不同的域组成。第一个域是不同节点提供的错误标志重叠部分;第二个域是错误定界符。
在这里插入图片描述

  • 主动错误标志:6个连续的显性位
  • 被动错误标志:6个连续的隐性位
  • 错误定界符:8个连续的隐性位
  • 错误标志之后还有0~6个错误标志重叠部分

0.1 错误标志

错误标志分为主动错误标志和被动错误标志两种:

0.1.1 主动错误标志

主动错误标志由6个连续的显性位组成。处于主动错误状态的节点检测到错误时会发送主动错误标志。主动错误标志会违反位填充规则和位域的固定形式,这会造成其它节点也检测到错误并发送错误标志(错误标志重叠部分形成的原因)。所有节点所发送的显性序列叠加组成错误标志重叠部分。错误标志重叠部分的长度在6-12个显性位之间。

0.1.2 被动错误标志

被动错误标志由6个连续的隐性位组成,被动错误标志可能会被其他节点的显性位改写。(必须为6个连续的隐性位才能代表被动错误标志发送完成),(应当理解为节点发送了6个连续隐性位就行,而不需要关注总线上的状态有没有被其他节点改写。)

0.2 错误定界符

错误定界符由八个连续的隐性位组成。当发送完错误标志后,所有节点开始向总线发送一个隐性位,并检测到总线电平为隐性时,发送余下的七个隐性位。

1、CAN错误定义

CAN 协议定义了五种不同的方法来检测错误。其中两种是位级别错误,另外三种是报文级别的错误类型。

  1. 位监控 2. 位填充 3. 帧检查 4. 应答检查 5. 循环冗余检查
    在这里插入图片描述
    在这里插入图片描述

1.1 错误介绍

1.1.1 位监控 BIT ERR(recessive/dominant bit err)

位错误由向总线上输出数据帧、遥控帧、错误帧、过载帧的单元和输出 ACK 的单元、输出错误的单元来
检测。

向总线发送一个位的节点同时会监控总线,当监控到总线的位数值和发送的位数值不一致时,则鉴定为一个位错误。(SOF到EOF的位使用位错误检测)
例外:

  • 1)在仲裁段输出隐性电平,但检测出显性电平时,将被视为仲裁失败,而不是位错误。
  • 2)在仲裁段作为填充位输出隐性电平时,但检测出显性电平时,将不视为位错误,而是填充错误。
  • 3)发送单元在 ACK 段输出隐性电平,但检测到显性电平时,将被判断为其它单元的 ACK 应答,而非位错误。
  • 4)输出被动错误标志(6 个位隐性位)但检测出显性电平时,将遵从错误标志的结束条件,等待检测出连续相同 6 个位的值(显性或隐性),并不视为位错误。

1.1.2 位填充 (stuff err)

当一个节点已经发送了相同级别的五个连续位时,它将向输出位添加相反电平的第六位。接收方将删除这个额外的位。这样做是为了避免总线上出现过度的直流电成分;但它同时也给予了接收方检测错误的额外机会;
如果总线上出现五个以上相同级别的连续位,会发出信号指示填充错误。
例外:

  • 1)SOF到CRC序列的结束的位使用位填充错误检测。

1.1.3 循环冗余检查 (crc err)

每帧报文都包含一个多位(classic can :crc15、fdcan:crc17/crc21)的循环冗余校验和(CRC)。节点如果在报文中检测到与自己计算所得不同的CRC,将产生CRC错误。

1.1.4 帧格式错误

CAN报文的一些部分具有固定的格式,也就是说,标准明确定义了何种级别和何时必须发生。(那些部分是 CRC 定界符、ACK 定界符、帧结束以及帧间隔,但是帧间隔还有一些另外的特殊错误检查规则)。如果 CAN 控制器在这些固定字段中的一个中检测到无效值,将发出帧格式错误。
例外:

  • 1)接收节点在EOF的最后一位检测到显性位,不鉴定为形式错误。
  • 2)任何节点在错误定界符过载定界符的最后一位检测到显性位,不鉴定为形式错误。
  • 3)对于CANFD帧,ack允许两个bit的容错
  • 4)canfd接收到can帧dlc为 9-15也不检测为格式错误

1.1.5 应答错误(nack err)

正确接收报文的总线上的所有节点(不管这些节点是否对报文内容“感兴趣”)预期将在报文中所谓的应答时隙发送一个显性电平。发送节点在此将发送隐性电平。如果发送节点在应答时隙未检测到显性电平,会产生应答错误。

2、CAN错误状态

CAN节点可以区分常规错误和永久故障。有故障的发送节点将切换到总线关闭状态。总线关闭状态在逻辑上与总线断开,既不能发送也不能接收。can的发送错误状态:

  • 1、active
  • 2、passive
  • 3、bus off
    在这里插入图片描述

2.1 主动错误状态(active )

主动错误状态是可以正常参加总线通信的状态。处于主动错误状态的单元检测出错误时,输出主动错误标志。处于主动错误状态的节点能正常参与总线通信的收发,当检测到错误时将发送主动错误标志,错误标志由6个连续的显性位组成(这种连续的6个显性位与常规的填充位和其它帧固定格式不相同,正因为如此,硬件才容易区别)。

Tips:
处于主动错误状态,说明这个节点目前是比较可靠的,出现错误的原因可能不是它本身的问题,即刚刚检测到的错误可能不仅仅只有它检测到,正因为如此,整个总线才允许它破坏正在发送中的报文。

2.2 被动错误状态(passive)

被动错误状态是易引起错误的状态。处于被动错误状态的单元虽能参加总线通信,但为不妨碍其它单元通信,接收时不能积极地发送错误通知。 处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。 处于被动错误状态的单元检测出错误时,输出被动错误标志。
如果是发送节点发出被动错误帧,刚刚被发送的报文被破坏。错误帧发送完成后,接着的是帧间隔(3个隐性位)和“传输延时段”(8个隐性位),这时总线上的其他节点就可以判断总线处于空闲状态并参与总线竞争。这种机制可以让其他处于主动错误状态的节点优先使用总线。
如果是接收节点发出被动错误帧,则不会对总线产生任何影响

Tips:
处于被动错误状态,说明这个节点目前是不可靠的,出现错误的原因可能是它本身的问题,即刚刚检测到的错误可能只有它自己检测到,正因为如此,整个总线不会信任它的报告,从而只允许它发送6个连续的隐性位,这样才不会拖累其他节点。

2.3 总线关闭状态(bus off)

总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。这些状态依靠发送错误计数和接收错误计数来管理,根据计数值决定进入何种状态。

Tips:
由于存在实现方式的不同,CAN总线关闭状态存在只允许用户请求恢复和检测到128个11位连续的隐性位时自恢复两种不同的恢复形式。
如果总线上只有一个节点,该节点发送数据帧后得不到应答,TEC最大只能计数到128,即这种情况下节点只会进入被动错误状态而不会进入总线关闭状态。

2.4 CAN错误计数

在这里插入图片描述

3 CAN错误的发送

总线通信错误以向总线发送错误帧作为标志。
节点产生位错误、填充错误、格式错误或者NACK后,将会在当前发送位的下一位发送错误帧
产生CRC错误后,紧随ACK定界符后的位发送错误帧
在这里插入图片描述
如果节点开启重发基址,错误帧发送完成后,将在总线空闲时自动重发出之前出错的数据帧。

3.1 位错误发送

3.1.1 总线上所有节点处于主动错误状态

  • ①当一个发送节点监控到总线上的位数值与发送的位数值不一致时,检测为位错误,并发送主动错误标志(6个连续的显性位);
  • ②接收节点接收到发送节点发送的6个连续的显性位时,会检测为位填充错误,也会发送主动错误标志;(6个连续的显性位);
  • ③发送节点发送完主动错误标志后,开始监控总线是否为隐性位,当总线为隐性位时,开始发送错误定界符(8个连续的隐性位);
  • ④当接收节点发送完主动错误标志后,开始向总线发送错误定界符;
  • ⑤等待错误帧发送完成,总线空闲后,发送节点重新发送出错的报文;

Note:

  • 由于发送节点发送6个连续的显性位会破坏位填充规则,触发接收节点发送主动错误标志,发送节点和接收节点的结合是形成错误标志叠加部分的原因。
  • 错误标志重叠部分为6+6个显性位
    在这里插入图片描述
    错误重叠部分为6+4个显性位
    在这里插入图片描述

3.1.2 发送节点处于被动错误状态,接收节点处于主动错误状态

  • ①当发送节点监控到总线上的位数值与发送的位数值不一致时,检测为位错误,并发送被动错误标志(6个连续的隐性位);
  • ②接收节点接收到发送节点发送的6个连续的隐性位时,会检测为位填充错误,并会发送主动错误标志;
  • ③发送节点发送完被动错误标志后,开始监控总线是否为隐性位,当总线为隐性位时,开始发送错误定界符(8个连续的隐性位);
  • ④接收节点发送完主动错误标志后,开始监控总线是否为隐性位,当总线为隐性位时,开始发送错误定界符(8个连续的隐性位);
    在这里插入图片描述

3.2 格式错误发送

3.2.1 假设总线上所有节点处于主动错误状态;

当接收节点和发送节点检测到总线上的格式错误时,下一个bit向总线上发送主动错误标志;

  • ①当发送节点监控到总线上固定位(CRC 定界符、ACK 定界符、帧结束以及帧间隔)和协议不一致时,检测为格式错误,并发送主动错误标志(6个连续的显性位);
  • ②当发送节点监控到总线上固定位(CRC 定界符、ACK 定界符、帧结束以及帧间隔)和协议不一致时,检测为格式错误,也会发送主动错误标志;(6个连续的显性位);
  • ③发送节点发送完被动错误标志后,开始监控总线是否为隐性位,当总线为隐性位时,开始发送错误定界符(8个连续的隐性位);
  • ④接收节点发送完主动错误标志后,开始监控总线是否为隐性位,当总线为隐性位时,开始发送错误定界符(8个连续的隐性位);
    在这里插入图片描述

3.2.2 发送节点处于被动错误状态,接收节点处于主动错误状态

  • ①当发送节点监控到总线上固定位(CRC 定界符、ACK 定界符、帧结束以及帧间隔)和协议不一致时,检测为格式错误,并发送被动错误标志(6个连续的隐性位);
  • ②当发送节点监控到总线上固定位(CRC 定界符、ACK 定界符、帧结束以及帧间隔)和协议不一致时,检测为格式错误,并发送主动错误标志(6个连续的显性位);
  • ③发送节点发送完被动错误标志后,开始监控总线是否为隐性位,当总线为隐性位时,开始发送错误定界符(8个连续的隐性位);
  • ④接收节点发送完主动错误标志后,开始监控总线是否为隐性位,当总线为隐性位时,开始发送错误定界符(8个连续的隐性位);
    在这里插入图片描述

3.3 CRC错误发送

3.3.1 所有节点都处于主动错误状态;

  • ①当接收节点检测到CRC错误后,在ACK定界符之后,向总线发送主动错误标志;
  • 发送节点检测到格式错误(EOF的固定格式为7个连续的隐性位),同时向总线发送主动错误标志;

Note:

  • 错误标志重叠部分为6+1个显性位
    在这里插入图片描述
    这里列举了一些错误的场景,比如:nack时,发送节点会立即发出6bit的显性位,如果接收节点发送ack被异常拉低,将会出现bit err,等;另外,所以接收节点处于passive状态时,也没做说明(实际情况下,不可能所有接收节点都进入passive)

4 CAN错误状态恢复

由于实现的方式不同,CAN busoff如下存在两种不同的形态:

  • 1、处于总线关闭状态的节点对总线没有任何影响,不允许发送任何帧,ACK,错误帧,过载帧。是否允许接收取决于实现方式 (能进不能出)。在检测到128个11位连续的隐性位后,节点可由总线关闭状态可以恢复到主动错误状态。
  • 2、处于总线关闭状态的节点不允许任何发送和接收,只有用户请求才可以恢复。
    目前市面常用的canfd ip:NXP的flexcan、博世的canfd(st采用)、瑞萨的can,进入bus-off状态后,均不能收发,但是可以1.检测到128个11位连续的隐性位,或者 2.重新初始化can来恢复。

4.1 CAN BUSOFF恢复过程

节点进入总线关闭状态后,普遍采用的是 快慢恢复 的形式:

4.1.1 快恢复

  • 定义:
    快恢复是节点在进入Bus Off状态后,通过缩短等待时间并尝试快速恢复通信的一种策略。快恢复策略旨在尽快让节点恢复正常工作状态,减少总线通信的中断时间。

  • 实现方式:

    • 当节点进入Bus Off状态后,如果MCU(微控制单元)开启了自动恢复功能,CAN控制器会在检测到特定条件(如128次11个连续的隐性位)后尝试恢复通信。
    • 在实际应用中,通常会通过MCU对CAN控制器的恢复过程进行编程处理,控制快恢复的等待时间(如50ms)。在这个等待时间结束后,MCU会重新启动CAN控制器,尝试恢复总线通信。
  • 特点:

    • 恢复时间短,能够迅速响应通信中断。
    • 适用于临时性的通信故障,可以快速恢复总线的正常通信。

4.1.2 慢恢复

  • 定义:
    慢恢复是在快恢复多次尝试失败后,通过延长等待时间并尝试恢复通信的一种策略。慢恢复策略旨在更加谨慎地处理通信故障,防止节点在不稳定状态下快速恢复并再次引起通信问题。

  • 实现方式:
    当节点多次进入快恢复过程但未能成功恢复通信时(如快恢复次数达到设定的阈值,如5次),MCU会将恢复时间延长至更长的时间(如200ms),并执行慢恢复过程。
    在慢恢复等待时间结束后,MCU会重新启动CAN控制器,尝试恢复总线通信。

4.1.3 恢复过程

  1. 快恢复模式即ECU的CAN节点进入总线关闭状态后,等待时间tBusOffQuick,然后尝试向总线发送CAN报文,如果发送成功,则恢复到主动错误状态。如果发送失败,则继续等待时间tBusOffQuick后,再次尝试发送报文。
  2. 如果尝试了n次后仍然发送失败,则进入慢恢复模式。在慢恢复模式下,ECU等待时间tBusOffSlow后,尝试向总线发送CAN报文,发送成功,则恢复到主动错误状态。如果发送失败,则继续等待时间tBusOffSlow后,再次尝试向总线发送CAN报文。
  3. 进入慢恢复模式后,没有尝试次数的限值。

一般主机厂释放的标准中一般会有三个参数:1)快恢复时间;2)慢恢复时间;3)快恢复转慢恢复次数。例如:快恢复时间为100ms,慢恢复时间为1000ms,快恢复转慢恢复次数为5次,即5次快恢复不成功则进入慢恢复。

在AUTOSAR中配置快慢恢复机制较为简单,可在CanSM模块中配置三个参数:

  • 1)CanSMBorTimeL1:对应快恢复时间;
  • 2)CanSMBorTimeL2:对应慢恢复时间;
  • 3)CanSMBorCounterL1ToL2:对应快恢复转慢恢复次数。
Logo

获取更多汽车电子技术干货

更多推荐