为了对n个设备使用总线的请求进行裁决_汽车CAN总线详解

前面的文章已经介绍过基础软件的CAN通信部分,今天整理下CAN通信的概览知识。从几个概念开始。

​1 位速率

位速率(bit rate),即传输期间单位时间的位数。数字信号系统中,带宽用来标识通讯线路所能传送数据的能力,即在单位时间内通过网络中某一点的最高数据率,常用的单位为bps(bit per second,又称为比特率)。通过多少个物理电平的位及以什么样的方式组合来表示逻辑上的0和1,即位表示法来分,主要有NRZ编码和曼码。其中,使用曼彻斯特码时可以用电平上的0-1跳变表示逻辑上的0,电平上的1-0跳变表示逻辑上的1,如下图(b)所示。使用NRZ码用电平上的0表示逻辑上的0,电平上的1表示逻辑上的1,如下图(a)所示。

58808d8682890645b783d0ccba49c469.png

2 位填充

在使用NRZ位表示时,使用位填充提供的总线状态来满足周期性同步。每当发送逻辑在数据中遇到一定填充宽度的有相等值连续位时,它会自动填充一个位的互补值,填充到输出比特流中。接收器执行逆过程,从接收数据中去除它。NRZ码的带宽利用率很高,但是有些时候它不能传输时钟信号。比如,传输0-0-0-0或1-1-1-1在物理线路上将看到一条水平直线的“低电平”或“高电平”,当接受方和发送方的时钟存在偏差时,会造成接收方多检出或少检出一个位。如下图,发送方1-0跳变开始,接收方时钟与它同步,但是接收方比发送方的系统时钟慢了1/5Tq,当发送方连续发了6个零,接收方只连续收到了5个零,丢了一个位。

467f8ad2eddda22a8929f9533cb4d3fe.png

对于采用NRZ码的异步通信,为了避免这种情况,就要定义一个最大时钟同步间隔。即最大允许发送N个连续位时必须要反转一次电平,让接收方同步发送方的时钟。定义发送数据帧中连续位的个数为数列{n_i},如果max{n_i}<N,就不需要填充,否则就要对帧中满足填充。但是这个填充位是0还是1没有任何数据意义,它只是时钟同步的标志,接收到之后必须要被识别出来并剔除掉,才能恢复出发送方的原始数据。

2f42af90996d7719b85be0d36a6e5900.png

每填充一个位,填充的位也会被定义到发送数据序列里,则{n_i}就要重新计算一次,重新判定max{n_i}<N。从而可能会出现填充的连锁反应,如下图所示。而在去填充的时候,要首先全识别出填充位,然后再一起剔除。

1ce851c2c491dfe8e07b57fa0f7937fe.png

3 位时序由发送单元在非同步的情况下发送每秒的位数称为位速率。一个位可分为 4 段。

  • 同步段(SS)
  • 传播时间段(PTS)
  • 相位缓冲段1(PBS1)
  • 相位缓冲段2(PBS2)

这些段又由可称为 TimeQuantum(以下称为Tq)的最小时间单位构成。

1 位分为4 个段,每个段又由若干个Tq 构成,这称为位时序。1 位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。各段的作用和 Tq 数如下图所示:

79b421fc5d8bd69dbbe71c799d167c36.png

1个位的构成如下图所示:

1b151b04e1b67c43ffcf5bb3ccb2a8e2.png

上图的采样点,是指读取总线电平,并将读到的电平作为位值的点。位置在 PBS1 结束处。根据位时序,可以计算CAN通信的波特率了。前面提到的CAN协议具有仲裁功能,下面我们来看看是如何实现的。在总线空闲态,最先开始发送消息的单元获得发送权。当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。实现过程,如下图所示:

ad3e82c5b26d0c8a9f5690dbdf4f1abb.png

上图中,单元1和单元2同时开始向总线发送数据,开始部分他们的数据格式是一样的,故无法区分优先级,直到T时刻,单元1输出隐性电平,而单元2输出显性电平,此时单元1仲裁失利,立刻转入接收状态工作,不再与单元2竞争,而单元2则顺利获得总线使用权,继续发送自己的数据。这就实现了仲裁,让连续发送显性电平多的单元获得总线使用权。

4 通信网络

通信网络的拓扑,所有节点都通过无源链路到达,从而允许双向传输。无源网络(PassiveNetwork),是指仅由无源元件组成的网络。该网络在任何情况下送到外部的能量不大于所存储的能量。无源链路在总线中,任何一个“发送—接收”的链路,无论距离有多远,都不需要再做信号的变换和放大。这显然不像以太网,进行远距离传输时中间需要增加中继器。加中继器会怎样呢?一个是组网变得复杂,硬件成本高,另外中继器两端实际上是物理信号不同的两个网络,在转换信号的过程中会产生延迟,使得各节点没办法保证收发的同时性,对于实时系统这是不可靠的。双向传输说明任何一个节点都能参与发送和接收,即网络对所有节点都是透明的。

99560a7544abbfd6188b813cde8abe45.png

当 CAN 总线上的一个节点发送数据时,它以报文的形式广播给网络中所有节点,对每个节点来说,无论数据是否是发给自己的,都对其接收。

5 显隐性

每组报文开头的11 位字符为标识符,定义了报文的优先级,这种报文格式成为面向内容的编制方案。同一系统中标识符是唯一的,不可能有两个站发送具有相同标识符的报文,当几个节点同时竞争总线读取时,这种配置十分重要。大体的工作原理我们搞清了,下面介绍另外一组重要的名词:“显性”和“隐性”。CAN 数据总线有两条导线线,分别是CAN_High 线和CAN_Low 线。当静止状态时,这两条导线上的电平一样,这个电平称为静电平,大约为2.5V。这个静电平状态就是隐形状态,即没有任何干扰时的状态称为隐性状态。当有信号修改时,CAN_High 线上的电压值拉高,CAN_Low 线上的电压值降低。这时,CAN_High 升为3.5v,CAN_Low 降为1.5v,处于激活状态。

98ffc91e3f33baa1103897a9f4f8b191.png

准确的描述:

  • CAN_H-CAN_L < 0.5V 时候为隐性的,逻辑信号表现为"逻辑1"- 高电平。
  • CAN_H-CAN_L > 0.9V 时候为显性的,逻辑信号表现为"逻辑0"- 低电平。

一般来说,控制单元通过收发器连接到 CAN 驱动总线,这个收发器内有一个接收器,该接收器是安装在接收一侧的差动信号放大器。这个放大器将放大CAN_High 和CAN_Low的电压差,然后传到接收区。如下图:

ffa40490efb95660544c9b3d2100b878.png

由上图可知,当有电压差,差动信号放大器放大传输,将相应的数据位转化为0。6 CAN报文所谓报文,就是CAN 总线上要传输的数据信息。为了安全,我们要对传输的数据信息编码制定协议,这样才不容易出错,所以出现了不同类型帧,仲裁和CRC 校验等。标识符标识符顾名思义,是为了区分不同报文的鉴别的字符位。标准帧是11 位,扩展帧是29 位。它决定了报文的优先级,且报文标识符的值越小,报文优先级越高。

CAN 报文有5个不同的帧类型,分别是:

  1. 数据帧:数据帧将数据从发送器传输到接收器;
  2. 远程帧:总线节点发出远程帧,请求发送具有同一标识符的数据帧;
  3. 错误帧:任何节点检测到总线错误就发出错误帧;
  4. 过载帧:过载帧用已在先行的后续的数据帧(或远程帧)之间提供一附加的延时。
  5. 间隔帧:是用来隔离数据帧的,数据帧(或者遥控帧)通过插入帧间隔可以将本帧与先行帧(数据帧、遥控帧、错误帧、过载帧)分隔开来。

数据帧:用于发送单元向接收单元传送数据的帧

遥控帧:用于接收单元向具有相同 ID 的发送单元请求数据的帧

错误帧:用于当检测出错误时向其它单元通知错误的帧

过载帧:用于接收单元通知其尚未做好接收准备的帧

间隔帧:用于将数据帧及遥控帧与前面的帧分离开来的帧

7 不同类型帧

7.1 数据帧

数据帧由 7 个不同位场组成(帧起始、仲裁场、控制场、数据场、CRC场、应答场、帧结尾)。

5b754caa68f97b84e1ae748501a6734e.png

帧起始

数据帧报文开始是一位帧起始,也叫SOF。它用显性位表示,也就是0。帧起始看起来只有一位,其实不简单。为了让所有的节点都同步于发送报文的发送节点,接收数据,需要考虑很多问题。

d605278b6b80e2ac9f6fb91525d07996.png

仲裁场

仲裁很抽象,其实只为解决一个问题。如果2个或2 个以上的节点同时传送报文,那么就会有总线访问冲突,仲裁机制就是根据标识符优先级来去掉低优先级的数据。下图中, 低电平代表0(显性),高电平代表1(隐性);当隐性碰到显性,就变为显性。

907f946788a1ef46a8af8082f893525e.png

如上图所示,节点 A 和节点B 的标识符的第10、9、8 位电平相同,因此两个节点侦听到的信息和它们发出的信息相同。第7位节点B发出一个“1”,但从节点上接收到的消息却是“0”。因为A 节点同时发出显性位,让总线也变成显性了,也就是0。节点B 将退出发送,处于监听方式;节点A 成功发送仲裁位从而获得总线的控制权,继而发送全部消息,这就是仲裁机制。上面我们说过,报文有两种格式,标准和扩展。这里,不同的格式仲裁场是不一样的。标准格式下,仲裁场由11 位识别符和RTR 位组成。但在扩展格式里,包括29 位识别符、SRR 位、IDE 位、RTR 位。

9687e2a8f97d24a0bca789d3805d85ff.png

标准格式中的数据帧

6c28268989eb408d9bfc1f576cdcf2f0.png

扩展格式中的数据帧RTR 位,Remote Tranmission Request BIT 全称为远程发送请求位。它在数据帧里必须为显性0 ,但在远程帧里为隐性1。SRR 位,替代远程请求位,SRR 是一隐性位,也就是1,它在扩展格式的标准帧RTR 位位置,那么标准帧将优先于扩展帧,因为在传输完11 位标识符之后(扩展帧的后18 位在最后发送,先发送11 位标识符),轮到标准帧的RTR 位和扩展帧的SRR 位了。这时,标准帧的RTR 为显性,而扩展帧SRR 为隐性,这样,总线自然就被标准帧占据。CAN 总线协议设计者,设计了数据帧优先于远程帧。所以,IDE(Identifier Extension Bit),全称识别符扩展位,它属于扩展格式的仲裁场。对于扩展格式,IDE位属于仲裁场;对于标准格式,IDE位属于控制场。标准格式的IDE位为“显性”,而扩展格式的IDE位为“隐性”。

控制场

控制场由6个位组成,标准格式和扩展格式的控制场格式不同。标准格式里的帧包括数据长度代码、IDE位(为显性位)及保留位r0。扩展格式里的帧包括数据长度代码和两个保留位:r1和r0。其保留位必须发送为显性,但是接收器认可“显性”和“隐性”位的任何组合。其结构如图所示:

ca2957aa5666e148ed02f1bd94f4bb08.png

放大图:

ad8b3ac9b3fcb395208c5ba25e14cb65.png

数据长度代码(标准格式以及扩展格式)DLC,如下表所示

b0cfb9d92f9609399b65f5f7adafd99b.png

数据长度代码指示了数据场里的字节数量。其中:d—“显性”, r—“隐性”,数据帧允许的数据字节数为{0,1,...,7,8}。其他的数值不允许使用。

数据场

数据场由数据帧里的发送数据组成。它可以为0~8个字节,每字节包含了8个位,首先发送最高有效位(MSB)。

2edf7c796252fd8c4cb7af4f9c75b572.png

CRC场

循环冗余码CRC场是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。CRC场包括CRC序列(CRC Sequence),其后是CRC界定符(CRC Delimiter),结构如图:

bd1121470434df59bea6716777a03d2a.png

生成 CRC 码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111 对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1 对应的代码101111。举个例子。已知信息位为1101,生成多项式G(x)= x3+x+1,求CRC 码。要传输的信息序列为1101,在末尾添加所给多项式的最高次阶个0,如本题为x^3,则添加3个0,变为:1101000;由多项式G(X)=X3+X+1,得其阶数为1的二进制编码为:1011;1101000对1011进行模二除法,所得到的余数即为校验码,把校验码添加在原数据尾部即为所求的编码,则实际发送的数据序列为1101001。校验码计算过程如图所示:

71e5f29897a3fa0cf5a8bfed99ed1f1a.png

应答场(ACK Field)

应答场长度为2个位,包含应答间隙(ACK Slot)和应答界定符(ACK Delimiter),如图所示。在ACK场(应答场)里,发送节点发送两个“隐性”位。当接收器正确地接收到有效的报文,接收器就会在应答间隙(ACK Slot)期间向发送器发送一“显性”位以示应答。

9e36c13fe9f063b3e6b514d26213467a.png

帧结尾

每一个数据帧和远程帧均由一标志序列界定。这个标志序列由7个“隐性”位组成。

7.2 远程帧

通过发送远程帧,总线的节点发出远程帧,请求以前发送给它数据帧的节点再发送一遍。具体发送哪个数据帧,由远程帧的标识符决定。与数据帧类似,远程帧也有标准格式和扩展格式,而且都由6个不同的位场组成:帧起始、仲裁场、控制场、CRC场、应答场、帧结尾。与数据帧相反,远程帧的RTR位是“隐性”的。它没有数据场,数据长度代码DLC的数值是不受制约的(可以标注为容许范围0~8里的任何数值),此数值是相应于数据帧的数据长度代码。远程帧结构如图所示:

f675cd33ae13379133b5d68eef1ffa2f.png

7.3 错误帧

错误帧由两个不同的场组成,第一个场是不同节点提供的错误标志(Error Flag)的叠加,第二个场是错误界定符。为了能正确地终止错误帧,“错误认可”的节点要求总线至少有长度为3个位时间的总线空闲。因此,总线的载荷不应为100%。错误帧结构如图:

b1ae6bc62972de53c23b0f07efb7ac25.png

(1) 错误标志有两种形式的错误标志:激活错误标志和认可错误标志“激活错误”标志由6个连续的“显性”位组成;“认可错误”标志由6个连续的“隐性”的位组成,除非被其他节点的“显性”位重写。(2) 错误界定符错误界定符包括8个“隐性”的位。错误标志传送了以后,每个节点就发送一个“隐性”位,并一直监视总线直到检测出一个“隐性”的位为止,然后开始发送其余7个“隐性”位。

7.4 过载帧

过载帧(Overload Frame)包括两个位场:过载标志 和 过载界定符,其结构如图:

0c3533362d4d72d8581f1cc4f23b8d10.png

有三种过载的情况会引发过载标志的传送:

接收器的内部情况,需要延迟下一个数据帧和远程帧。

在间歇的第1和第2字节检测到一个“显性”位。间歇属于帧间空间的一部分。它包含三个隐性位。间歇期间,所有的节点不允许传送数据帧或远程帧。它唯一要做的就是标示一个过载条件。

如果CAN节点在错误界定符或过载界定符的第8位采样到一个显性位,节点会发送一个过载帧。该帧不是错误帧,错误计数器不会增加。(1)过载标志(Overload Flag)过载标志由6个“显性”的位组成。过载标志的所有形式和“激活错误”标志的一样。(2)过载界定符(Overload Delimiter)过载界定符包括8个“隐性”的位。

7.5 间隔帧

数据帧(或远程帧)与先行帧的隔离是通过帧间空间实现的,无论此先行帧类型如何(数据帧、远程帧、错误帧、过载帧)。帧间空间包括间歇、总线空闲的位场。如果“错误认可”的节点已作为前一报文的发送器,则其帧间空间除了间歇、总线空闲外,还包括称作“挂起传送”(Suspend Transmission)的位场。对于不是“错误认可”的节点,或作为前一报文的接收器的节点,其帧间空间如图:

cb71fec1659ee5d5c27f74327f9ec6a0.png

对于作为前一报文发送器的“错误认可”的节点,其帧间空间如图:

f136afedd9dd97f5873cdc66bf452f77.png

(1)总线空闲(Bus Idle)

总线空闲的时间是任意的。只要总线被认定为空闲,任何等待发送报文的节点就会访问总线。在发送其他报文期间,有报文被挂起,对于这样的报文,其传送起始于间歇之后的第一个位。

总线上检测到的“显性”的位可被解释为帧的起始。

(2)挂起传送(Suspend Transmission)“错误认可”的节点发送报文后,节点就在下一报文开始传送之前或总线空闲之前发出8个“隐性”的位跟随在间歇的后面。如果与此同时另一节点开始发送报文(由另一节点引起),则此节点就作为这个报文的接收器。

8 示波器波形

标准数据帧波形捕获:

a209eb7618671a29040589af4faacc55.png

扩展数据帧波形捕获:

c176386c0bf1b3af5cf2863baecd774e.png

AUTOSAR架构下CAN通信的软件部分,可以参看往期文章:
Demu大叔:AUTOSAR通信篇—AUTOSAR COM模块

Demu大叔:AUTOSAR通信篇—PduR模块

Demu大叔:AUTOSAR通信篇—CANTP模块

Demu大叔:AUTOSAR通信篇—IpduM模块

Demu大叔:AUTOSAR通信篇—CanIf模块

本文首发于“汽车控制与人工智能”公众号,欢迎关注。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值