通信协议-CAN总线

首先了解一下,什么是通信?

通信是指两个对象之间能够进行信息的数据传输。

通信的两个对象是指什么呢?

如果不谈具体的领域,通信的两个对象可以是想要完成信息交换的任何对象。但是今天我们聚焦于汽车领域,我们所谈的对象是汽车内需要进行数据传输的各种ECU,更具体一点,是其内部的CPU,即通信为CPU与CPU之间的数据传输

什么是协议?

通常我们将通信与协议组成一个词来读,即:通信协议,那什么是通信协议呢?通信协议可以理解为两个对象想要完成数据交换,必须要遵守的规则。协议规定了数据从产生到接收所经历的历程以及中途必须要遵守的规则。

OSI七层网络通信模型

OSI(Open System Interconnection)开放系统互联模型,它是由ISO国际标准组织提出的概念模型,它将计算机网络体系结构划分为七层,每层都可以提供抽象良好的接口。它描述了两个主机之间(或者两个CPU之间)如果完成数据传输,所要经过的历程。
通信协议-CAN总线_第1张图片

物理层

物理层负责最后将信息编码成电流脉冲或其它信号用于网上传输。它由计算机和网络介质之间的实际界面组成,可定义电气信号、符号、线的状态和时钟要求、数据编码和数据传输用的连接器。

数据链路层

数据链路层通过物理网络链路提供数据传输。不同的数据链路层定义了不同的网络和协
议特征,其中包括物理编址、网络拓扑结构、错误校验、数据帧序列以及流控:

  • 物理编址(相对应的是网络编址)定义了设备在数据链路层的编址方式;
  • 网络拓扑结构定义了设备的物理连接方式,如总线拓扑结构和环拓扑结构;
  • 错误校验向发生传输错误的上层协议告警;
  • 数据帧序列重新整理并传输除序列以外的帧;
  • 流控可延缓数据的传输,以使接收设备不会因为在某一时刻接收到超过其处理能力的信息流而崩溃。

数据链路层实际上由两个独立的部分组成,介质存取控制(Media Access Control,MAC)和逻辑链路控制层(Logical Link Control,LLC)

  • MAC 描述在共享介质环境中如何进行调度、发送和接收数据。MAC 确保信息跨链路的可靠传输,对数据传输进行同步,识别错误和控制数据的流向。一般地讲,MAC 只在共享介质环境中才是重要的,只有在共享介质环境中多个节点才能连接到同一传输介质上。IEEE MAC 规则定义了地址,以标识数据链路层中的多个设备。
  • 逻辑链路控制子层管理单一网络链路上的设备间的通信,IEEE 802.2 标准定义了 LLC。LLC 支持无连接服务和面向连接的服务,在数据链路层的信息帧中定义了许多域,这些域使得多种高层协议可以共享一个物理数据链路。
网络层

网络层负责在源和终点之间建立连接,它一般包括网络寻址,还可能包括流量控制、错误检查等。
相同 MAC 标准的不同网段之间的数据传输一般只涉及到数据链路层,而不同的 MAC标准之间的数据传输都涉及到网络层。网络层使不同类型的数据网络能够实现互联。

传输层

传输层向高层提供可靠的端到端的网络数据流服务。传输层的功能一般包括流控、多路传输、虚电路管理及差错校验和恢复:

  • 流控管理着设备之间的数据传输,确保传输端不发送比接收端处理能力大的数据;
  • 多路传输使得多个应用程序的数据可以传输到一个物理链路上;
  • 虚电路由传输层建立、维护和终止;
  • 差错校验包括为检测传输错误而建立的各种不同结构;
  • 而差错恢复包括所采取的行动(如请求数据重发),以便解决发生的任何错误。
会话层

会话层建立、管理和终止表示层与实体之间的通信会话。通信会话包括发生在不同网络应用层之间的服务请求和服务应答,这些请求与应答通过会话层的协议实现。它还包括创建检查点,使通信发生中断的时候可以返回到以前的一个状态。

表示层

表示层提供多种功能用于应用层数据的编码和转化,以确保以一个系统应用层发送的信息可以被另一个系统应用层识别。表示层的编码和转化模式包括公用数据表示格式、性能转化表示格式、公用数据压缩模式和公用数据加密模式:

  • 公用数据表示格式就是标准的图像、声音和视频格式。通过使用这些标准格式,不同类型的计算机系统可以相互交换数据;
  • 转化模式通过使用不同的文本和数据表示,在系统间交换信息,例如 ASCII 码(American Standard Code for Information Interchange,美国标准信息交换码);
  • 标准数据压缩模式确保原始设备上被压缩的数据可以在目标设备上正确的解压;
  • 加密模式确保原始设备上加密的数据可以在目标设备上正确地解密。
应用层

应用层是最接近终端用户的 OSI 层,这就意味着 OSI 应用层与用户之间是通过应用软件直接相互作用的。应用层并非由计算机上运行的实际应用软件组成,而是由向应用程序提供访问网络资源的 API(Application Program Interface,应用程序接口)组成,应用软件程序已经超出了 OSI 模型的范畴。应用层的功能一般包括标识通信伙伴、定义资源的可用性和同步通信。因为可能丢失通信伙伴,应用层必须为传输数据的应用子程序定义通信伙伴的标识和可用性。定义资源可用性时,应用层为了请求通信而必须判定是否有足够的网络资源。在同步通信中,所有应用程序之间的通信都需要应用层的协同操作。

可以说OSI开放系统互联模型定义了通信双方之间的所有历程,但是这是在非常理想的情况下。而现实中,很少有一个协议可以完整的覆盖OSI模型,基本都是覆盖其中一部分。而此次我们所要讲述的CAN总线只覆盖了OSI七层模型中的物理层和数据链路层(参考ISO 11898和ISO 11519)
通信协议-CAN总线_第2张图片

CAN总线通信机理

CAN总线的定义以及背景本文忽略(网上一搜一大堆),我们直接从运行机理讲起:
通信协议-CAN总线_第3张图片
如图上所示,其数据流向为:CPU——CAN控制器——CAN收发器——连接器(双绞线)

  • CPU:负责产生数据
  • CAN控制器:负责将CPU传输过来的数据加工成标准的数据格式,同时定义了数据传输的仲裁机制,错误校验以及过载通知等特点,是CAN协议的数据链路层
  • CAN收发器:将CAN控制器传输过来的信息编码(此信息编码已经由CAN控制器变为标准格式)转为电平信号,电平为差分信号,通过两根线之间的电压差表示逻辑0和1,是CAN协议的物理层
  • 连接器:CAN总线一般为双绞线,分CAN_H和CAN_L高低压线

其具体流程为:
发送时:CPU将二进制数据通过CAN控制器中定义好的接口发送给CAN控制器中的发送缓冲器(最多缓存3组数据),之后CAN核心模块会在发送缓冲器中拿取数据,对数据进行加工,生成CAN协议所规定的数据格式,之后将标准的数据格式发给CAN收发器,CAN收发器会按照规定将接收到的二进制信息编码转为对应的电平信号
接收时:CAN收发器会收到CAN总线上发送过来的电平信号,根据规定,将电平信号转化为对应的二进制编码,然后传给CAN核心模块,CAN核心模块会对接收到的数据进行解析,将其中ID信息,数据信息解析出来,之后通过过滤器对ID进行过滤,过滤器中定义了允许通过的ID或者ID组,之后将通过的ID所对应的数据传入到FIFO中,这是一个队列,先进先出,最先传进去的数据,最先被CPU拿取进行处理。

高速CAN和低速CAN

在通信机理的图中,可能会有小伙伴发现,是存在两条CAN总线的,一条为低速CAN,一条为高速CAN,这两者有什么区别呢?
正如其名称一样,在通信速率方面,一个传输速率低(最大125kbps),一个传输速率高(最大1Mbps),同样是CAN总线,为什么会有这样的区别呢?这是因为两个CAN协议(ISO 11898和ISO 11519)对物理层的定义不一样,也就是CAN收发器是不一样的,而CAN控制器是一样的,这就表示收到同样的信号编码,低速CAN和高速CAN所转化的电平信号是不一样的,同时电平的转化效率也是不一样的,这意味着同样时间内高速CAN可以进行更多次的电平转化,传输更多的数据。除了通信速率不一样外,高速CAN和低速CAN还存在一些其他差异,如下图:
通信协议-CAN总线_第4张图片

CAN协议的5种数据类型

上面我们仅仅是在物理层面对其进行了一个说明,但CAN协议最终的本质是数据的传输。那么CAN协议传输的数据是什么样的呢?在CAN协议中,根据作用不同,将数据分为5种数据类型,它们分别是:
通信协议-CAN总线_第5张图片

CAN协议的数据结构

通过上面我们知道了CAN协议中存在5种数据类型,分别有不同的作用。现在我们讲一讲每个数据类型的结构构成,在CAN总线中,只有满足这些结构的数据才能进行传输。

通信协议-CAN总线_第6张图片
在对每个数据类型的大体结构有了一些了解后,我们对数据结构再进行更深一步的详细解析:

数据帧

之前我们讲CAN控制器会将CPU传输过来的二进制数据转为标准格式,所说的标准格式就是数据帧,CAN控制器会在原始数据的基础上加上起始位,ID还有校验等信息,补充的信息都有一定的含义,详解见下图:
通信协议-CAN总线_第7张图片

遥控帧

遥控帧是用于接收单元向具有同样的ID的发送单元请求数据的帧。遥控帧结构和数据帧结构基本一样,唯一不同就是没有数据段,因此,设置了RTR位,用来区分遥控帧和没有数据段的数据帧。
通信协议-CAN总线_第8张图片

错误帧

错误帧是用于接收和发送消息时检测出错误,进行错误通知的帧。
通信协议-CAN总线_第9张图片
在CAN协议中,存在5种错误,只要触发这些错误,就会发送错误帧,此外多种错误可能同时发生。
通信协议-CAN总线_第10张图片
这里需要强调几个特例,它们虽然满足上述的错误描述,但并不会被视为对应的错误类型

1.位错误

  • 在仲裁段输出隐性电平,但检测出总线为显性电平时,将被视为仲裁失利,而不是位错误
  • 在仲裁段作为填充位输出隐性电平时,但检测出总线为显性电平时,将不视为位错误,而是填充错误
  • 发送单元在ACK段输出隐性电平,但检测到总线为显性电平时,将被视为其他单元的ACK应答,而非位错误
  • 输出被动错误标志(6个隐性位)但检测出显性电平时,将遵循错误标志的结束条件,等待检测出6个相同位的值(显性或隐性),并不视为位错误

2.格式错误

  • 即使接收单元检测出EOF(7个位的隐性位)的最后一位(第8个位)为显性电平,也不视为格式错误
  • 即使接收单元检测出数据长度码(DLC)中9-15的值,也不视为格式错误

我们上面讲述了错误的种类,即发送错误帧的条件,但触发了之后,什么时候开始发送错误帧呢?这里需要谈一下错误帧的时序
通信协议-CAN总线_第11张图片
在输出错误帧时,我们将错误标志分为主动错误标志和被动错误标志,它们发送的电平是不一样的,我们应当如何区分主动还是被动呢?在CAN协议中,对主动还是被动,是有明确的定义的,其原理是内置一个计数值,根据计数值的大小来划分:
通信协议-CAN总线_第12张图片
按照计数值的规则,总线除了主动错误和被动错误状态之外,还存在一种总线关闭态,这三者之间可以相互转化
通信协议-CAN总线_第13张图片
我们一直提计数的规则,那计数的规则又是什么呢?或者说TEC和REC是怎么算出来的呢?在CAN中每种错误都对应着固定的分数,触发此错误,就会在原有的基础上加上此错误所对应的分数
通信协议-CAN总线_第14张图片

过载帧

过载帧是接收单元向其他节点通知暂缓发送新报文的帧。
通信协议-CAN总线_第15张图片

帧间隔

帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间隔。
通信协议-CAN总线_第16张图片

CAN协议的特点

1.多主控制

在总线空闲状态下,所有单元都可开始发送消息。区别于主从机模式的总线,CAN总线中任何节点都没有绝对的控制权

2.消息发送(仲裁机制)

在总线空闲时,如果有多个节点同时发送数据,根据数据格式中的ID标识符进行仲裁比较,优先级高的ID节点可继续发送数据,优先级低的,也就是仲裁失利的ID节点则立刻停止发送,转为接收

3.总线的拓展性

与总线相连的节点没有类似“地址”的信息。因此,在总线增加新的节点时,连接在总线上的其他节点的软硬件和应用层都不需改变

4.通信速度

在同一条总线中,所有节点都必须设置为统一的通信速度

5.远程数据请求

可以通过遥控帧请求某个特定的节点发送数据

6.错误检测、通知、恢复

所有单元都可检测错误(错误检测)
检测出错误的单元会立即同时通知其他所有单元(错误通知)
正在发送消息的单元一旦检测到错误,会强制结束当前的发送。强制结束发送的单元会不断反复的重新发送此消息直到成功发送为止(错误恢复功能)

7.故障封闭

CAN可以判断错误类型是暂时性错误(如外部噪声)还是持续错误(如单元内部故障,驱动器故障,断线等)。当总线上发生持续错误时,可将引起此故障的单元从总线上隔离出去

8.连接

CAN总线可同时连接多个单元。连接的单元数理论上没有限制,但实际过程中会受到总线上时间延迟和电器负载的限制,连接数一般在30个左右,可改变通信速度进行调整。

你可能感兴趣的:(自动驾驶技术栈,经验分享)