通信是指两个对象之间能够进行信息的数据传输。
如果不谈具体的领域,通信的两个对象可以是想要完成信息交换的任何对象。但是今天我们聚焦于汽车领域,我们所谈的对象是汽车内需要进行数据传输的各种ECU,更具体一点,是其内部的CPU,即通信为CPU与CPU之间的数据传输
通常我们将通信与协议组成一个词来读,即:通信协议,那什么是通信协议呢?通信协议可以理解为两个对象想要完成数据交换,必须要遵守的规则。协议规定了数据从产生到接收所经历的历程以及中途必须要遵守的规则。
OSI(Open System Interconnection)开放系统互联模型,它是由ISO国际标准组织提出的概念模型,它将计算机网络体系结构划分为七层,每层都可以提供抽象良好的接口。它描述了两个主机之间(或者两个CPU之间)如果完成数据传输,所要经过的历程。
物理层负责最后将信息编码成电流脉冲或其它信号用于网上传输。它由计算机和网络介质之间的实际界面组成,可定义电气信号、符号、线的状态和时钟要求、数据编码和数据传输用的连接器。
数据链路层通过物理网络链路提供数据传输。不同的数据链路层定义了不同的网络和协
议特征,其中包括物理编址、网络拓扑结构、错误校验、数据帧序列以及流控:
数据链路层实际上由两个独立的部分组成,介质存取控制(Media Access Control,MAC)和逻辑链路控制层(Logical Link Control,LLC)
网络层负责在源和终点之间建立连接,它一般包括网络寻址,还可能包括流量控制、错误检查等。
相同 MAC 标准的不同网段之间的数据传输一般只涉及到数据链路层,而不同的 MAC标准之间的数据传输都涉及到网络层。网络层使不同类型的数据网络能够实现互联。
传输层向高层提供可靠的端到端的网络数据流服务。传输层的功能一般包括流控、多路传输、虚电路管理及差错校验和恢复:
会话层建立、管理和终止表示层与实体之间的通信会话。通信会话包括发生在不同网络应用层之间的服务请求和服务应答,这些请求与应答通过会话层的协议实现。它还包括创建检查点,使通信发生中断的时候可以返回到以前的一个状态。
表示层提供多种功能用于应用层数据的编码和转化,以确保以一个系统应用层发送的信息可以被另一个系统应用层识别。表示层的编码和转化模式包括公用数据表示格式、性能转化表示格式、公用数据压缩模式和公用数据加密模式:
应用层是最接近终端用户的 OSI 层,这就意味着 OSI 应用层与用户之间是通过应用软件直接相互作用的。应用层并非由计算机上运行的实际应用软件组成,而是由向应用程序提供访问网络资源的 API(Application Program Interface,应用程序接口)组成,应用软件程序已经超出了 OSI 模型的范畴。应用层的功能一般包括标识通信伙伴、定义资源的可用性和同步通信。因为可能丢失通信伙伴,应用层必须为传输数据的应用子程序定义通信伙伴的标识和可用性。定义资源可用性时,应用层为了请求通信而必须判定是否有足够的网络资源。在同步通信中,所有应用程序之间的通信都需要应用层的协同操作。
可以说OSI开放系统互联模型定义了通信双方之间的所有历程,但是这是在非常理想的情况下。而现实中,很少有一个协议可以完整的覆盖OSI模型,基本都是覆盖其中一部分。而此次我们所要讲述的CAN总线只覆盖了OSI七层模型中的物理层和数据链路层(参考ISO 11898和ISO 11519)
CAN总线的定义以及背景本文忽略(网上一搜一大堆),我们直接从运行机理讲起:
如图上所示,其数据流向为:CPU——CAN控制器——CAN收发器——连接器(双绞线)
其具体流程为:
发送时:CPU将二进制数据通过CAN控制器中定义好的接口发送给CAN控制器中的发送缓冲器(最多缓存3组数据),之后CAN核心模块会在发送缓冲器中拿取数据,对数据进行加工,生成CAN协议所规定的数据格式,之后将标准的数据格式发给CAN收发器,CAN收发器会按照规定将接收到的二进制信息编码转为对应的电平信号
接收时:CAN收发器会收到CAN总线上发送过来的电平信号,根据规定,将电平信号转化为对应的二进制编码,然后传给CAN核心模块,CAN核心模块会对接收到的数据进行解析,将其中ID信息,数据信息解析出来,之后通过过滤器对ID进行过滤,过滤器中定义了允许通过的ID或者ID组,之后将通过的ID所对应的数据传入到FIFO中,这是一个队列,先进先出,最先传进去的数据,最先被CPU拿取进行处理。
在通信机理的图中,可能会有小伙伴发现,是存在两条CAN总线的,一条为低速CAN,一条为高速CAN,这两者有什么区别呢?
正如其名称一样,在通信速率方面,一个传输速率低(最大125kbps),一个传输速率高(最大1Mbps),同样是CAN总线,为什么会有这样的区别呢?这是因为两个CAN协议(ISO 11898和ISO 11519)对物理层的定义不一样,也就是CAN收发器是不一样的,而CAN控制器是一样的,这就表示收到同样的信号编码,低速CAN和高速CAN所转化的电平信号是不一样的,同时电平的转化效率也是不一样的,这意味着同样时间内高速CAN可以进行更多次的电平转化,传输更多的数据。除了通信速率不一样外,高速CAN和低速CAN还存在一些其他差异,如下图:
上面我们仅仅是在物理层面对其进行了一个说明,但CAN协议最终的本质是数据的传输。那么CAN协议传输的数据是什么样的呢?在CAN协议中,根据作用不同,将数据分为5种数据类型,它们分别是:
通过上面我们知道了CAN协议中存在5种数据类型,分别有不同的作用。现在我们讲一讲每个数据类型的结构构成,在CAN总线中,只有满足这些结构的数据才能进行传输。
在对每个数据类型的大体结构有了一些了解后,我们对数据结构再进行更深一步的详细解析:
之前我们讲CAN控制器会将CPU传输过来的二进制数据转为标准格式,所说的标准格式就是数据帧,CAN控制器会在原始数据的基础上加上起始位,ID还有校验等信息,补充的信息都有一定的含义,详解见下图:
遥控帧是用于接收单元向具有同样的ID的发送单元请求数据的帧。遥控帧结构和数据帧结构基本一样,唯一不同就是没有数据段,因此,设置了RTR位,用来区分遥控帧和没有数据段的数据帧。
错误帧是用于接收和发送消息时检测出错误,进行错误通知的帧。
在CAN协议中,存在5种错误,只要触发这些错误,就会发送错误帧,此外多种错误可能同时发生。
这里需要强调几个特例,它们虽然满足上述的错误描述,但并不会被视为对应的错误类型
1.位错误
2.格式错误
我们上面讲述了错误的种类,即发送错误帧的条件,但触发了之后,什么时候开始发送错误帧呢?这里需要谈一下错误帧的时序
在输出错误帧时,我们将错误标志分为主动错误标志和被动错误标志,它们发送的电平是不一样的,我们应当如何区分主动还是被动呢?在CAN协议中,对主动还是被动,是有明确的定义的,其原理是内置一个计数值,根据计数值的大小来划分:
按照计数值的规则,总线除了主动错误和被动错误状态之外,还存在一种总线关闭态,这三者之间可以相互转化
我们一直提计数的规则,那计数的规则又是什么呢?或者说TEC和REC是怎么算出来的呢?在CAN中每种错误都对应着固定的分数,触发此错误,就会在原有的基础上加上此错误所对应的分数
帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间隔。
在总线空闲状态下,所有单元都可开始发送消息。区别于主从机模式的总线,CAN总线中任何节点都没有绝对的控制权
在总线空闲时,如果有多个节点同时发送数据,根据数据格式中的ID标识符进行仲裁比较,优先级高的ID节点可继续发送数据,优先级低的,也就是仲裁失利的ID节点则立刻停止发送,转为接收
与总线相连的节点没有类似“地址”的信息。因此,在总线增加新的节点时,连接在总线上的其他节点的软硬件和应用层都不需改变
在同一条总线中,所有节点都必须设置为统一的通信速度
可以通过遥控帧请求某个特定的节点发送数据
所有单元都可检测错误(错误检测)
检测出错误的单元会立即同时通知其他所有单元(错误通知)
正在发送消息的单元一旦检测到错误,会强制结束当前的发送。强制结束发送的单元会不断反复的重新发送此消息直到成功发送为止(错误恢复功能)
CAN可以判断错误类型是暂时性错误(如外部噪声)还是持续错误(如单元内部故障,驱动器故障,断线等)。当总线上发生持续错误时,可将引起此故障的单元从总线上隔离出去
CAN总线可同时连接多个单元。连接的单元数理论上没有限制,但实际过程中会受到总线上时间延迟和电器负载的限制,连接数一般在30个左右,可改变通信速度进行调整。