CAN总线基础学习

     以下内容主要基于维基百科 C A N CAN CAN总线协议介绍。
     一辆汽车由许多的零件组成,这些零件又被划分为许多单元,每一个单元都会有一个核心(或者简单的就是一个控制芯片)负责控制该部分的运行。但是这些单元并不是孤立存在的,它们需要相互的进行信息沟通才能保证一辆汽车的合理运行。
     在 C A N CAN CAN总线提出以前如果一个单元要和另外的5个单元通信,那么这个单元要和另外的5个单元中的每一个单元都必须要有线缆连接,并且线缆不能公用。如果是使用两根线缆进行通信的话,那这里一个单元就会有10根线缆连接到另外的5个单元。如果下次再增加一个单元,这个单元就必须通过12条线缆和另外的6个单元进行连接来通信。这样的方式不太灵活,需要大量的电缆,当希望添加一个新的单元的时候会非常麻烦,如图1所示。这里为了简便我只画了一个单元和其它单元的连接。一种改进是每一个单元都和一个 H O S T HOST HOST进行连接,由 H O S T HOST HOST来控制单元之间的通信,但是这会造成 H O S T HOST HOST过于复杂。如果 H O S T HOST HOST失效的话,所有单元之间的通信都完了。

 
图1.
 
图2.

      C A N ( C o n t r o l l e r A r e a N e t w o r k ) CAN(Controller\quad Area\quad Network) CAN(ControllerAreaNetwork)总线是基于以上背景提出的,其实当年德国的 B o s c h Bosch Bosch公司设计 C A N CAN CAN总线的主要驱动力还是向已经存在的产品中添加新的功能,也即是在上面提到的例如在图1和图2中添加新的节点,对于 C A N CAN CAN总线的提出减少了线束的连接只是其副产品。 C A N CAN CAN总线是一种抗干扰能力强的车辆总线标准,但是目前 C A N CAN CAN总线也已经被运用到了汽车工业领域之外的其它很多领域,在 C A N CAN CAN总线下微控制器和设备可以在没有主控设备的情况下相互通信。它是一种串行异步总线协议。 C A N CAN CAN总线是一种基于消息的协议(一个节点将它的消息广播到总线,总线上的每一个节点都可以收到该消息,每一个节点根据自身的情况决定是否响应该消息),而不是基于地址的(根据某个节点的地址点对点的向该节点发送信息)。图1是一个简单的示意图。图1来至于这里

 
图3.

     我们在开始具体讲解 C A N CAN CAN总线的内容之前先大概的讲解一下 C A N CAN CAN总线的发展历史,看完之后你就会觉得 C A N CAN CAN总线有多么的强大,应用有多么的广泛,并且还在不断焕发新的生机。在讲解 C A N CAN CAN总线的发展历史的时候除了参考了维基百科的内容之外还参考了这里。这里将会以列表的形式给出 C A N CAN CAN总线的发展历史,因为这样便于我们理解。

  1. C A N CAN CAN总线的研发开始于1983年,在1986年2月的汽车工程师协会 ( S o c i e t y o f A u t o m o t i v e E n g i n e e r s ) (Society\quad of\quad Automotive\quad Engineers) (SocietyofAutomotiveEngineers)大会上德国的 B o s c h Bosch Bosch公司正式发布了 C A N CAN CAN总线协议。
  2. 在1987年 I n t e l Intel Intel公司发布了第一个 C A N CAN CAN总线协议芯片82526,不久之后 P h i l i p s Philips Philips公司也发布了一款 C A N CAN CAN总线协议芯片 82 C 200 82C200 82C200
  3. 在1991年,德国的 B o s c h Bosch Bosch公司正式发布了 C A N CAN CAN总线协议的规范化的协议文档的2.0版本,它分为 A A A B B B两部分, A A A部分的 M e s s a g e I d e n t i f i e r Message\quad Identifier MessageIdentifier有11位, B B B部分的 M e s s a g e I d e n t i f i e r Message\quad Identifier MessageIdentifier有29位。2.0版本的文档比较好找,一般是免费的,它只定义了数据链路层的内容,没有定义物理层的内容。同年奔驰公司的 W 140 W140 W140成为第一个使用基于 C A N CAN CAN总线汽车型号。
  4. 在1993年,国际化标准组织发布了 C A N CAN CAN总线协议的国际化标准的规范化的协议文档 11898 11898 11898,该文档包含了德国的 B o s c h Bosch Bosch公司发布的 C A N CAN CAN总线协议的规范化的协议文档的2.0版本的 A A A部分,同时标准化了一个比特速率达到1 M M M的物理层协议。同时期,一种低功耗的具有容错机制的 C A N CAN CAN总线协议被标准化到了 I S O 11519 − 2 ISO\quad 11519-2 ISO115192,但是由于种种原因该标准没有被大众广泛采用。
  5. 在1995年,国际化标准组织对协议文档 11898 11898 11898进行了修订,将 B o s c h Bosch Bosch公司发布的 C A N CAN CAN总线协议的规范化的协议文档的2.0版本的 B B B部分加入了其中。
  6. 在2003年,国际化标准组织将1993年的协议文档 11898 11898 11898分成了两部分, 11898 − 1 11898-1 118981 11898 − 2 11898-2 118982 11898 − 1 11898-1 118981覆盖了数据链路层 11898 − 2 11898-2 118982覆盖了高速物理层(最高速率 1 M b i t / s 1M bit/s 1Mbit/s)。
  7. 在2004年,国际化标准组织发布了协议文档 11898 11898 11898的第四部分 11898 − 4 11898-4 118984,该协议文档定义了基于时间触发的 C A N CAN CAN总线协议 T T C A N TTCAN TTCAN发布,该标准几乎没有被汽车工业领域的机构所采用。该部分所定义的是不同于数据链路层和物理层的高层协议
  8. 在2006年,国际化标准组织发布了协议文档 11898 11898 11898的第三部分 11898 − 3 11898-3 118983 11898 − 3 11898-3 118983取代了1994年发布的 I S O 11519 − 2 ISO\quad 11519-2 ISO115192,也就是定义了具有容错机制的低速物理层(最高速率 125 k b i t / s 125k bit/s 125kbit/s)。
  9. 在2007年,国际化标准组织发布了协议文档 11898 11898 11898的第五部分 11898 − 5 11898-5 118985 11898 − 5 11898-5 118985 I S O 11898 − 2 ISO\quad 11898-2 ISO118982扩展,只不过加入了低功耗模式。和 11898 − 2 11898-2 118982一样,它覆盖了高速物理层(最高速率 1 M b i t / s 1M bit/s 1Mbit/s)。
  10. 在2011年,德国的 B o s c h Bosch Bosch公司开始了 C A N F D CAN\quad FD CANFD总线协议的开发, C A N F D CAN\quad FD CANFD总线协议是 C A N CAN CAN总线协议的扩展, C A N F D CAN\quad FD CANFD总线协议和 C A N CAN CAN总线协议的最大区别是 C A N F D CAN\quad FD CANFD总线协议可以根据总线的实际情况随时改变通信的速率和帧中实际的传输的数字节的长度。
  11. 在2012年,德国的 B o s c h Bosch Bosch公司发布了 C A N F D CAN\quad FD CANFD总线协议的规范化的协议文档的1.0版本。
  12. 在2013年,国际化标准组织发布了协议文档 11898 11898 11898的第六部分 11898 − 6 11898-6 118986 11898 − 6 11898-6 118986 11898 − 5 11898-5 118985 I S O 11898 − 2 ISO\quad 11898-2 ISO118982扩展,只不过加入了一种可选择的唤醒机制。和 11898 − 2 11898-2 118982 11898 − 5 11898-5 118985一样,它覆盖了高速物理层(最高速率 1 M b i t / s 1M bit/s 1Mbit/s)。
  13. 在2015年,国际化标准组织修改了协议文档 11898 11898 11898的第一部分 11898 − 1 11898-1 118981,在原来的基础上增加了 C A N F D CAN\quad FD CANFD总线协议。物理层
  14. 在2016年,国际化标准组织修改了协议文档 11898 11898 11898的第二部分 11898 − 2 11898-2 118982,取代了2003年的版本,同时也将 11898 − 5 11898-5 118985 11898 − 6 11898-6 118986的内容整合了进去。物理层
  15. 在2018年,非盈利性的国际化组织 C A N i n A u t o m a t i o n CAN\quad in\quad Automation CANinAutomation开始了基于 C A N CAN CAN总线协议的第三代数据链路层协议 C A N X L CAN\quad XL CANXL的开发,其单个数据帧携带的实际的通信字节数可以达到2048。还有其它新的特性。

     通过以上 C A N CAN CAN总线协议发展历史的总结,我们可以发现现在最新的 11898 11898 11898文档只需要看 11898 − 1 − 2015 11898-1-2015 1189812015 11898 − 2 − 2016 11898-2-2016 1189822016 11898 − 3 − 2006 11898-3-2006 1189832006这三部分的内容就可以了,并且 11898 − 1 11898-1 118981描述的是数据链路层的内容, 11898 − 2 11898-2 118982 11898 − 3 11898-3 118983描述的是物理层的内容。如果需要了解时间触发 ( T i m e − T r i g g e r e d C o m m u n i c a t i o n ) (Time-Triggered\quad Communication) (TimeTriggeredCommunication) C A N CAN CAN总线协议,看 11898 − 4 − 2004 11898-4-2004 1189842004就可以了。 这里有一份11898的全套文档资料以及其它的参考资料,需要的可以下载。这里没有介绍除了数据链路层和物理层的内其它的高层协议的内容,当然这部分的内容也是很多的,可以自己找资料。

/--------------------------------------------------------------------分割线-----------------------------------------------------------------------------/

     下面我将以德国的 B o s c h Bosch Bosch公司发布的 C A N CAN CAN总线协议的规范化的协议文档的2.0版本以及 C A N F D CAN\quad FD CANFD总线协议的规范化的协议文档的1.0版本为基础介绍一下 C A N CAN CAN总线协议以及 C A N F D CAN\quad FD CANFD总线协议的数据链路层的内容。 B O S C H BOSCH BOSCH公司1991年提出的2.0版本分为 A A A B B B两部分,因此帧格式也在这两个版本上也会有所不同,主要区别是 B B B版本中除了讲到了 A A A版本中的基本帧格式还提出了扩展的帧格式, B B B版本的标准的帧格式和 A A A版本的帧格式基本差不多, B B B版本的扩展帧格式和 A A A版本的帧格式差别较大。因此在讲解 C A N CAN CAN总线协议的规范化的协议文档的2.0版本的时候会分两部分进行讲解。
/-------------------------------------- C A N CAN CAN总线协议的规范化的协议文档的2.0版本的A部分------------------------------------------/
     这里先来讲一下 C A N CAN CAN总线协议的一些特性以及一些基础概念的介绍。

  • 消息 ( M e s s a g e s ) : (Messages): (Messages)总线上的信息以固定的格式发送,但是信息的长度可以不同,信息的长度只要不超过信息长度的最大允许值就可以。当总线空闲的时候任何节点都可以开始发送消息。
  • 信息路由 ( I n f o r m a t i o n R o u t i n g ) : (Information\quad Routing): (InformationRouting) C A N CAN CAN总线系统中,总线上的节点没有用到总线系统配置的任何信息,这样有几个好处:
    • 系统灵活性 ( S y s t e m F l e x i b i l i t y ) : (System\quad Flexibility): (SystemFlexibility)向总线中添加新的节点不需要对原来总线上的任何节点的软件和硬件做任何的改变。
    • 消息路由 ( M e s s a g e R o u t i n g ) : (Message\quad Routing): (MessageRouting)总线上消息的内容由帧的 I D E N T I F I E R IDENTIFIER IDENTIFIER域来决定,这里的 I D E N T I F I E R IDENTIFIER IDENTIFIER不是地址的意思,只是表示消息所携带的内容为何。总线上的所有节点都可以通过自身的 M E S S A G E F I L T E R I N G MESSAGE\quad FILTERING MESSAGEFILTERING功能决定是否相应该消息。
    • 多播 ( M u l t i c a s t ) : (Multicast): (Multicast)总线上的任何节点可以接受并同时相应同样的消息。
    • 数据一致性 ( D a t a C o n s i s t e n c y ) : (Data\quad Consistency): (DataConsistency) C A N CAN CAN总线保证一个消息同时被所有节点接收或者同时不被任何节点接收,这是通过多播和错误处理的功能实现的。
  • 比特速率 ( B i t R a t e ) : (Bit\quad Rate): (BitRate)在不同的总线网络中,比特速率可以不同,但是在某个特定的总线网络中比特速率必须一致。
  • 优先级 ( P r i o r i t i e s ) : (Priorities): (Priorities)当在一个总线网络中同一时刻有多个节点发送消息帧时,帧的 I D E N T I F I E R IDENTIFIER IDENTIFIER域用来决定那个节点最终可以获得消息的发送权,也就是决定消息的优先级。
  • 远程数据请求 ( R e m o t e D a t a R e q u e s t ) : (Remote\quad Data\quad Request): (RemoteDataRequest)总线网络中的某个节点可以通过发送远程帧 ( R E M O T E F R A M E ) (REMOTE\quad FRAME) (REMOTEFRAME)来请求网络中的其它节点发送数据帧 ( D A T A F R A M E ) (DATA\quad FRAME) (DATAFRAME)
  • 多主机 ( M u l t i m a s t e r ) : (Multimaster): (Multimaster)总线空闲的时候总线上的任何节点都可以发送消息,帧的 I D E N T I F I E R IDENTIFIER IDENTIFIER域优先级最高的节点获得消息发送的权利。
  • 仲裁 ( A b i t r a t i o n ) : (Abitration): (Abitration)利用帧的 I D E N T I F I E R IDENTIFIER IDENTIFIER域来实现,用来决定一个总线网络中同一时刻有多个节点发送消息帧时那个节点或者消息发送的权利。
  • 安全性 ( S a f e t y ) : (Safety): (Safety)为了实现数据传输的最大限度的安全性, C A N CAN CAN总线网络中的每个节点都实现了错误监测,节点自查等功能。
    • 错误检测 ( E r r o r D e t e c t i o n ) : (Error\quad Detection): (ErrorDetection)为了检测错误,采取了下面的措施:

      • 发送消息的节点会比较监测自己发送的比特电平和总线上监测到的比特电平。
      • C R C CRC CRC循环冗余校验
      • 比特填充 ( B i t S t u f f i n g ) (Bit\quad Stuffing) (BitStuffing)
      • 消息帧的格式检查
  • 错误信号和恢复时间 ( E r r o r S i g n a l l i n g a n d R e c o v e r y T i m e ) : (Error\quad Signalling\quad and\quad Recovery\quad Time): (ErrorSignallingandRecoveryTime)崩溃的消息可以被任何检测到的节点标记。这种消息会被终止并被自动的重新发送。在没有检测到新的错误的情况下,从检测到错误到重新开始发送最多29个比特位时间。
  • 错误界定 ( E r r o r C o n f i n e m e n t ) : (Error\quad Confinement): (ErrorConfinement) C A N CAN CAN总线网络中的节点可以区分出短暂的干扰和永久的错误。
  • 连接 ( C o n n e c t i o n s ) : (Connections): (Connections) C A N CAN CAN总线网络上连接的节点数理论上是没有限制的。但是实际上还是受到总线上的延迟时间以及电路负载的限制。
  • 总线值 ( B u s V a l u e s ) : (Bus\quad Values): (BusValues)总线上的信号值可以是两个互补的逻辑值(显性, d o m i n a n t dominant dominant或者隐性, r e c e s s i v e recessive recessive,显性表示二进制位的0,隐性表示二进制位的1)中的一个.当总线上同时发送显性和隐性逻辑值得时候,总线的值呈现的是显性
  • 睡眠模式和唤醒 ( S l e e p M o d e a n d W a k e U p ) : (Sleep\quad Mode\quad and\quad Wake\quad Up): (SleepModeandWakeUp)为了降低系统的功耗,一个节点可以进入睡眠模式。一个节点进入睡眠模式之后其内部的活动会停止并相当于从整个系统中剥离。处于睡眠模式的节点可以被总线活动或系统的内部条件所唤醒。

     下面来介绍一下 C A N CAN CAN总线中的帧的结构, C A N CAN CAN总线中一般有四种类型的帧:

  • D A T A F R A M E DATA\quad FRAME DATAFRAME:携带发送节点发给接收节点的数据的帧。
  • R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME:被网络中的一个节点 X X X用来向网络中的另一个节点 Y Y Y请求其发送数据帧,这时节点 Y Y Y发送的 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME中的 I D E N T I F I E R IDENTIFIER IDENTIFIER应该和节点 X X X的一样,这里的 I D E N T I F I E R IDENTIFIER IDENTIFIER不是地址的概念。
  • E R R O R F R A M E ERROR\quad FRAME ERRORFRAME:当总线中的任意一个节点检测到总线错误时候发送的帧。
  • O V E R L O A D F R A M E OVERLOAD\quad FRAME OVERLOADFRAME:该帧用来在 D A T A F R A M E DATA\quad FRAME DATAFRAME R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME之间提供额外的延迟。
  • I N T E R F R A M E S P A C I N G INTERFRAME\quad SPACING INTERFRAMESPACING:用来区隔部分两个连续的帧。
 
图4.
 
图5.
 
图6.

      D A T A F R A M E DATA\quad FRAME DATAFRAME R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME通过帧间间隔来和前一个帧进行区隔。一个 D A T A F R A M E DATA\quad FRAME DATAFRAME由七个不同的比特域所组成,如图6所示,这7个部分的说明如下,这7个部分的细节全图如图4所示:

  • S t a r t o f f r a m e Start\quad of\quad frame Startofframe:标志着 D A T A F R A M E DATA\quad FRAME DATAFRAME R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME的开始,是一个比特值为0的显性 ( d o m i n a n t ) (dominant) (dominant)比特位。网络中的每一个节点只允许在网络空闲状态下才允许开始传输。当一个节点通过发送 S t a r t o f f r a m e Start\quad of\quad frame Startofframe开始帧传输后,总线中的所有其它节点必须同步到 S t a r t o f f r a m e Start\quad of\quad frame Startofframe的第一个边缘。这里有关同步的内容后面会讲到。
  • A r b i t a t i o n f i e l d Arbitation\quad field Arbitationfield:由 I D E N T I F I E R IDENTIFIER IDENTIFIER R T R RTR RTR比特位组成。 I D E N T I F I E R IDENTIFIER IDENTIFIER由11个比特位组成,在发送的时候先发送高位比特然后发送地位比特, I D − 10 ( 最 高 位 ) ID-10(最高位) ID10() I D − 4 ID-4 ID4不能全部为比特值为1的隐性 ( r e c e s s i v e ) (recessive) (recessive)比特位。 R T R RTR RTR比特位的全称是 R e m o t e T r a n s m i s s i o n R e q u e s t Remote\quad Transmission\quad Request RemoteTransmissionRequest比特位,在数据帧中 R T R RTR RTR比特位的值为0显性 ( d o m i n a n t ) (dominant) (dominant)比特位,在 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME R T R RTR RTR比特位的值为1隐性 ( r e c e s s i v e ) (recessive) (recessive)比特位。虽然要求网络中的每一个节点只允许在网络空闲状态下才允许开始传输,但是有可能多个节点同时检测到总线空闲并进行传输,这时就发生了碰撞,那这时那个节点的帧会被发送出去。这就是 A r b i t a t i o n f i e l d Arbitation\quad field Arbitationfield的作用了,就是进行仲裁那个节点可以获得总线的控制权。原理比较简单,就是第一个先发送比特值1的节点将会失去总线的控制权。具体过程如图9所示。这时节点 N o d e 1 Node \quad 1 Node1节点 N o d e 2 Node \quad 2 Node2同时发送数据,在发送比特位 I D 4 ID\quad 4 ID4时,节点 N o d e 2 Node \quad 2 Node2发送了比特位值0,节点 N o d e 1 Node \quad 1 Node1发送了比特位值1,因此节点 N o d e 2 Node \quad 2 Node2获得了总线的控制权,继续发送,节点 N o d e 1 Node \quad 1 Node1失去了总线的控制权,停止发送。
  • C O N T R O L f i e l d CONTROL\quad field CONTROLfield:其由6个比特位组成,其中4个比特位用来编码数据长度,剩余的两个比特位保留位以后扩展使用。也就是保留位 R 0 R0 R0 R 1 R1 R1默认发送比特位值0, D L C 3 DLC3 DLC3 D L C 0 DLC0 DLC0一共四个比特位用来编码 D A T A f i e l d DATA\quad field DATAfield中字节的个数( 0 − > 8 0->8 0>8
  • D A T A f i e l d DATA\quad field DATAfield:实际的数据 ( 0 − > 8 个 8 b i t 的 字 节 数 据 ) (0->8个8bit的字节数据) (0>88bit),每个字节数据的 M S B MSB MSB比特位优先发送。
  • C R C f i e l d CRC\quad field CRCfield:它由 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE C R C D E L I M E T E R CRC\quad DELIMETER CRCDELIMETER组成。这里的 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE没什么特别的就是在 S t a r t o f f r a m e Start\quad of\quad frame Startofframe A r b i t a t i o n f i e l d Arbitation \quad field Arbitationfield C O N T R O L f i e l d CONTROL\quad field CONTROLfield D A T A f i e l d DATA\quad field DATAfield这几个比特域的上计算得到的 C R C CRC CRC值,关于 C R C CRC CRC值理论方面的介绍可以看这篇文章,接收方接收到帧之后可以利用 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE判断接收的数据是否在传输过程中发生了错误。 C R C D E L I M E T E R CRC\quad DELIMETER CRCDELIMETER默认位比特位值1隐性 ( r e c e s s i v e ) (recessive) (recessive)比特位。
  • A C K f i e l d ACK\quad field ACKfield:它由 A C K s l o t ACK\quad slot ACKslot A C K D e l i m e t e r ACK\quad Delimeter ACKDelimeter组成, A C K s l o t ACK\quad slot ACKslot A C K D e l i m e t e r ACK\quad Delimeter ACKDelimeter都是一个比特位。在发送方 A C K s l o t ACK\quad slot ACKslot A C K D e l i m e t e r ACK\quad Delimeter ACKDelimeter其值都为比特位1隐性 ( r e c e s s i v e ) (recessive) (recessive)比特位。如果接收方在检查了 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE并确认无误之后,接收方会针对发送方的 A C K s l o t ACK\quad slot ACKslot发送一个比特值为0的显性 ( d o m i n a n t ) (dominant) (dominant)比特位。
  • E n d o f f r a m e End\quad of\quad frame Endofframe:为7个比特值为1的比特位,它用来区隔 D A T A F R A M E DATA\quad FRAME DATAFRAME R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME
 
图7.

     一个 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME由6个不同的比特域所组成,如图7所示。当一个作为接收者的节点想来获取其它节点特定的数据时可以通过发送一个 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME来让其它节点开启数据发送。 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME D A T A F R A M E DATA\quad FRAME DATAFRAME的主要区别是没有 D A T A f i e l d DATA\quad field DATAfield C O N T R O L f i e l d CONTROL\quad field CONTROLfield中的 D L C 3 DLC3 DLC3 D L C 0 DLC0 DLC0 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME中表示要求另一个节点发送数据帧时发送的字节的个数。

 
图8.

      E R R O R F R A M E ERROR\quad FRAME ERRORFRAME S u p e r p o s i t i o n o f E r r o r F l a g s Superposition\quad of\quad Error \quad Flags SuperpositionofErrorFlags E r r o r D e l i m i t e r Error \quad Delimiter ErrorDelimiter两部分组成,如图8所示。有两种形式的 E r r o r F l a g Error \quad Flag ErrorFlag

  • A c t i v e E r r o r F l a g s Active\quad Error \quad Flags ActiveErrorFlags:六个连续的比特值为0的比特位组成。
  • P a s s i v e E r r o r F l a g s Passive\quad Error \quad Flags PassiveErrorFlags:六个连续的比特值为1的比特位组成,但是其比特值为1的比特位也有可能被其它节点发送的比特值为0的比特位覆盖。

     当一个处于 e r r o r a c t i v e error\quad active erroractive状态的节点探测到总线有错误时,就会发送一个带有 A c t i v e E r r o r F l a g Active\quad Error \quad Flag ActiveErrorFlag E R R O R F R A M E ERROR\quad FRAME ERRORFRAME。因为 E r r o r F l a g Error \quad Flag ErrorFlag要么是连续的六个隐性比特位,要么是连续的六个显性比特位, E r r o r F l a g Error \quad Flag ErrorFlag得这种形式违背了比特填充 ( B i t S t u f f i n g ) (Bit\quad Stuffing) (BitStuffing)的法则或者破坏了 A C K f i e l d ACK\quad field ACKfield比特域和 E n d o f f r a m e End\quad of\quad frame Endofframe比特域的固定格式。正因为如此总线上的所有其它节点也会开始发送 E R R O R F R A M E ERROR\quad FRAME ERRORFRAME,这时总线上实际可以监测到的显性比特位的序列由总线上各个节点发送的 E R R O R F R A M E ERROR\quad FRAME ERRORFRAME叠加造成,这就是为什么 E R R O R F R A M E ERROR\quad FRAME ERRORFRAME的一部分叫做 S u p e r p o s i t i o n o f E r r o r F l a g Superposition\quad of\quad Error \quad Flag SuperpositionofErrorFlag的原因。可以探测到的 A c t i v e E r r o r F l a g Active\quad Error \quad Flag ActiveErrorFlag长度从最小值6到最大值12。
     当一个处于 e r r o r p a s s i v e error\quad passive errorpassive状态的节点探测到总线有错误时,就会发送一个带有 P a s s i v e E r r o r F l a g Passive\quad Error \quad Flag PassiveErrorFlag E R R O R F R A M E ERROR\quad FRAME ERRORFRAME。从发送 P a s s i v e E r r o r F l a g Passive\quad Error \quad Flag PassiveErrorFlag开始,发送 P a s s i v e E r r o r F l a g Passive\quad Error \quad Flag PassiveErrorFlag的节点会等待6个极性相同的比特位值,该节点在成功探测到6个极性相同的比特位值之后, P a s s i v e E r r o r F l a g Passive\quad Error \quad Flag PassiveErrorFlag才算发送完成。
      E r r o r D e l i m i t e r Error \quad Delimiter ErrorDelimiter由八个连续的比特值为1隐性 ( r e c e s s i v e ) (recessive) (recessive)比特位组成。在发送完 E r r o r F l a g Error \quad Flag ErrorFlag之后,当一个节点在发送完 E r r o r D e l i m i t e r Error \quad Delimiter ErrorDelimiter第一个比特值为1的隐性 ( r e c e s s i v e ) (recessive) (recessive)比特位之后它会监测总线直到它监测到比特值为1的状态才会继续发送剩下的7个比特值为1的比特位。

 
图9.

      O V E R L O A D F R A M E OVERLOAD\quad FRAME OVERLOADFRAME由两部分组成: S u p e r p o s i t i o n o f O v e r l o a d F l a g s Superposition\quad of\quad Overload \quad Flags SuperpositionofOverloadFlags O v e r l o a d D e l i m i t e r Overload \quad Delimiter OverloadDelimiter,如图9所示。有两种情况会造成 O V E R L O A D F R A M E OVERLOAD\quad FRAME OVERLOADFRAME的发送:

  1. 由接收节点的内部条件决定,在接收下一个 D A T A F R A M E DATA\quad FRAME DATAFRAME R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME之前需要一定的延时。(这种情况下只允许在所期待的之后将会介绍的帧间间隔的 i n t e r m i s s i o n intermission intermission区间的第一个比特位开始发送OVERLOAD\quad FRAME$。)
  2. 在之后将会介绍的帧间间隔的 i n t e r m i s s i o n intermission intermission区间内发现了比特值为0的比特位。(这种情况下只允许在发现了比特值为0的比特位之后才能发送 O V E R L O A D F R A M E OVERLOAD\quad FRAME OVERLOADFRAME

     为了延迟下一个 D A T A F R A M E DATA\quad FRAME DATAFRAME R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME的到来,最多也只能发送两个 O V E R L O A D F R A M E OVERLOAD\quad FRAME OVERLOADFRAME O v e r l o a d F l a g Overload \quad Flag OverloadFlag由6个显性的比特位组成,它整体的格式和 A c t i v e E r r o r F l a g Active\quad Error\quad Flag ActiveErrorFlag有关。 O v e r l o a d D e l i m i t e r Overload \quad Delimiter OverloadDelimiter由8个为1隐性的比特位组成,它和 E r r o r D e l i m i t e r Error \quad Delimiter ErrorDelimiter的格式一样。在传输完 O v e r l o a d F l a g Overload \quad Flag OverloadFlag之后,节点持续监控总线的状态直到监测到一个显性到隐性的跳变,这一时刻表明总线中的所有节点已经完成发送 O v e r l o a d F l a g Overload \quad Flag OverloadFlag并且同时开始发送剩下的7个比特位的 O v e r l o a d D e l i m i t e r Overload \quad Delimiter OverloadDelimiter
      O v e r l o a d F l a g Overload \quad Flag OverloadFlag的格式破坏了固定格式的帧间间隔的 i n t e r m i s s i o n intermission intermission域,因为如果帧间间隔和 O v e r l o a d F l a g Overload \quad Flag OverloadFlag同时发送的话会导致在 i n t e r m i s s i o n intermission intermission中出现显性的比特位,这就触发了发送 O V E R L O A D F R A M E OVERLOAD\quad FRAME OVERLOADFRAME的第2种条件,这样就会导致所有其它节点也开始发送 O V E R L O A D F R A M E OVERLOAD\quad FRAME OVERLOADFRAME,这样就出现了 S u p e r p o s i t i o n o f O v e r l o a d F l a g s Superposition\quad of\quad Overload \quad Flags SuperpositionofOverloadFlags。这时其它的节点也不能正确的解析 O v e r l o a d F l a g Overload \quad Flag OverloadFlag,而是把其显性的比特位当成是 S t a r t o f f r a m e Start\quad of\quad frame Startofframe

 
图10
 
图11.

     下面来讲一下帧间间隔 I N T E R F R A M E S P A C I N G INTERFRAME\quad SPACING INTERFRAMESPACING D A T A F R A M E DATA\quad FRAME DATAFRAME R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME通过帧间间隔 I N T E R F R A M E S P A C I N G INTERFRAME\quad SPACING INTERFRAMESPACING来和其前面的帧(可以是前面提到的四种帧中的任意一种帧)进行区隔。 E R R O R F R A M E ERROR\quad FRAME ERRORFRAME O V E R L O A D F R A M E OVERLOAD\quad FRAME OVERLOADFRAME的前面不会有帧间间隔,多个 O V E R L O A D F R A M E OVERLOAD\quad FRAME OVERLOADFRAME之间也不会用帧间间隔进行区隔。
     帧间间隔的结构如图10和图11所示。一般情况下帧间间隔只包含 i n t e r m i s s i o n intermission intermission B u s I d l e Bus\quad Idle BusIdle。图10对应于不处于 e r r o r p a s s i v e error\quad passive errorpassive状态的节点或者该节点是前一个消息的接收者。图11对应于处于 e r r o r p a s s i v e error\quad passive errorpassive状态的节点且该节点为前一个消息的发送者。 i n t e r m i s s i o n intermission intermission由三个比特值为1的比特位组成,在 i n t e r m i s s i o n intermission intermission区间不允许发送 D A T A F R A M E DATA\quad FRAME DATAFRAME R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME,仅仅允许的操作是向总线表明一个过载 ( O V E R L O A D ) (OVERLOAD) (OVERLOAD)的条件。 B u s I d l e Bus\quad Idle BusIdle可以是任意长度,在这段区间总线被识别为空闲状态,任何有消息需要发送的节点此时都可以接入总线。之前在其它消息传输过程中被挂起的消息在 i n t e r m i s s i o n intermission intermission后的第一个比特位开始传输。
      S u s p e n d t r a n s m i s s i o n Suspend\quad transmission Suspendtransmission:如果一个处于 e r r o r p a s s i v e error\quad passive errorpassive状态的节点已经传送完一条消息,在开始传送其它消息或识别总线为空闲状态时,它会在 i n t e r m i s s i o n intermission intermission之后接着发送由八个比特值为1的比特位。如果同时另一个节点开始发送消息,则该节点会变成接收者。
     发送者 ( T R A N S M I T T E R ) (TRANSMITTER) (TRANSMITTER)和接收者 ( R E C E I V E R ) (RECEIVER) (RECEIVER)的定义:

  • 发送者,一个发起消息的节点是该消息的发送者,该节点直到总线空闲之前或在仲裁过程中失利之前一直都是发送者的角色。
  • 接收者,当总线不是空闲的状态且某个节点不是当前消息的发送者的时候,该节点被称为该消息的接收者。

     消息验证:对于发送者 ( T R A N S M I T T E R ) (TRANSMITTER) (TRANSMITTER)和接收者 ( R E C E I V E R ) (RECEIVER) (RECEIVER)来说,一个消息被称为有效的定义是不同的。

  • 对于发送者来说,如果直到一个数据帧的 E n d o f f r a m e End\quad of\quad frame Endofframe都没有错误则认为该发送的消息是有效的。如果一个消息崩溃了,该消息会根据优先级在总线空闲的时候尽快重新发送。
  • 对于接收者来说,如果直到一个数据帧的 E n d o f f r a m e End\quad of\quad frame Endofframe的倒数第二个比特位都没有错误则认为该接收的消息是有效的。

     比特流编码: S t a r t o f f r a m e Start\quad of\quad frame Startofframe A r b i t a t i o n f i e l d Arbitation\quad field Arbitationfield C O N T R O L f i e l d CONTROL\quad field CONTROLfield D A T A f i e l d DATA\quad field DATAfield C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE等比特段在编码的时候会用到比特填充 ( B i t S t u f f i n g ) (Bit\quad Stuffing) (BitStuffing),也就是发送者当监测到连续的五个比特值相同的比特位之后会插入一个比特值相反的比特位。数据帧 D A T A F R A M E DATA\quad FRAME DATAFRAME和远程帧 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME的剩余的比特段 A C K F I E L D ACK\quad FIELD ACKFIELD C R C D E L I M E T E R CRC\quad DELIMETER CRCDELIMETER E N D O F F R A M E END\quad OF\quad FRAME ENDOFFRAME的格式固定,不适用于比特填充。过载帧 O V E R L O A D F R A M E OVERLOAD\quad FRAME OVERLOADFRAME和错误帧 E R R O R F R A M E ERROR\quad FRAME ERRORFRAME的格式固定,也不适用于比特填充。

     错误检测 E R R O R D E T E C T I O N ERROR\quad DETECTION ERRORDETECTION:一共有5种不同类型的错误,但是它们不是互斥的。如下说明:

  • 比特错误:一个总线中的节点在发送一个比特位的同时也会检测总线中的比特位状态。当监测到总线中的比特位的状态和自己发送的不一致的时候,节点需要在这个比特位的时间里面能够检测到比特错误。当在有比特填充的 A r b i t a t i o n f i e l d Arbitation\quad field Arbitationfield比特段里面,如果本来发送的是比特位1,但是却监测到了比特位0,这种情况不算比特错误,因为这里可能是正常的仲裁过程。还有就是在发送完 A C K s l o t ACK\quad slot ACKslot的一个比特的比特位值为1的比特位之后监测到总线的比特位为0,这种情况也不算是比特错误,因为这可能是正常的 A C K ACK ACK流程。一个发送者在发送 P a s s i v e E r r o r F l a g Passive\quad Error \quad Flag PassiveErrorFlag的过程中如果监测到比特位为0的比特位也不被认为是比特错误。
  • 比特填充错误:前面由提到有些比特域适用于比特填充,但是如果接收者没有检测到相应的比特填充位的话,接收者应该在第六个比特位的区间检测到比特填充错误。
  • C R C CRC CRC错误:当接收者按照同样的计算方法计算得到的 C R C CRC CRC值和发送者发送过来的不一致的时候就会产生 C R C CRC CRC错误。
  • 格式错误:对于某些格式固定的比特段,如果接收者检测到了额外的比特位就会报格式错误。
  • A C K N O W L E D G M E N T ACKNOWLEDGMENT ACKNOWLEDGMENT错误:正常情况下发送者发送玩比特值为1的 A C K s l o t ACK\quad slot ACKslot之后应该会检测到比特值为0的比特位,如果没有检测到比特值为0的比特位的话就会报 A C K N O W L E D G M E N T ACKNOWLEDGMENT ACKNOWLEDGMENT错误。

     检测到总线错误之后 E R R O R F R A M E ERROR\quad FRAME ERRORFRAME的发送:当某个节点检测到错误之后,对于比特错误、比特填充错误、格式错误和 A C K N O W L E D G M E N T ACKNOWLEDGMENT ACKNOWLEDGMENT错误,在下一个比特位的时间就开始发送错误帧。对于 C R C CRC CRC错误,错误帧的发送在 C R C D E L I M E T E R CRC\quad DELIMETER CRCDELIMETER之后。
     故障界定 ( F A U L T C O N F I N E M E N T ) (FAULT\quad CONFINEMENT) (FAULTCONFINEMENT):关于故障界定,一个节点可能处于以下三种状态中的一种:

  • e r r o r a c t i v e error\quad active erroractive
  • e r r o r p a s s i v e error\quad passive errorpassive
  • b u s o f f bus\quad off busoff

     一个处于 e r r o r a c t i v e error\quad active erroractive的节点可以正常的参与总线的通信,当监测到总线中的错误时会发送带有 A C T I V E E R R O R F L A G ACTIVE\quad ERROR\quad FLAG ACTIVEERRORFLAG的错误帧。一个处于 e r r o r p a s s i v e error\quad passive errorpassive的节点不会发送带有 A C T I V E E R R O R F L A G ACTIVE\quad ERROR\quad FLAG ACTIVEERRORFLAG的错误帧,当监测到总线中的错误时会发送带有 P A S S I V E E R R O R F L A G PASSIVE\quad ERROR\quad FLAG PASSIVEERRORFLAG的错误帧。一个处于 b u s o f f bus\quad off busoff的节点不会对总线有任何影响,基本它的输出驱动被关闭了。为了实现故障界定每个节点中都有以下两个计数器:

  1. T R A N S M I T E R R O R C O U N T TRANSMIT\quad ERROR\quad COUNT TRANSMITERRORCOUNT
  2. R E C E I V E E R R O R C O U N T RECEIVE\quad ERROR\quad COUNT RECEIVEERRORCOUNT

     这两个计数器的值根据以下规则进行修改:

  1. 当一个接收者检测到一个错误的时候, R E C E I V E E R R O R C O U N T RECEIVE\quad ERROR\quad COUNT RECEIVEERRORCOUNT的值会加一。但是在发送 A C T I V E E R R O R F L A G ACTIVE\quad ERROR\quad FLAG ACTIVEERRORFLAG O V E R L O A D F L A G OVERLOAD\quad FLAG OVERLOADFLAG出现的比特错误除外。

  2. 当一个接收者在发送完 E R R O R F L A G ERROR\quad FLAG ERRORFLAG准备发送 E r r o r D e l i m e t e r Error\quad Delimeter ErrorDelimeter的时候却监测到了一个比特位值为0的比特位,这时 R E C E I V E E R R O R C O U N T RECEIVE\quad ERROR\quad COUNT RECEIVEERRORCOUNT加8。

  3. 当一个发送者发送 E R R O R F L A G ERROR\quad FLAG ERRORFLAG时候, T R A N S M I T E R R O R C O U N T TRANSMIT\quad ERROR\quad COUNT TRANSMITERRORCOUNT加8。但是由以下两种情况例外, T R A N S M I T E R R O R C O U N T TRANSMIT\quad ERROR\quad COUNT TRANSMITERRORCOUNT不变:

    • 一个处于 e r r o r p a s s i v e error\quad passive errorpassive状态的发送者检测到了一个 A C K N O W L E D G M E N T ACKNOWLEDGMENT ACKNOWLEDGMENT错误且接着在发送 P A S S I V E E R R O R F L A G PASSIVE\quad ERROR\quad FLAG PASSIVEERRORFLAG期间没有检测到一个比特值为0的比特位。
    • 一个发送者由于 A r b i t a t i o n f i e l d Arbitation\quad field Arbitationfield里面的比特填充错误发送了一个 E R R O R F L A G ERROR\quad FLAG ERRORFLAG,这里的填充的比特位位于 R T R RTR RTR比特位的前面。本来发送的是隐性的比特位却监测到了显性的比特位。
  4. 当一个发送者在发送 A C T I V E E R R O R F L A G ACTIVE\quad ERROR\quad FLAG ACTIVEERRORFLAG O V E R L O A D F L A G OVERLOAD\quad FLAG OVERLOADFLAG的时候却监测到了一个比特错误,这时 T R A N S M I T E R R O R C O U N T TRANSMIT\quad ERROR\quad COUNT TRANSMITERRORCOUNT加8。

  5. 当一个接收者在发送 A C T I V E E R R O R F L A G ACTIVE\quad ERROR\quad FLAG ACTIVEERRORFLAG O V E R L O A D F L A G OVERLOAD\quad FLAG OVERLOADFLAG的时候却监测到了一个比特错误,这时 R E C E I V E E R R O R C O U N T RECEIVE\quad ERROR\quad COUNT RECEIVEERRORCOUNT加8。

  6. 任何节点在发送完 A C T I V E E R R O R F L A G ACTIVE\quad ERROR\quad FLAG ACTIVEERRORFLAG P A S S I V E E R R O R F L A G PASSIVE\quad ERROR\quad FLAG PASSIVEERRORFLAG O V E R L O A D F L A G OVERLOAD\quad FLAG OVERLOADFLAG之后最多只能忍受不超过7个比特的连续的显性比特位。在监测到14(6+8,这里针对 A C T I V E E R R O R F L A G ACTIVE\quad ERROR\quad FLAG ACTIVEERRORFLAG O V E R L O A D F L A G OVERLOAD\quad FLAG OVERLOADFLAG,其一般是6个连续的显性比特位,如果出现 S u p e r p o s i t i o n o f O v e r l o a d F l a g s Superposition\quad of\quad Overload \quad Flags SuperpositionofOverloadFlags S u p e r p o s i t i o n o f E r r o r F l a g s Superposition\quad of\quad Error \quad Flags SuperpositionofErrorFlags之后会扩展到最多12个)个连续的显性比特位之后或者监测到8 ( 这 里 针 对 P A S S I V E E R R O R F L A G , 其 一 般 是 6 个 连 续 的 隐 性 比 特 位 ) (这里针对PASSIVE\quad ERROR\quad FLAG,其一般是6个连续的隐性比特位) (PASSIVEERRORFLAG6)个连续的显性比特位之后,对于这两种情况都是相当于监测到了第8个额外的显性比特位,在这种情况下,每一个发送者都会将 T R A N S M I T E R R O R C O U N T TRANSMIT\quad ERROR\quad COUNT TRANSMITERRORCOUNT的值加8,每一个接收者都会将 R E C E I V E E R R O R C O U N T RECEIVE\quad ERROR\quad COUNT RECEIVEERRORCOUNT的值加8。

  7. 当成功发送完一个消息之后,即得到了 A C K ACK ACK确认且直到 E n d o f f r a m e End\quad of\quad frame Endofframe发送完之前没有错误, T R A N S M I T E R R O R C O U N T TRANSMIT\quad ERROR\quad COUNT TRANSMITERRORCOUNT的值会减一,除非 T R A N S M I T E R R O R C O U N T TRANSMIT\quad ERROR\quad COUNT TRANSMITERRORCOUNT的值已经为0。

  8. 当成功接收一个消息之后,即成功发送了 A C K ACK ACK确认,如果当前 R E C E I V E E R R O R C O U N T RECEIVE\quad ERROR\quad COUNT RECEIVEERRORCOUNT的值所在的区间为 [ 1 , 127 ] [1,127] [1,127] R E C E I V E E R R O R C O U N T RECEIVE\quad ERROR\quad COUNT RECEIVEERRORCOUNT的值会减一。如果当前 R E C E I V E E R R O R C O U N T RECEIVE\quad ERROR\quad COUNT RECEIVEERRORCOUNT的值为0, R E C E I V E E R R O R C O U N T RECEIVE\quad ERROR\quad COUNT RECEIVEERRORCOUNT的值不变。如果当前 R E C E I V E E R R O R C O U N T RECEIVE\quad ERROR\quad COUNT RECEIVEERRORCOUNT的值大于127, R E C E I V E E R R O R C O U N T RECEIVE\quad ERROR\quad COUNT RECEIVEERRORCOUNT的值会被设置为区间 [ 119 , 127 ] [119,127] [119,127]中的值。

  9. T R A N S M I T E R R O R C O U N T TRANSMIT\quad ERROR\quad COUNT TRANSMITERRORCOUNT R E C E I V E E R R O R C O U N T RECEIVE\quad ERROR\quad COUNT RECEIVEERRORCOUNT的值大于等于128时,节点进会进入 e r r o r p a s s i v e error\quad passive errorpassive的状态。让一个节点进入 e r r o r p a s s i v e error\quad passive errorpassive的状态的错误会引发该节点发送带有 A C T I V E E R R O R F L A G ACTIVE\quad ERROR\quad FLAG ACTIVEERRORFLAG的错误帧。

  10. 当一个节点的 T R A N S M I T E R R O R C O U N T TRANSMIT\quad ERROR\quad COUNT TRANSMITERRORCOUNT大于等于256时,节点进会进入 b u s o f f bus\quad off busoff的状态。

  11. 一个处于 e r r o r p a s s i v e error\quad passive errorpassive的状态的节点当 T R A N S M I T E R R O R C O U N T TRANSMIT\quad ERROR\quad COUNT TRANSMITERRORCOUNT R E C E I V E E R R O R C O U N T RECEIVE\quad ERROR\quad COUNT RECEIVEERRORCOUNT的值都小于等于127时会进入 e r r o r a c t i v e error\quad active erroractive的状态。

  12. 一个处于 b u s o f f bus\quad off busoff状态的节点允许通过将 T R A N S M I T E R R O R C O U N T TRANSMIT\quad ERROR\quad COUNT TRANSMITERRORCOUNT R E C E I V E E R R O R C O U N T RECEIVE\quad ERROR\quad COUNT RECEIVEERRORCOUNT的值都设置为0来进入 e r r o r a c t i v e error\quad active erroractive的状态,条件是总线上监测到了128次11个连续的隐性比特位。

     注意:如果开始的时候总线中只有一个节点且该节点发送了一些消息,因为此时总线中就只有它一个节点,因此这样它就不会接收到 A C K ACK ACK确认信号,同时也会监测到该错误,这样它就会不断重复发送之前发送的消息,也会不断的发送错误帧,这样就会导致其 T R A N S M I T E R R O R C O U N T TRANSMIT\quad ERROR\quad COUNT TRANSMITERRORCOUNT一直持续增加到128,这样该节点也就进入了 e r r o r p a s s i v e error\quad passive errorpassive的状态。但是这里该节点不会进入 b u s o f f bus\quad off busoff状态,原因见上面第3点的第一个异常点。
/-------------------------------------------------------------CAN网络的比特时序要求-------------------------------------------------/

 
图12.

     下面来讲一下 C A N CAN CAN总线的比特位的时序要求,下面我们先来讲一些基本的概念和定义:

  • 名义上的比特速率 ( N O M I N A L B I T R A T E ) (NOMINAL\quad BIT\quad RATE) (NOMINALBITRATE):名义上的比特速率是一个理想的发送器在没有再同步 R e S y n c h r o n i z a t i o n ReSynchronization ReSynchronization的情况下一秒钟所发送的比特位的个数。
  • 名义上的一个比特时间 ( N O M I N A L B I T T I M E ) (NOMINAL\quad BIT\quad TIME) (NOMINALBITTIME):名义上的一个比特时间可以被想象成划分为不重叠的4个时间段,如图12所示。 ( N O M I N A L B I T T I M E = 1 N O M I N A L B I T R A T E ) (NOMINAL\quad BIT\quad TIME=\frac{1}{ NOMINAL\quad BIT\quad RATE }) (NOMINALBITTIME=NOMINALBITRATE1),各个段的描述如下:
    • synchronization segment (Sync_Seg):这部分比特时间应该被用于同步 C A N CAN CAN网络上不同的节点。一个脉冲边缘期待出现在这段时间内。这部分比特时间因该为1个时间单位 Q u a n t u m Quantum Quantum
    • propagation time segment (Prop_Seg):这部分比特时间应该被用于补偿 C A N CAN CAN网络中的物理延迟时间。这些延迟时间由总线上的信号传播时间和 C A N CAN CAN网络中节点的内部延迟时间(输入比较器延时和输出驱动延时)组成。Prop_Seg段的时间应该者些总的延迟时间的两倍。这部分比特时间因该为1到8个时间单位 Q u a n t u m Quantum Quantum
    • phase buffer segment 1 (Phase_Seg1)和 phase buffer segment2 (Phase_Seg2):这两部分比特时间被用于补偿边缘相位错误。这两部分比特时间可以根据总线的具体情况通过再同步适当的加长或缩短。Phase_Seg1这部分比特时间因该为1到8个或更多个时间单位 Q u a n t u m Quantum Quantum。Phase_Seg2这部分比特时间因该设定为Phase_Seg1比特时间和信息处理时间的最大值。信息处理时间是从采样点开始预留的用来计算决定当前的比特位是比特位0还是比特位1的时间。信息处理时间应该小于等于两个时间单位 Q u a n t u m Quantum Quantum
  • 采样点 ( S a m p l e P o i n t ) (Sample\quad Point) (SamplePoint):采样点是总线的电平状态被读取并被解释为比特位0或比特位1的时间点,它位于Phase_Seg1末尾。
  • 时间单位 Q u a n t u m Quantum Quantum:时间单位 Q u a n t u m Quantum Quantum是一个固定长度的时间单位,它来自于晶振的周期 ( o s c i l l a t o r p e r i o d ) (oscillator\quad period) (oscillatorperiod)。应该存在一个只支持整数的预分频器,范围至少是 [ 1 , 32 ] [1,32] [1,32]。时间单位 Q u a n t u m Quantum Quantum应该可以配置为 m × ( o s c i l l a t o r p e r i o d ) , m ∈ [ 1 , 32 ] m\times (oscillator\quad period),m\in [1,32] m×(oscillatorperiod),m[1,32]。在一个比特时间中总的时间单位 Q u a n t u m Quantum Quantum数应该可以被配置为至少从8到25。

      C A N CAN CAN网络上的所有节点必须工作在同样的名义上的比特速率,但是由于网络上的噪音等其它因素( p h a s e s h i f t s , o s c i l l a t o r t o l e r a n c e a n d o s c i l l a t o r d r i f t phase\quad shifts, oscillator\quad tolerance\quad and\quad oscillator\quad drift phaseshifts,oscillatortoleranceandoscillatordrift)的影响,会造成网络上实际的比特速率不是名义上的比特速率。因为 C A N CAN CAN总线是一种串行异步总线,不像 S P I SPI SPI I 2 C I2C I2C等同步协议,它没有单独的时钟线用来同步,因此一种同步网络中的节点的手段很有必要。同步在仲裁阶段很重要,因为这时网络中的节点必须同时看到它们自己发送的数据的高低电平和其它节点发送的数据的高低电平。当然同步功能在 C A N CAN CAN网络的其它方面也起着重要作用。
     正因为如此,当然还有其它原因,网络发送延迟补偿,采样点的定位等,在 C A N CAN CAN总线协议中一个名义上的比特位的时间(名义上的比特速率的一个周期时间)才被进行了这样的划分。这样划分的目的就是为了同步操作。同步操作分为硬同步( H a r d S y n c h r o n i z a t i o n Hard\quad Synchronization HardSynchronization)和再同步( R e S y n c h r o n i z a t i o n ReSynchronization ReSynchronization)。具体介绍之前我们再介绍几个概念, R e s y n c h r o n i z a t i o n j u m p w i d t h ( S J W ) Resynchronization\quad jump\quad width (SJW) Resynchronizationjumpwidth(SJW) P h a s e e r r o r o f s y n c h r o n i z a t i o n e d g e Phase\quad error\quad of\quad synchronization edge Phaseerrorofsynchronizationedge:

  • R e s y n c h r o n i z a t i o n j u m p w i d t h ( S J W ) Resynchronization\quad jump\quad width (SJW) Resynchronizationjumpwidth(SJW):再同步会增加一个比特位的区间中Phase_Seg1段的时间单位 Q u a n t u m Quantum Quantum数量或者减少一个比特位的区间中Phase_Seg2段的时间单位 Q u a n t u m Quantum Quantum数量。 S J W SJW SJW给出了这个增加或减少的时间单位 Q u a n t u m Quantum Quantum数量的上限。 R e s y n c h r o n i z a t i o n j u m p w i d t h ( S J W ) Resynchronization\quad jump\quad width (SJW) Resynchronizationjumpwidth(SJW)可以配置的区间为1时间单位 Q u a n t u m Quantum Quantum到4时间单位 Q u a n t u m Quantum Quantum和Phase_Seg1段的时间单位的较小值。
  • 同 步 边 缘 相 位 错 误 ( P h a s e e r r o r o f s y n c h r o n i z a t i o n e d g e 同步边缘相位错误(Phase\quad error\quad of\quad synchronization\quad edge (Phaseerrorofsynchronizationedge):它的值通过边缘相对于同步段 ( S y n c S e g ) (Sync_Seg) (SyncSeg)的位置给出,单位是时间单位 Q u a n t u m Quantum Quantum
    • =0,边缘位于同步段 ( S y n c _ S e g ) (Sync\_Seg) (Sync_Seg)内。
    • > > > 0,边缘位于采样点之前。
    • < < < 0,边缘位于前一个比特位的采样点之后。

     硬同步和再同步遵循以下规则:

  1. 一个比特时间内(两个紧邻的采样点之间)仅仅允许一种同步,硬同步或再同步。
  2. 仅仅当前一个采样点检测到的总线的高低电平值不同于紧接着边缘(1到0)之后检测到的总线的高低电平值的时候,1 ( R e c e s s i v e S t a t e ) (Recessive\quad State) (RecessiveState) 到0 ( D o m i n a n t S t a t e ) (Dominant\quad State) (DominantState)边缘才被用于同步。
  3. 在帧间空闲区间,任何1 ( R e c e s s i v e S t a t e ) (Recessive\quad State) (RecessiveState) 到0 ( D o m i n a n t S t a t e ) (Dominant\quad State) (DominantState) 的边缘都会触发硬同步。
  4. All other recessive to dominant edges (and optionally dominant to recessive edges in the case of low bit rates) fulfilling the rules 1 and 2 will be used for Resynchronization with the exception that a transmitter will not perform a Resynchronization as a result of a recessive to dominant edge with a positive PHASE error, if only recessive to dominant edges are used for Resynchronization.

     以下部分内容在A版本的文档里面是没有的,是我根据互联网上的一些内容自己总结的,不一定对。大于0的时候硬同步发生在总线空闲的时候接收节点检测到了一个下降沿,这时所有的接收节点都要从这个下降沿开始计算一个比特位的时间。也就是说硬同步发生在一个数据帧开头,也就是 S t a r t o f f r a m e Start\quad of \quad frame Startofframe,这时所有接收节点都要将一个帧的起始比特位的开始时间从此刻开始算起。
     硬同步的作用只是让接收节点在一个帧的起始位置保持和发送节点的同步。再同步的作用是为了让接收节点在一个数据帧的期间一直保持和发送节点的同步。再同步发生于一个数据帧的期间接收节点当检测到了一个下降沿不位于预期的同步段 ( S y n c _ S e g ) (Sync\_Seg) (Sync_Seg)的时候,再同步会延长或缩短一个比特位所占的时间来保持发送节点和接收节点的同步。这里也同时说明了再同步发生于一个数据帧的期间且是发送节点发送显性比特位的时候。当同步边缘相位错误大于0的时候,再同步会增加接收者的 P h a s e _ S e g 1 Phase\_Seg1 Phase_Seg1段的长度,增加的值为同步边缘相位错误的值。但是当同步边缘相位错误的值大于等于 S J W SJW SJW的时候,增加的值为 S J W SJW SJW的值。由硬同步可以知道接收节点通过发送节点发送的 S t a r t o f f r a m e Start\quad of \quad frame Startofframe来开始计算一个帧的开始时间,也就是同步了发送节点和接收节点的一个帧的第一个比特位的开始时间。如果由于总线延迟、节点内部延迟或节点本身的速率导致发送节点的速率比接收节点的速率要慢,对于接收节点这样就有可能导致在一数据帧的期间的某个比特位,本来接收节点预期此刻因该在该比特位 ( P r o p _ S e g ) (Prop\_Seg) (Prop_Seg)段内了,但是此时却检测到了一个下降沿,这就是由于发送节点的速率比接收节点的速率要慢的原因。这种情况对应于同步边缘相位错误大于0的时候。如图16所示。图中黄色的方块为增加到 P h a s e _ S e g 1 Phase\_Seg1 Phase_Seg1段中的2个 T i m e Q u a n t u m Time\quad Quantum TimeQuantum。黑色的方块表示同步段 ( S y n c _ S e g ) (Sync\_Seg) (Sync_Seg),蓝色的方块表示段 P r o p _ S e g Prop\_Seg Prop_Seg,绿色的方块表示同步段 P h a s e _ S e g 1 Phase\_Seg1 Phase_Seg1,橘色的方块表示同步段 P h a s e _ S e g 2 Phase\_Seg2 Phase_Seg2

 
图16.

     当同步边缘相位错误小于0的时候,再同步会减少接收者的 P h a s e _ S e g 2 Phase\_Seg2 Phase_Seg2段的长度,减少的值为同步边缘相位错误的值。但是当同步边缘相位错误的值大于等于 S J W SJW SJW的时候,减少的值为 S J W SJW SJW的值。如果由于总线延迟、节点内部延迟或节点本身的速率导致发送节点的速率比接收节点的速率要快,对于接收节点这样就有可能导致在一数据帧的期间的某个比特位,本来接收节点预期此刻因该在该比特位 P h a s e _ S e g 2 Phase\_Seg2 Phase_Seg2段内,但是此时却检测到了另一个比特位下降沿,这就是由于发送节点的速率比接收节点的速率快的原因。这种情况对应于同步边缘相位错误小于0的时候。如图17所示。

 
图17.

/* =============================== 以下是B版本的各种帧格式的讲解================================== */
     这里在讲解 B B B版本的内容的时候主要讲一下它和 A A A版本的区别,这里就不会像上面一样很详细的去讲了。 B B B版本一共有两种帧格式,标准帧格式和扩展帧格式。 D A T A F R A M E DATA\quad FRAME DATAFRAME R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME都可以用在标准帧格式和扩展帧格式。 B B B版本的标准帧格式和 A A A版本的帧格式基本一样,只是个别比特位会有区别,这里就不讲了,可以自己去看一下 B O S C H BOSCH BOSCH公司1991年提出的2.0版本的文档,具体有区别的地方我下面也会提到。
     在 B B B版本中,标准帧格式的 A r b i t a t i o n f i e l d Arbitation\quad field Arbitationfield M e s s a g e I d e n t i f i e r Message\quad Identifier MessageIdentifier长为11个比特位,扩展帧格式为29个比特位。扩展帧格式的 A r b i t a t i o n f i e l d Arbitation\quad field Arbitationfield的开头是11个比特位,它对应 M e s s a g e I d e n t i f i e r Message\quad Identifier MessageIdentifier I D 28 ID28 ID28 I D 18 ID18 ID18 I D 28 ID28 ID28 I D 18 ID18 ID18也被称为 B a s e I D Base\quad ID BaseID,因为它和标准帧格式的 M e s s a g e I d e n t i f i e r Message\quad Identifier MessageIdentifier格式一样,然后接着是比特位 S R R SRR SRR和比特位 I D E IDE IDE,最后是 M e s s a g e I d e n t i f i e r Message\quad Identifier MessageIdentifier I D 17 ID17 ID17 I D 9 ID9 ID9 I D 17 ID17 ID17 0 0 0也被称为 E x t e n d e d I D Extended\quad ID ExtendedID,和比特位 R T R RTR RTR
     扩展帧格式的比特位 S R R SRR SRR是一个隐性(二进制值为1的比特位)的比特位,它的位置就是标准帧格式的比特位 R T R RTR RTR S R R SRR SRR的全称是 S u b s t i t u t e R e m o t e R e q u e s t Substitute\quad Remote\quad Request SubstituteRemoteRequest,翻译过来就是“取代远程请求”。这样做的好处是如果网络中同时出现了一个标准帧格式的数据帧和扩展帧格式的数据帧且扩展帧格式的 B a s e I D Base\quad ID BaseID和标准帧格式的 M e s s a g e I d e n t i f i e r Message\quad Identifier MessageIdentifier一样,因为标准帧格式的数据帧中的 M e s s a g e I d e n t i f i e r Message\quad Identifier MessageIdentifier之后是一个显性(二进制值为0的比特位)的比特位 R T R RTR RTR,扩展帧格式的数据帧中的 B a s e I D Base\quad ID BaseID之后是一个隐性(二进制值为1的比特位)的比特位 S R R SRR SRR,这样标准帧格式的数据帧可以活动总线的发送权。扩展帧格式的比特位 I D E IDE IDE也是一个隐性(二进制值为1的比特位)的比特位, B B B版本的标准帧格式中的 C O N T R O L f i e l d CONTROL\quad field CONTROLfield中的 r 1 r1 r1比特位不再是 A A A版本的中的保留使用,而是被用作比特位 I D E IDE IDE并且是一个显性(二进制值为0的比特位)的比特位。这个比特位 I D E IDE IDE是为了区别 B B B版本的标准帧格式和扩展帧格式。 A A A版本的帧格式中的比特位 R T R RTR RTR B B B版本的标准帧格式和扩展帧格式中的比特位 R T R RTR RTR含义一样,在 D A T A F R A M E DATA\quad FRAME DATAFRAME中该比特位为一个显性(二进制值为0的比特位)的比特位 ,在 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME该比特位为一个隐性(二进制值为1的比特位)的比特位。
      A A A版本的帧格式的 C O N T R O L f i e l d CONTROL\quad field CONTROLfield B B B版本的标准帧格式和扩展帧格式中的的 C O N T R O L f i e l d CONTROL\quad field CONTROLfield基本一样,除了前面刚刚提到的 B B B版本的标准帧格式中的 r 1 r1 r1比特位不再是 A A A版本的中的保留使用,而是被用作比特位 I D E IDE IDE并且是一个显性(二进制值为0的比特位)的比特位。这个比特位 I D E IDE IDE是为了区别 B B B版本的标准帧格式和扩展帧格式。
     上面提到的 A A A版本的帧格式, B B B版本的标准帧格式和 B B B版本的扩展帧格式的 A r b i t a t i o n f i e l d Arbitation\quad field Arbitationfield C O N T R O L f i e l d CONTROL\quad field CONTROLfield之间的差别同时适用于 D A T A F R A M E DATA\quad FRAME DATAFRAME R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME,至于 C R C f i e l d CRC\quad field CRCfield A C K f i e l d ACK\quad field ACKfield E n d o f f r a m e End\quad of\quad frame Endofframe则没有区别。对于 E R R O R F R A M E ERROR\quad FRAME ERRORFRAME O V E R L O A D F R A M E OVERLOAD\quad FRAME OVERLOADFRAME I N T E R F R A M E S P A C I N G INTERFRAME\quad SPACING INTERFRAMESPACING也没有区别。 B B B版本的扩展帧格式的数据帧的格式如图14所示。我这里也主要讲了以下数据帧格式上的区别,至于其它的一些细节方便的查边可以自己查看以下文档。

 
图14.

/* =============================== 以下是CAN FD协议的讲解================================== */
      C A N F D CAN\quad FD CANFD的全称是 C A N w i t h F l e x i b l e D a t a − R a t e CAN\quad with\quad Flexible\quad Data-Rate CANwithFlexibleDataRate,从字面上理解就是具有灵活的可以配置的数据速率的 C A N CAN CAN协议。接下来的讲解会以 B o s c h Bosch Bosch公司发布的 C A N F D CAN\quad FD CANFD总线协议的规范化的协议文档的1.0版本为基准,如图15所示。

 
图15.

     引语:串行通信被越来越多的应用所接受这一事实导致了对 C A N CAN CAN通信的带宽的增长的需求,这也引起了系统开发者在某些应用上试图寻找可替代的通信协议。这些应用可以用新的 C A N F D CAN\quad FD CANFD协议实现并且兼容性更好。 C A N F D CAN\quad FD CANFD协议的速率可以高达 1 M B i t / s 1MBit/s 1MBit/s,最重要的是相比起 C A N 2.0 CAN\quad 2.0 CAN2.0协议最多只能发送8个实际的字节数据, C A N F D CAN\quad FD CANFD协议可以发送多于8个实际的字节数据。
      C A N F D CAN\quad FD CANFD协议和 C A N 2.0 CAN\quad 2.0 CAN2.0协议公用物理层。它们的帧格式是不同的,在 C A N F D CAN\quad FD CANFD协议的帧中有两个 C A N 2.0 CAN\quad 2.0 CAN2.0协议中没有的控制位,一个用来使能这种具有不同的数据字长编码的新的帧格式,另一个用来在仲裁域之后切换到更快的传输速率。New CRC polynomials are introduced to secure the longer CAN FD frames with the same Hamming distance as in the proven CAN protocol.
      C A N F D CAN\quad FD CANFD协议的帧格式在设计的时候做到了 C A N F D CAN\quad FD CANFD协议的帧可以和 C A N 2.0 CAN\quad 2.0 CAN2.0协议的帧可以在一个网络中共存。虽然发布了 C A N F D CAN\quad FD CANFD协议,但是 C A N 2.0 CAN\quad 2.0 CAN2.0协议依然作为一个独立的 C A N CAN CAN总线协议,没有任何修改的保持有效。为了使得 C A N F D CAN\quad FD CANFD协议的帧可以和 C A N 2.0 CAN\quad 2.0 CAN2.0协议的帧可以在一个网络中共存, C A N F D CAN\quad FD CANFD协议的实现必须要做到不仅和 C A N F D CAN\quad FD CANFD协议兼容还要和 C A N 2.0 CAN\quad 2.0 CAN2.0协议兼容。
     为了和这个版本的 C A N F D CAN\quad FD CANFD协议兼容, C A N F D CAN\quad FD CANFD协议的实现必须要做到同时和这个版本的 C A N F D CAN\quad FD CANFD协议以及最新版本的 I S O − 11898 − 1 ISO-11898-1 ISO118981兼容。
     通过 C A N F D CAN\quad FD CANFD协议实现的 C A N CAN CAN和通过 C A N 2.0 CAN\quad 2.0 CAN2.0协议实现的 C A N CAN CAN可以相互通信,只要不使用 C A N F D CAN\quad FD CANFD协议的帧格式。这使得基于 C A N 2.0 CAN\quad 2.0 CAN2.0协议实现的 C A N CAN CAN系统可以逐步移植到基于 C A N F D CAN\quad FD CANFD协议实现的 C A N CAN CAN系统。In theintroductory phase, it is possible to use CAN FD only in specific operation modes, e.g. software-download at end-of-line programming, while other controllers that do not support CAN FD are kept in standby.
     介绍 C A N F D CAN\quad FD CANFD协议是一种串行通信协议,支持分布式的实时控制并且具有非常高的安全性。为了实现设计的透明性以及实现的灵活性, C A N F D CAN\quad FD CANFD协议根据 I S O / O S I ISO/OSI ISO/OSI参考模型被划分为了不同的层。如图16所示。

 
图16.

     数据链路层 ( D a t a L i n k L a y e r ) (Data\quad Link\quad Layer) (DataLinkLayer)处理具体的帧,它又被划分为了两个子层, L o g i c a l L i n k C o n t r o l ( L L C ) Logical \quad Link\quad Control (LLC) LogicalLinkControl(LLC)层和 M e d i u m A c c e s s C o n t r o l ( M A C ) Medium\quad Access\quad Control (MAC) MediumAccessControl(MAC)层。 L o g i c a l L i n k C o n t r o l ( L L C ) Logical \quad Link\quad Control (LLC) LogicalLinkControl(LLC)层和节点的控制器主机接口相关,主要被用作消息过滤,过载通知和恢复管理。它的作用主要是以下四点:

  • 决定被 M e d i u m A c c e s s C o n t r o l ( M A C ) Medium\quad Access\quad Control (MAC) MediumAccessControl(MAC)子层接收的那些消息是否应该实际被接收。
  • 为数据传输和远程数据请求提供服务。
  • 提供 M e d i u m A c c e s s C o n t r o l ( M A C ) Medium\quad Access\quad Control (MAC) MediumAccessControl(MAC)子层所传输的消息。
  • 提供恢复管理和过载通知的手段。

      M e d i u m A c c e s s C o n t r o l ( M A C ) Medium\quad Access\quad Control (MAC) MediumAccessControl(MAC)子层主要负责消息帧,仲裁, A c k n o w l e d g e m e n t Acknowledgement Acknowledgement,错误检测和 S i g n a l i n g Signaling Signaling。它被一个叫做故障界定 ( F a u l t C o n f i n e m e n t ) (Fault\quad Confinement) (FaultConfinement)的管理实体所监管,如图16所示。这个实体是一种自检查机制,它用来区别暂时的干扰和永久的错误。在 M e d i u m A c c e s s C o n t r o l ( M A C ) Medium\quad Access\quad Control (MAC) MediumAccessControl(MAC)子层内决定当前总线是否处于空闲状态可以用来发送消息以及是否可以开始接收消息。 M e d i u m A c c e s s C o n t r o l ( M A C ) Medium\quad Access\quad Control (MAC) MediumAccessControl(MAC)子层是整个 C A N F D CAN\quad FD CANFD协议的核心,因此 M e d i u m A c c e s s C o n t r o l ( M A C ) Medium\quad Access\quad Control (MAC) MediumAccessControl(MAC)子层没有自由修改的空闲,但是相比之下 L o g i c a l L i n k C o n t r o l ( L L C ) Logical \quad Link\quad Control (LLC) LogicalLinkControl(LLC)层就有较多的自由修改的空闲。
     物理层处理数据比特并定义信号如何被实际的传输,因此也会处理比特位的时序,比特位的编码和同步。但是在 B o s c h Bosch Bosch公司发布的 C A N F D CAN\quad FD CANFD总线协议的规范化的协议文档的1.0版本中并没有定义实际的物理层的电气特性,这是为了使得传输媒介和信号高低的实现针对具体应用做优化。在一个 C A N CAN CAN网路中,所有节点的物理层必须相同,但是对于具体选择什么样的物理层,有很大可以发挥的自由空间。
      C A N F D CAN\quad FD CANFD协议有以下属性:

  • 消息优先级
  • 延迟时间的保证
  • 配置灵活性
  • 带时间同步的多播接收
  • 系统范围内的数据一致性
  • 多主机
  • 错误监测和通知
  • 当监测到总线空闲时会马上发送之前被打断发送而没有被发出的消息
  • 可以区分暂时的错误和永久的错误并且可以自动关闭有问题的节点
  • C A N F D CAN\quad FD CANFD协议和 C A N CAN CAN协议兼容,每一个 C A N F D CAN\quad FD CANFD节点都可以根据 I S O − 11898 − 1 ISO-11898-1 ISO118981接收和发送 C A N CAN CAN消息。

     在下面的讲解中,如果 C A N F D CAN\quad FD CANFD协议和 C A N CAN CAN协议中相同的我就不再讲了,主要还是讲解一下 C A N F D CAN\quad FD CANFD协议中和 C A N CAN CAN协议有明显区别的地方。

  • 比特速率:这一点就和 2.0 2.0 2.0版本的 C A N CAN CAN协议有很大区别。在 C A N F D CAN\quad FD CANFD系统中可以有两种比特速率,在普通的 2.0 2.0 2.0版本的 C A N CAN CAN协议中一个系统只能有一种比特速率。 C A N F D CAN\quad FD CANFD系统中的两种比特速率,一个是针对仲裁阶段,一个是针对数据阶段。
  • 远程数据请求:在 C A N F D CAN\quad FD CANFD协议中没有专门针对 C A N F D CAN\quad FD CANFD协议的 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME C A N F D CAN\quad FD CANFD协议中的 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME C A N CAN CAN协议中的 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME一样。

     消息传输

  • 帧格式, C A N F D CAN\quad FD CANFD协议一共有四种不同格式的帧,这4种不同的帧格式的主要区别是 A b i t r a t i o n f i e l d Abitration \quad field Abitrationfield C o n t r o l f i e l d Control \quad field Controlfield的长度不同,如下所示。前面两种帧格式就是前面介绍的 2.0 2.0 2.0版本的 C A N CAN CAN协议的帧格式,这是为了和 2.0 2.0 2.0版本的 C A N CAN CAN协议兼容。
    • C A N B A S E F O R M A T CAN\quad BASE\quad FORMAT CANBASEFORMAT,11比特长的 I D E N T I F I E R IDENTIFIER IDENTIFIER且比特速率为常数。
    • C A N E X T E N D E D F O R M A T CAN\quad EXTENDED\quad FORMAT CANEXTENDEDFORMAT: 29比特长的 I D E N T I F I E R IDENTIFIER IDENTIFIER且比特速率为常数。
    • C A N F D B A S E F O R M A T CAN\quad FD\quad BASE\quad FORMAT CANFDBASEFORMAT: 11比特长的 I D E N T I F I E R IDENTIFIER IDENTIFIER且具有两种比特速率。
    • C A N F D E X T E N D E D F O R M A T CAN\quad FD\quad EXTENDED\quad FORMAT CANFDEXTENDEDFORMAT: 29比特长的 I D E N T I F I E R IDENTIFIER IDENTIFIER且具有两种比特速率。
  • 帧类型, C A N F D CAN\quad FD CANFD协议一共有四种不同类型的帧, D A T A F R A M E DATA\quad FRAME DATAFRAME R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME通过帧间间隔 ( I N T E R F R A M E S P A C E ) (INTERFRAME\quad SPACE) (INTERFRAMESPACE)和前面的帧进行区隔。
  • D A T A F R A M E DATA\quad FRAME DATAFRAME,运载着从发送者到接收者的数据,在 C A N F D CAN\quad FD CANFD协议中 D A T A F R A M E DATA\quad FRAME DATAFRAME又有四种不同类型的子帧,前面两种类型的数据帧就是前面介绍的 2.0 2.0 2.0版本的 C A N CAN CAN协议的数据帧。
    • D A T A F R A M E i n C A N B A S E F O R M A T DATA\quad FRAME\quad in\quad CAN\quad BASE\quad FORMAT DATAFRAMEinCANBASEFORMAT
    • D A T A F R A M E i n C A N E X T E N D E D F O R M A T DATA\quad FRAME\quad in\quad CAN\quad EXTENDED\quad FORMAT DATAFRAMEinCANEXTENDEDFORMAT
    • D A T A F R A M E i n C A N F D B A S E F O R M A T DATA\quad FRAME\quad in\quad CAN\quad FD\quad BASE\quad FORMAT DATAFRAMEinCANFDBASEFORMAT
    • D A T A F R A M E i n C A N F D E X T E N D E D F O R M A T DATA\quad FRAME\quad in\quad CAN\quad FD\quad EXTENDED\quad FORMAT DATAFRAMEinCANFDEXTENDEDFORMAT
  • R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME,一个节点用来向某个节点请求发送 D A T A F R A M E DATA\quad FRAME DATAFRAME,且请求发送 D A T A F R A M E DATA\quad FRAME DATAFRAME的节点发送的 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME I D E N T I F I E R IDENTIFIER IDENTIFIER和发送 D A T A F R A M E DATA\quad FRAME DATAFRAME的节点发送的 D A T A F R A M E DATA\quad FRAME DATAFRAME I D E N T I F I E R IDENTIFIER IDENTIFIER相同。在 C A N F D CAN\quad FD CANFD协议中没有新增加新的 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME格式,只是继承了 2.0 2.0 2.0版本的 C A N CAN CAN协议的 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME
    • R E M O T E F R A M E i n C A N B A S E F O R M A T REMOTE\quad FRAME\quad in\quad CAN\quad BASE\quad FORMAT REMOTEFRAMEinCANBASEFORMAT
    • R E M O T E F R A M E i n C A N E X T E N D E D F O R M A T REMOTE\quad FRAME\quad in\quad CAN\quad EXTENDED\quad FORMAT REMOTEFRAMEinCANEXTENDEDFORMAT
  • E R R O R F R A M E ERROR\quad FRAME ERRORFRAME,一个节点检测到错误时就会发送。
  • O V E R L O A D F R A M E OVERLOAD\quad FRAME OVERLOADFRAME,用来同步空闲检测以及为在前面的和后面的 D A T A F R A M E DATA\quad FRAME DATAFRAME R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME之间提供额外的延时。

      数 据 帧 , D A T A F R A M E 数据帧,DATA\quad FRAME DATAFRAME:一个数据帧由七个不同的比特域所组成,可视化展示如图17所示:

  • S T A R T O F F R A M E START\quad OF\quad FRAME STARTOFFRAME ,这个和 2.0 2.0 2.0版本的 C A N CAN CAN协议一样,这里就不详细说了。
  • A R B I T R A T I O N F I E L D ARBITRATION\quad FIELD ARBITRATIONFIELD ,这一部分差异较大,会重点讲解一下。
  • C O N T R O L F I E L D CONTROL\quad FIELD CONTROLFIELD ,这一部分差异较大,会重点讲解一下。
  • D A T A F I E L D DATA\quad FIELD DATAFIELD ,该域的长度可以为0,这部分没啥好讲的。
  • C R C F I E L D CRC\quad FIELD CRCFIELD
  • A C K F I E L D ACK\quad FIELD ACKFIELD
  • E N D O F F R A M E END\quad OF\quad FRAME ENDOFFRAME,这个和 2.0 2.0 2.0版本的 C A N CAN CAN协议一样,这里就不详细说了。
 
图17.

      数 据 帧 的 A R B I T R A T I O N F I E L D 数据帧的ARBITRATION\quad FIELD ARBITRATIONFIELD:四种格式的可视化图如图18和图19所示。基本格式和扩展格式的 A R B I T R A T I O N F I E L D ARBITRATION\quad FIELD ARBITRATIONFIELD是不同的,这个在 2.0 2.0 2.0版本的 C A N CAN CAN协议也是这个情况。如果单独来看基本格式和扩展格式, C A N f o r m a t CAN\quad format CANformat C A N F D f o r m a t CAN\quad FD\quad format CANFDformat只有一个比特位不同,分别如图18和图19所示,也就是 C A N f o r m a t CAN\quad format CANformat中原来的 R T R RTR RTR比特位在 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat中成了一个保留的比特位 r 1 r1 r1该位为显性比特位0

  • I D E IDE IDE比特位:在扩展帧格式中属于 A R B I T R A T I O N F I E L D ARBITRATION\quad FIELD ARBITRATIONFIELD,在基本帧格式中属于 C O N T R O L F I E L D CONTROL\quad FIELD CONTROLFIELD 。它用来区分基本帧格式, I D E N T I F I E R IDENTIFIER IDENTIFIER为11位,和扩展帧格式, I D E N T I F I E R IDENTIFIER IDENTIFIER为29位。在基本帧格式中该位为显性比特位0,在扩展帧格式中该位为隐性比特位1。
  • S R R SRR SRR比特位:该比特位为隐性比特位1。它只存在于扩展帧格式中,它的位置取代了 2.0 2.0 2.0版本的 C A N CAN CAN协议中的 A A A版本的 A R B I T R A T I O N F I E L D ARBITRATION\quad FIELD ARBITRATIONFIELD R T R RTR RTR比特位,因此它的全称是 S U B S T I T U T E R E M O T E R E Q U E S T SUBSTITUTE\quad REMOTE\quad REQUEST SUBSTITUTEREMOTEREQUEST,也就是取代远程请求,这个我之前在 2.0 2.0 2.0版本的 C A N CAN CAN协议中的 B B B版本中也已经讲过了。当一个基本格式的帧和扩展格式的帧同时存在于网络中的时候,如果基本帧格式的 I D E N T I F I E R IDENTIFIER IDENTIFIER和扩展帧格式的前11个 I D E N T I F I E R IDENTIFIER IDENTIFIER比特位值相同,这时因为扩展帧格式的 S R R SRR SRR比特位为隐性比特位1,基本格式的 C A N f o r m a t CAN\quad format CANformat数据帧的 R T R RTR RTR比特位为性比特位0,或者基本格式的 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat数据帧的 r 1 r1 r1比特位也为性比特位0,这样就会是基本帧格式的节点取得总线的发送权。
  • R T R RTR RTR比特位:它仅仅存在于 C A N f o r m a t CAN\quad format CANformat的帧中,在数据帧中该位为显性比特位0,在远程帧中该位为隐性比特位1。在 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat的帧中该位为一个保留位 r 1 r1 r1该位为显性比特位0。在 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat的帧中没有 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME
 
图18.
 
图19.

      数 据 帧 的 C O N T R O L F I E L D 数据帧的CONTROL\quad FIELD CONTROLFIELD:从图18和图19可以看出,四种帧格式的 C O N T R O L F I E L D CONTROL\quad FIELD CONTROLFIELD有较大区别:

  • C A N B A S E F O R M A T CAN\quad BASE\quad FORMAT CANBASEFORMAT,由 I D E IDE IDE比特位, r 0 r0 r0比特位和4个比特位长度的 D L C , D a t a L e n g t h C o d e DLC,Data Length Code DLC,DataLengthCode组成。
  • C A N E X T E N D E D F O R M A T CAN\quad EXTENDED\quad FORMAT CANEXTENDEDFORMAT,由 I D E IDE IDE比特位, E D L EDL EDL比特位, r 0 r0 r0比特位, B R S BRS BRS比特位, E S I ESI ESI比特位比特位,和4个比特位长度的 D L C , D a t a L e n g t h C o d e DLC,Data Length Code DLC,DataLengthCode组成。
  • C A N F D B A S E F O R M A T CAN\quad FD\quad BASE\quad FORMAT CANFDBASEFORMAT,由$ r 1 r1 r1比特位, r 0 r0 r0比特位和4个比特位长度的 D L C , D a t a L e n g t h C o d e DLC,Data Length Code DLC,DataLengthCode组成。
  • C A N F D E X T E N D E D F O R M A T CAN\quad FD\quad EXTENDED\quad FORMAT CANFDEXTENDEDFORMAT,由 E D L EDL EDL比特位, r 0 r0 r0比特位, B R S BRS BRS比特位, E S I ESI ESI比特位比特位,和4个比特位长度的 D L C , D a t a L e n g t h C o d e DLC,Data Length Code DLC,DataLengthCode组成。
    • E D L EDL EDL比特位,该比特位只存在于 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的数据帧中,它用来区别 C A N f o r m a t CAN\quad format CANformat格式的数据帧和 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的数据帧。它是比特位值为1的隐性比特位。在 C A N f o r m a t CAN\quad format CANformat格式的帧中 E D L EDL EDL比特位后面跟随的永远都是比特位值为0的显性比特位 r 0 r0 r0,这个 r 0 r0 r0比特位是为了保留给未来扩展使用。
  • B R S , B I T R A T E S W I T C H BRS,BIT\quad RATE\quad SWITCH BRS,BITRATESWITCH比特位,该比特位只存在于 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的数据帧中,该比特位用来决定在于 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的数据帧中比特速率是否应该进行切换。如果这个比特位的值为隐性比特位1,则表示比特速率应已经从 A R B I T R A T I O N ARBITRATION ARBITRATION阶段的标准比特速率切换到数据阶段的预先配置的可选的比特速率。如果这个比特位的值为显性比特位0,则表示比特速率没有切换。
  • E S I , E R R O R S T A T E I N D I C A T O R ESI,ERROR\quad STATE\quad INDICATOR ESI,ERRORSTATEINDICATOR比特位,对于处于 E r r o r A c t i v e Error\quad Active ErrorActive状态的节点,针对该比特位,它会发送显性的比特位,对于处于 E r r o r P a s s i v e Error\quad Passive ErrorPassive状态的节点,针对该比特位,它会发送隐性的比特位。该比特位只存在于 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的数据帧中。
  • 保留的比特位 r 0 r0 r0 r 1 r1 r1都是作为显性比特位发送的,但是对于接收方这两个比特位为显性或隐性都可以。如果在接收方看到 S R R SRR SRR比特位是显性的比特位也是可以的。
  • D L C , D a t a L e n g t h C o d e DLC,Data\quad Length\quad Code DLC,DataLengthCode:它表示中 D a t a F i e l d Data\quad Field DataField的字节数据的个数。这一部分和 2.0 2.0 2.0版本的 C A N CAN CAN协议还是有很大区别的,最明显的区别就是 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的数据帧可以支持超过发送8个字节数据的帧,但是 C A N f o r m a t CAN\quad format CANformat格式的数据帧最多只能发送8个字节的数据。具体的含义如图20所示。
 
图20.

      数 据 帧 的 D A T A F I E L D 数据帧的DATA\quad FIELD DATAFIELD:在 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的数据帧中可以有0到64个字节数据,但是 C A N f o r m a t CAN\quad format CANformat格式的数据帧只可以有0到8个字节数据。在发送每个8比特字节数据的时候 M S B MSB MSB最先发送,当 D a t a F i e l d Data\quad Field DataField中的值为0或者是 R E M O T E F R A M E REMOTE\quad FRAME REMOTEFRAME时,没有 D A T A F I E L D DATA\quad FIELD DATAFIELD
      数 据 帧 的 C R C F I E L D 数据帧的CRC\quad FIELD CRCFIELD:它由 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE和紧接着的比特位值为1的一个或两个隐性的比特位 C R C D E L I M I T E R CRC\quad DELIMITER CRCDELIMITER组成。如图21所示。这里和 2.0 2.0 2.0版本的 C A N CAN CAN协议中的 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE不同的是,它这里在生成 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE的时候使用了不同的发生器多项式。

  • 对于 C A N f o r m a t CAN\quad format CANformat格式的帧使用的发生器多项式为 C R C _ 15 CRC\_15 CRC_15,多项式的具体定义见官方文档。此时 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE位15个比特位。
  • 对于 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的帧且 D a t a F i e l d Data\quad Field DataField中最多只有16个字节数据的时候使用的发生器多项式为 C R C _ 17 CRC\_17 CRC_17,多项式的具体定义见官方文档。此时 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE位17个比特位。
  • 对于 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的帧且 D a t a F i e l d Data\quad Field DataField中数据字节的个数大于16的时候使用的发生器多项式为 C R C _ 21 CRC\_21 CRC_21,多项式的具体定义见官方文档。此时 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE位21个比特位。

     在一个帧的开始,发送者都会同时基于以上三种多项式发生器来计算三种 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE,赢得仲裁二获得总线发送权限的节点最后会根据 E D L EDL EDL比特位和 D a t a F i e l d Data\quad Field DataField来决定发送哪一个 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE。接收者会比较简单一点它主要是考虑选择哪一种发生器多项式来检验接收的数据是否有误。参与 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE计算的有 - S T A R T O F F R A M E START\quad OF\quad FRAME STARTOFFRAME A R B I T R A T I O N F I E L D ARBITRATION\quad FIELD ARBITRATIONFIELD C O N T R O L F I E L D CONTROL\quad FIELD CONTROLFIELD D A T A F I E L D ( 如 果 有 的 话 ) DATA\quad FIELD(如果有的话) DATAFIELD 。在 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的帧中由于比特填充规则而加入的比特位也被用于 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE的计算,但是在 C A N f o r m a t CAN\quad format CANformat格式的帧中由于比特填充规则而加入的比特位没有被用于 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE的计算。

 
图21.

      C R C D E L I M I T E R CRC\quad DELIMITER CRCDELIMITER,在 C A N f o r m a t CAN\quad format CANformat格式的帧中,它是一个比特值为1的隐性比特位,在 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的帧中, C R C D E L I M I T E R CRC\quad DELIMITER CRCDELIMITER可能由一个或两个比特值为1的隐性比特位组成。发送者应当仅仅发送一个比特值为1的隐性比特位作为 C R C D E L I M I T E R CRC\quad DELIMITER CRCDELIMITER,但是它应该在隐性到显性的下降沿(在这个边沿开始发送 A C K S l o t ACK\quad Slot ACKSlot)之前接收两个比特值为1的隐性比特位。接收者在第一个比特值为1的隐性比特位之后开始发送 A C K ACK ACK位。前面也提到过 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的帧支持两种不同的比特率,在 A r b i t r a t i o n P h a s e Arbitration\quad Phase ArbitrationPhase阶段和 D a t a P h a s e Data\quad Phase DataPhase阶段具有不同的比特率, C A N F D CAN\quad FD CANFD协议的控制器当到达 C R C D E L I M I T E R CRC\quad DELIMITER CRCDELIMITER的第一个比特位的采样点的时候从 D a t a P h a s e Data\quad Phase DataPhase阶段切换回 A r b i t r a t i o n P h a s e Arbitration\quad Phase ArbitrationPhase阶段。如图22所示。

 
图22.

           数 据 帧 的 A C K F I E L D 数据帧的ACK\quad FIELD ACKFIELD:它包含 A C K S L O T ACK\quad SLOT ACKSLOT A C K D E L I M I T E R ACK\quad DELIMITER ACKDELIMITER,发送者在 A C K F I E L D ACK\quad FIELD ACKFIELD里面只发送比特值为1的隐性比特位。接收者接收到正确有效的帧之后通过在 A C K S L O T ACK\quad SLOT ACKSLOT的开始发送一个显性的比特位来通知发送者。
          在 C A N CAN CAN网络中节点之间的相移被定义为发送接收器的延迟时间和 C A N CAN CAN网络中的传播时间。相移在 C A N CAN CAN C A N F D CAN\quad FD CANFD中是一样的,但是比特时间越小相移越大且这是成比例的。 C A N CAN CAN网络中的所有接收者基于它们和发送者之间在网络间的距离的不同,这些接收者和发送者之间的相移也是不同的,因为它们看到发送者的信号边缘时间是不同的。当从较快的比特速率切换回较慢的比特速率的时候,为了补偿这些相移,在开始发送 A C K S l o t ACK\quad Slot ACKSlot的边缘(隐性比特位到显性比特位的边缘)的之前或之后允许一个额外的比特时间。
      A C K S L O T ACK\quad SLOT ACKSLOT,所有接收到消息且 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE校验正确的节点在 A C K S L O T ACK\quad SLOT ACKSLOT里面通过发送一个显性的比特位来压制发送器发送的隐性比特位,通过这样的方式接收者向发送者报告接收的数据是否正确。在 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的帧中。所有节点应该可以接受两个比特位时间长度的显性 A C K ACK ACK位的重叠作为有效的 A C K ACK ACK位,这是为了补偿接收节点之间的相移。在 C A N f o r m a t CAN\quad format CANformat格式的帧中,跟随在一个单个比特位的 A C K S L O T ACK\quad SLOT ACKSLOT后面的显性比特位被当做帧格式错误。 A C K D E L I M I T E R ACK\quad DELIMITER ACKDELIMITER 2.0 2.0 2.0版本的 C A N CAN CAN协议一样。

      C A N F D 协 议 的 R E M O T E F R A M E CAN\quad FD协议的REMOTE\quad FRAME CANFDREMOTEFRAME:前面也提到了, C A N F D 协 议 CAN\quad FD协议 CANFD的远程帧都是继承的 2.0 2.0 2.0版本的 C A N CAN CAN协议中的 C A N f o r m a t CAN\quad format CANformat格式的远程帧,远程帧没有 D A T A F I E L D DATA\quad FIELD DATAFIELD,它的 C O N T R O L F I E L D CONTROL\quad FIELD CONTROLFIELD里面的 D L C DLC DLC是希望接收到的数据帧里面的 D A T A F I E L D DATA\quad FIELD DATAFIELD中字节数据的个数,它的 I D E N T I F I E R IDENTIFIER IDENTIFIER也是向它发送数据帧的节点发送的数据帧的 I D E N T I F I E R IDENTIFIER IDENTIFIER。至于远程帧里面的数据段的定义参考上面的数据帧就可以了。
      C A N F D 协 议 的 E R R O R F R A M E CAN\quad FD协议的ERROR\quad FRAME CANFDERRORFRAME:这里和 2.0 2.0 2.0版本的 C A N CAN CAN协议中的错误帧基本一样,这里就不多讲了。
      C A N F D 协 议 的 O V E R L O A D F R A M E CAN\quad FD协议的OVERLOAD\quad FRAME CANFDOVERLOADFRAME:这里和 2.0 2.0 2.0版本的 C A N CAN CAN协议中的过载帧基本一样,这里就不多讲了。
      C A N F D 协 议 的 I N T E R F R A M E S P A C E CAN\quad FD协议的INTERFRAME\quad SPACE CANFDINTERFRAMESPACE:这里和 2.0 2.0 2.0版本的 C A N CAN CAN协议中的帧间间隔基本一样,这里就不多讲了。
      C A N F D 协 议 的 节 点 操 作 模 式 CAN\quad FD协议的节点操作模式 CANFD:一个 C A N F D CAN\quad FD CANFD协议的节点处于以下四种操作模式中的一种:

  • i n t e g r a t i n g integrating integrating,在开启控制器之后或者在故障界定的 b u s _ o f f bus\_off bus_off状态,此时节点会等待11个连续的隐性比特位,然后切换到 i d l e idle idle状态。
  • i d l e idle idle,这是准备好发送 S T A R T O F F R A M E START\quad OF\quad FRAME STARTOFFRAME的状态,然后切换到 t r a n s m i t t e r transmitter transmitter或者 r e c e i v e r receiver receiver状态。
  • r e c e i v e r receiver receiver,此时一个节点在监测总线的活动且不是 t r a n s m i t t e r transmitter transmitter
  • t r a n s m i t t e r transmitter transmitter,此时一个节点正在发送消息,一个节点会保持 t r a n s m i t t e r transmitter transmitter的状态直到总线状态为 i d l e idle idle或仲裁失败。

     接上,总线监控模式,在这种模式下, C A N F D CAN\quad FD CANFD节点可以发送和接收有效的数据帧和远程帧,但是不能发送帧,它只能在总线上发送隐性的比特位。If the CAN FD protocol controller is required to send a dominant bit (ACK SLOT, OVERLOAD FLAG, ACTIVE ERROR FLAG), the bit is rerouted internally so that the CAN FD protocol controller monitors this dominant bit, although the CAN bus may remain in recessive state.
     接上,被限制的操作模式,在这种模式下, C A N F D CAN\quad FD CANFD节点可以发送和接收有效的数据帧和远程帧,也可以对有效的帧进行 A C K ACK ACK操作。但是它不能发送 A C T I V E E R R O R F R A M E ACTIVE\quad ERROR\quad FRAME ACTIVEERRORFRAME O V E R L O A D F R A M E OVERLOAD\quad FRAME OVERLOADFRAME,当碰到总线上的错误条件和过载条件的情况下,它不会发送显性的比特位,取而代之的是等待总线空闲的到来然后重新同步到总线通信。在这种情况下故障界定中的错误计数器不会改变。
      C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的帧在 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE位置的比特填充和2.0版本的CAN协议不一样:

  • C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE的第一个比特位之前填充一个比特位,填充的比特位的值和它前面的那个比特位的值相反。
  • 之后对于 C R C S E Q U E N C E CRC\quad SEQUENCE CRCSEQUENCE每四个比特位都要填充一个比特位,填充的比特位的值和它前面的那个比特位的值相反。

      C A N F D CAN\quad FD CANFD节点在发送 E R R O R F L A G ERROR\quad FLAG ERRORFLAG时候,如果他此时处于 D A T A P H A S E DATA\quad PHASE DATAPHASE阶段的比特速率,bane它此时必须切换回 A R B I T R A T I O N P H A S E ARBITRATION\quad PHASE ARBITRATIONPHASE阶段的比特速率。
      C A N F D 协 议 的 比 特 时 序 CAN\quad FD协议的比特时序 CANFD C A N F D CAN\quad FD CANFD协议的一个比特时间的分段和 2.0 2.0 2.0版本的 C A N CAN CAN协议一样,不一样的是因为 C A N F D CAN\quad FD CANFD协议的 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat格式的帧在一个帧中的 A R B I T R A T I O N P H A S E ARBITRATION\quad PHASE ARBITRATIONPHASE阶段和 D A T A P H A S E DATA\quad PHASE DATAPHASE阶段支持两种不同的比特率,因此在这两个阶段需要两组不同的寄存器来分别配置这两个阶段的参数。我们可以将 A R B I T R A T I O N P H A S E ARBITRATION\quad PHASE ARBITRATIONPHASE阶段的比特时间称为 N O M I N A L B I T T I M E NOMINAL\quad BIT\quad TIME NOMINALBITTIME,将 D A T A P H A S E DATA\quad PHASE DATAPHASE阶段的比特时间称为 D A T A B I T T I M E DATA\quad BIT\quad TIME DATABITTIME
      C A N F D f o r m a t CAN\quad FD\quad format CANFDformat 格式的 D A T A F R A M E DATA\quad FRAME DATAFRAME直到 B R S BRS BRS比特位都用 N O M I N A L B I T T I M E NOMINAL\quad BIT\quad TIME NOMINALBITTIME比特速率传输。 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat 格式的 E R R O R F R A M E ERROR\quad FRAME ERRORFRAME A C K F I E L D ACK\quad FIELD ACKFIELD E N D O F F R A M E END\quad OF\quad FRAME ENDOFFRAME O V E R L O A D F R A M E OVERLOAD\quad FRAME OVERLOADFRAME C A N f o r m a t CAN\quad format CANformat格式的所有帧用 N O M I N A L B I T T I M E NOMINAL\quad BIT\quad TIME NOMINALBITTIME比特速率传输。如果 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat 格式的帧的 B R S BRS BRS比特位为隐性比特位,其它的部分按 D A T A B I T T I M E DATA\quad BIT\quad TIME DATABITTIME比特速率传输,如果 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat 格式的帧的 B R S BRS BRS比特位为显性比特位,其它的部分按还是按照 N O M I N A L B I T T I M E NOMINAL\quad BIT\quad TIME NOMINALBITTIME比特速率传输。在这两种不同的比特速率下,其对应的两组配置寄存器中配置的时间单位 Q u a n t u m Quantum Quantum也是不同的,一个比特位的时间分段内各个段所占的时间单位 Q u a n t u m Quantum Quantum的个数也是不同的。比特率的切换发生在 C O N T R O L F i e l d CONTROL\quad Field CONTROLField B R S BRS BRS比特位的采样点或 C R C F i e l d CRC\quad Field CRCField C R C D e l i m i t e r CRC\quad Delimiter CRCDelimiter的采样点。这样就会导致 B R S BRS BRS比特位在采样点之前的时间属于 N O M I N A L B I T T I M E NOMINAL\quad BIT\quad TIME NOMINALBITTIME,采样点之后的时间属于 D A T A B I T T I M E DATA\quad BIT\quad TIME DATABITTIME C R C D e l i m i t e r CRC\quad Delimiter CRCDelimiter在采样点之前的时间属于 D A T A B I T T I M E DATA\quad BIT\quad TIME DATABITTIME,采样点之后的时间属于 N O M I N A L B I T T I M E NOMINAL\quad BIT\quad TIME NOMINALBITTIME,此时 B R S BRS BRS比特位的时间和 C R C D e l i m i t e r CRC\quad Delimiter CRCDelimiter的时间应该是一个 N O M I N A L B I T T I M E NOMINAL\quad BIT\quad TIME NOMINALBITTIME加上一个 D A T A B I T T I M E DATA\quad BIT\quad TIME DATABITTIME
     收发器延迟补偿 ( T R A N S C E I V E R D E L A Y C O M P E N S A T I O N ) (TRANSCEIVER\quad DELAY\quad COMPENSATION) (TRANSCEIVERDELAYCOMPENSATION):如果没有收发器延迟补偿的话,一个 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat 格式的帧在 D A T A P H A S E DATA\quad PHASE DATAPHASE阶段的比特率会被限制,这是因为如下事实:一个发送器如果不能在它发送的比特位的采样点监测到它发送的比特位的,这个发送器会报比特错误。 C A N F D CAN\quad FD CANFD节点应该支持一个可选的收发器延迟补偿机制。这个机制主要用在 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat 格式的帧 D A T A P H A S E DATA\quad PHASE DATAPHASE阶段的一个比特的时间小于收发器内部延迟时间的限制的情况下。
     收发器延迟补偿机制定义了一个二级采样点 ( S E C O N D A R Y S A M P L E P O I N T ) (SECONDARY\quad SAMPLE\quad POINT) (SECONDARYSAMPLEPOINT),在这个位置一个发送器比较它发送的比特位和它监测到的自己发送的该比特位的值来判断是否有比特错误。这种机制仅仅只是发送者在一个 C A N F D f o r m a t CAN\quad FD\quad format CANFDformat 格式的帧 D A T A P H A S E DATA\quad PHASE DATAPHASE阶段使用。当使用这种机制的时候,发送者应该忽视在采样点 ( S A M P L E P O I N T ) (SAMPLE\quad POINT) (SAMPLEPOINT)监测到的比特位的值。The delay to be compensated, TRV_DELAY, shall be measured in each
transmitted frame at the edge from the EDL bit to the following reserved bit r0, between the edge of the transmitted bit and the edge of the received bit.
     二级采样点的位置应该是 T R V _ D E L A Y TRV\_DELAY TRV_DELAY再加上一个补偿 o f f s e t offset offset,比如 D A T A P H A S E DATA\quad PHASE DATAPHASE阶段的一个比特时间的一半,这个计算出来的值用该取整到时间单位 T I M E Q U A N T A TIME\quad QUANTA TIMEQUANTA。The resulting SECONDARY SAMPLE POINT may be placed after the end of the transmitted bit. If a BIT-ERROR is detected at the SECONDARY SAMPLE POINT, the Transmitter will react to this BIT-ERROR at the next following SAMPLE POINT.
     一个处 D A T A P H A S E DATA\quad PHASE DATAPHASE阶段且正在发送的 C A N F D CAN\quad FD CANFD节点不会进行再同步。
/* ====================================分割线 ======================================= */

     下面来讲一下 C A N CAN CAN总线协议的物理组织:节点,网络拓扑,物理接线,也就是物理层的东西。最新的 I S O − 11898 − 2 − 2016 ISO-11898-2-2016 ISO1189822016覆盖了高速(最高 5 M B i t / s 5MBit/s 5MBit/s)物理层,最新的 I S O − 11898 − 3 − 2006 ISO-11898-3-2006 ISO1189832006覆盖了低速(最高 125 K B i t / s 125KBit/s 125KBit/s)速物理层,但是下面的讲解我没有去详细阅读者两个文档,因为我对硬件的东西比较头疼,因此下面的讲解来源于维基百科和其它网络资料。
     图23对应于 11898 − 2 11898-2 118982,图24对应于 11898 − 3 11898-3 118983,图23和图24来至于维基百科。这里 C A N CAN CAN总线使用差分信号来表示比特位的0 ( D o m i n a n t S t a t e ) (Dominant\quad State) (DominantState)和1 ( R e c e s s i v e S t a t e ) (Recessive\quad State) (RecessiveState),也就是使用两根信号线 C A N _ H CAN\_H CAN_H C A N _ L CAN\_L CAN_L,通过这两根信号线上面的电压差值来判断传输的是比特位值是0( C A N _ H > C A N _ L CAN\_H>CAN\_L CAN_H>CAN_L)还是1( C A N _ H < = C A N _ L CAN\_H<=CAN\_L CAN_H<=CAN_L)。下文中提到的 c h a r a c t e r i s t i c i m p e d a n c e characteristic\quad impedance characteristicimpedance t e r m i n a t i o n r e s i s t a n c e termination\quad resistance terminationresistance具有使总线回到 ( R e c e s s i v e S t a t e ) (Recessive\quad State) (RecessiveState)的功能,也有抗干扰的功能吧,不过这里应该属于是硬件的部分了,这里我就不懂了,有想详细了解这部分内容的可以自己查一下资料。

  • 11898-2:这一部分规定只在网络拓扑的两端有 c h a r a c t e r i s t i c i m p e d a n c e characteristic\quad impedance characteristicimpedance,大小为120欧姆。当发送 ( D o m i n a n t S t a t e ) (Dominant\quad State) (DominantState)的时候 C A N _ H CAN\_H CAN_H 3.5 V 3.5V 3.5V左右, C A N _ L CAN\_L CAN_L 1.5 V 1.5V 1.5V左右。当不发送 ( D o m i n a n t S t a t e ) (Dominant\quad State) (DominantState)的时候,总线的状态会被 c h a r a c t e r i s t i c i m p e d a n c e characteristic\quad impedance characteristicimpedance自动拉回到 ( R e c e s s i v e S t a t e ) (Recessive\quad State) (RecessiveState),也就是压差为0的状态。如图25所示。
  • 11898-3:这一部分规定在每一个网络节点都有 t e r m i n a t i o n r e s i s t a n c e termination\quad resistance terminationresistance,但是所有节点的 t e r m i n a t i o n r e s i s t a n c e termination\quad resistance terminationresistance加起来应该接近100欧姆,但是不能小于100欧姆。当发送 ( D o m i n a n t S t a t e ) (Dominant\quad State) (DominantState)的时候 C A N _ H CAN\_H CAN_H s u p p l y n v o l t a g e ( 5 V o r 3.3 V ) supply\quad nvoltage (5 V or 3.3 V) supplynvoltage(5Vor3.3V)左右, C A N _ L CAN\_L CAN_L 0 V 0V 0V左右。当不发送 ( D o m i n a n t S t a t e ) (Dominant\quad State) (DominantState)的时候, C A N _ H CAN\_H CAN_H 0 V 0V 0V左右, C A N _ L CAN\_L CAN_L 5 V 5V 5V左右。如图26所示。
 
图23.
 
图24.
 
图25.
 
图26.

     下面来介绍一下 C A N CAN CAN总线中的节点的结构,如图27所示。节点控制器( C A N C o n t r o l l e r CAN\quad Controller CANController)一般集成在节点中央处理器( M i c r o c o n t r o l l e r Microcontroller Microcontroller或者微控制器)中。比如温度传感器通过以下介绍的三部分连接到 C A N CAN CAN总线网络之后一般用来向网络发送消息。类似于电机驱动器的设备我想一般在通过以下介绍的三部分连接到 C A N CAN CAN总线网络之后一般用来接收网络的消息来对某些单元进行运动控制。

  • 节点收发器( C A N T r a n s c e i v e r CAN\quad Transceiver CANTransceiver),它主要对应于物理层:
    • 接收器:它将总线上的压差信号转换为节点控制器( C A N C o n t r o l l e r CAN\quad Controller CANController)可以识别为是比特位值0或比特位值1的信号。
    • 发送器:它将节点控制器( C A N C o n t r o l l e r CAN\quad Controller CANController)发出的比特位值0或比特位值1的信号转换为总线上的压差信号。
  • 节点控制器( C A N C o n t r o l l e r CAN\quad Controller CANController),它主要对应于数据链路层:
    • 接收:它接收来至于节点收发器的比特位值数据并存储,等到接收完一个完整的消息帧之后就通知微控制器来对消息做进一步的处理。
    • 发送:它将微控制器发送给它的消息帧按顺序串行的一个比特一个比特的发送给节点收发器。
  • 节点中央处理器( M i c r o c o n t r o l l e r Microcontroller Microcontroller或者微控制器),它主要对应于应用层:该部分主要决定接收以及发送什么样的消息。
 
图27.

/* ====================================分割线 ======================================= */
     下面我将在正点原子的 S T M 32 F 103 STM32F103 STM32F103精英板上跑一跑 C A N CAN CAN的实际通信的 D E M O DEMO DEMO,这里要说明以下的是 S T M 32 F 103 STM32F103 STM32F103不支持最新的 C A N F D CAN\quad FD CANFD协议,它只支持上面讲到的 B O S C H BOSCH BOSCH公司的 2.0 2.0 2.0版本的 A . B A.B A.B版本的协议,也就是说只支持版本较老的 11898 11898 11898协议。目前一些较新的芯片是支持 C A N F D CAN\quad FD CANFD协议的,如图28所示。图28的 S T M 32 STM32 STM32的文档简单的介绍了一下 C A N F D CAN\quad FD CANFD协议,也说明了目前 S T M STM STM公司支持 C A N F D CAN\quad FD CANFD协议的芯片有哪些。因此这里的 D E M O DEMO DEMO也只是跑一跑基本的 B O S C H BOSCH BOSCH公司的 2.0 2.0 2.0版本的 A . B A.B A.B版本的协议通信。

 
图28.

     在跑程序之前,我们先来简单的看一下 S T M 32 F 103 STM32F103 STM32F103精英板上和 C A N CAN CAN的有关的硬件连接,如图29所示。从图29可以看出如果要进行 C A N CAN CAN通信,这里除了要有 M C U MCU MCU之外还必须要有一个辅助通信的芯片,这个芯片就是我们在图27中的 C A N T r a n s c e i v e r CAN\quad Transceiver CANTransceiver,这里 S T M 32 F 103 STM32F103 STM32F103精英板上使用的 C A N T r a n s c e i v e r CAN\quad Transceiver CANTransceiver芯片是 T J A 1050 TJA1050 TJA1050。至于引脚的连接的含义就比较清楚了,这里虽然 C A N CAN CAN总线使用两根信号线的差分信号来传输一路信号,但是从图29可以看出 M C U MCU MCU C A N CAN CAN模块还是有分开的发送和接收数据的引脚 T X TX TX R X RX RX。然后就是这的 D E M O DEMO DEMO应该是高速模式,所以它这里加了 120 120 120欧姆的电阻。

 
图29.

     下面我们直接上代码,下面我只贴出了主函数的代码,完整的工程代码在这里,这里的代码是参照正点原子的 S T M 32 F 103 STM32F103 STM32F103精英板的 C A N CAN CAN实验工程代码,我这里只是做了一个简单的修改。这里就是简单的一个 C A N CAN CAN节点发送消息,另一个 C A N CAN CAN节点接收消息。这里和协议文档中的介绍不同的是,芯片在实现 C A N CAN CAN协议的时候把 p r o p a g a t i o n t i m e s e g m e n t ( P r o p _ S e g ) propagation\quad time\quad segment (Prop\_Seg) propagationtimesegment(Prop_Seg) p h a s e b u f f e r s e g m e n t 1 ( P h a s e _ S e g 1 ) phase\quad buffer\quad segment\quad 1 (Phase\_Seg1) phasebuffersegment1(Phase_Seg1)合成位一个时间段来进行配置,对应于下面代码中 C A N CAN CAN初始化函数 C A N _ M o d e _ I n i t CAN\_Mode\_Init CAN_Mode_Init中的参数 C A N _ B S 1 _ 9 t q CAN\_BS1\_9tq CAN_BS1_9tq(这里一共配置为9个时间单位 Q u a n t u m Quantum Quantum), p h a s e b u f f e r s e g m e n t 2 ( P h a s e _ S e g 2 ) phase\quad buffer\quad segment\quad 2 (Phase\_Seg2) phasebuffersegment2(Phase_Seg2)还是不变,对应于参数 C A N _ B S 2 _ 8 t q CAN\_BS2\_8tq CAN_BS2_8tq(这里配置为8个时间单位 Q u a n t u m Quantum Quantum)。因此一个比特位所占的总的时间单位 Q u a n t u m Quantum Quantum数为 1 + 8 + 9 = 18 1+8+9=18 1+8+9=18,这里加一的原因是 S t a r t O f F r a m e Start\quad Of\quad Frame StartOfFrame占一个时间单位 Q u a n t u m Quantum Quantum。前面也提到过了时间单位 Q u a n t u m Quantum Quantum是可以配置的,这里它是 S T M 32 F 103 STM32F103 STM32F103芯片的 C A N CAN CAN模块的 P C L K PCLK PCLK时钟周期的倍数,这个可以配置的倍数值对应于下面代码中 C A N CAN CAN初始化函数 C A N _ M o d e _ I n i t CAN\_Mode\_Init CAN_Mode_Init中的参数4(这里配置为4个 C A N CAN CAN模块的 P C L K PCLK PCLK时钟周期)。我这里的工程的 S T M 32 F 103 STM32F103 STM32F103芯片的 C A N CAN CAN模块的 P C L K PCLK PCLK 36 M H Z 36MHZ 36MHZ,因此这里 C A N CAN CAN通信的比特速率为 500 K 500K 500K,计算过程如图30所示。

#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"	 
#include "can.h" 
 

int main(void)
{	 
    u8 key;
	u8 index=0;
	u8 can_send_buffer[8]={0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA};
	u8 can_receive_buffer[8]={0,0,0,0,0,0,0,0};
	u8 status=0;
	u8 received_data_num=0;	  
	delay_init();	    	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	uart_init(115200);	 	
	LED_Init();		  	
	KEY_Init();				     
	CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_Normal);
    printf("Can module communication test start.\r\n");	  	  
 	while(1)
	{
	    key=KEY_Scan(0);
	    if(key==KEY0_PRES)
	    {
	        status=Can_Send_Msg(can_send_buffer,8); 
            if(status==1)
		    {
			    printf("Data transmission failed.\r\n");
			}	
            else			
			{
			    printf("Data transmission success.\r\n");
			}								
	    }	   
        else
	    {
	        received_data_num=Can_Receive_Msg(can_receive_buffer);		
            if(received_data_num!=0)
			{
			    printf("The received data bytes is:.\r\n");	
                while(index<received_data_num)		
				{
				    printf("can_receive_buffer[%d]=%d.\r\n",index,can_receive_buffer[index]);	
                    index++;									 
				}	
                index=0;	
                can_receive_buffer[0]=0;	
                can_receive_buffer[1]=0;		
                can_receive_buffer[2]=0;		
                can_receive_buffer[3]=0;		
                can_receive_buffer[4]=0;		
                can_receive_buffer[5]=0;		
                can_receive_buffer[6]=0;		
                can_receive_buffer[7]=0;										 
		    }							 
        }
    }
}
 
图30.

     我这里在通信的时候使用的是扩展帧格式,也就是 29 29 29个比特的 I D E N T I F I E R IDENTIFIER IDENTIFIER,图31为通过逻辑分析仪捕获的一个数据帧,这里只发送了一个实际的数据帧。图中有红色叉叉的地方就是比特填充,这里的逻辑分析仪无法识别比特填充。图32为测试的硬件连接图,一共接了两根地线,然后是 C A N _ H I G H CAN\_HIGH CAN_HIGH C A N _ L O W CAN\_LOW CAN_LOW

 
图31.
 
图32.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qqssss121dfd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值