汽车CAN总线详解

2021年12月2日汽车技术评论613阅读模式
前面的文章已经介绍过基础软件的CAN通信部分,今天整理下CAN通信的概览知识。从几个概念开始。

1  位速率 

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

汽车CAN总线详解2  位填充

在使用NRZ位表示时,使用位填充提供的总线状态来满足周期性同步。每当发送逻辑在数据中遇到一定填充宽度的有相等值连续位时,它会自动填充一个位的互补值,填充到输出比特流中。接收器执行逆过程,从接收数据中去除它。
NRZ码的带宽利用率很高,但是有些时候它不能传输时钟信号。比如,传输0-0-0-0或1-1-1-1在物理线路上将看到一条水平直线的“低电平”或“高电平”,当接受方和发送方的时钟存在偏差时,会造成接收方多检出或少检出一个位。如下图,发送方1-0跳变开始,接收方时钟与它同步,但是接收方比发送方的系统时钟慢了1/5Tq,当发送方连续发了6个零,接收方只连续收到了5个零,丢了一个位。
汽车CAN总线详解
对于采用NRZ码的异步通信,为了避免这种情况,就要定义一个最大时钟同步间隔。即最大允许发送N个连续位时必须要反转一次电平,让接收方同步发送方的时钟。定义发送数据帧中连续位的个数为数列{n_i},如果max{n_i}汽车CAN总线详解
每填充一个位,填充的位也会被定义到发送数据序列里,则{n_i}就要重新计算一次,重新判定max{n_i}
汽车CAN总线详解
3  位时序
由发送单元在非同步的情况下发送每秒的位数称为位速率。一个位可分为 4 段。
  • 同步段(SS
  • 传播时间段(PTS
  • 相位缓冲段1PBS1
  • 相位缓冲段2PBS2

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

位分为个段,每个段又由若干个Tq 构成,这称为位时序。
位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。各段的作用和 Tq 数如下图所示:
汽车CAN总线详解
1个位的构成如下图所示:
汽车CAN总线详解
上图的采样点,是指读取总线电平,并将读到的电平作为位值的点。位置在 PBS1 结束处。根据位时序,可以计算CAN通信的波特率了。
前面提到的CAN协议具有仲裁功能,下面我们来看看是如何实现的。在总线空闲态,最先开始发送消息的单元获得发送权。当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。实现过程,如下图所示:
汽车CAN总线详解
上图中,单元1和单元2同时开始向总线发送数据,开始部分他们的数据格式是一样的,故无法区分优先级,直到T时刻,单元1输出隐性电平,而单元2输出显性电平,此时单元1仲裁失利,立刻转入接收状态工作,不再与单元2竞争,而单元2则顺利获得总线使用权,继续发送自己的数据。这就实现了仲裁,让连续发送显性电平多的单元获得总线使用权。

4  通信网络

通信网络的拓扑,所有节点都通过无源链路到达,从而允许双向传输。
无源网络(PassiveNetwork),是指仅由无源元件组成的网络。该网络在任何情况下送到外部的能量不大于所存储的能量。无源链路在总线中,任何一个“发送—接收”的链路,无论距离有多远,都不需要再做信号的变换和放大。这显然不像以太网,进行远距离传输时中间需要增加中继器。加中继器会怎样呢?一个是组网变得复杂,硬件成本高,另外中继器两端实际上是物理信号不同的两个网络,在转换信号的过程中会产生延迟,使得各节点没办法保证收发的同时性,对于实时系统这是不可靠的。
双向传输说明任何一个节点都能参与发送和接收,即网络对所有节点都是透明的。
汽车CAN总线详解
当 CAN 总线上的一个节点发送数据时,它以报文的形式广播给网络中所有节点,对每个节点来说,无论数据是否是发给自己的,都对其接收。
5  显隐性
每组报文开头的11 位字符为标识符,定义了报文的优先级,这种报文格式成为面向内容的编制方案。同一系统中标识符是唯一的,不可能有两个站发送具有相同标识符的报文,当几个节点同时竞争总线读取时,这种配置十分重要。大体的工作原理我们搞清了,下面介绍另外一组重要的名词:“显性”和“隐性”。
CAN 数据总线有两条导线线,分别是CAN_High 线和CAN_Low 线。当静止状态时,这两条导线上的电平一样,这个电平称为静电平,大约为2.5V。这个静电平状态就是隐形状态,即没有任何干扰时的状态称为隐性状态。当有信号修改时,CAN_High 线上的电压值拉高,CAN_Low 线上的电压值降低。这时,CAN_High 升为3.5v,CAN_Low 降为1.5v,处于激活状态。
汽车CAN总线详解
准确的描述:
  • CAN_H-CAN_L
  • CAN_H-CAN_L > 0.9V 时候为显性的,逻辑信号表现为"逻辑0"- 低电平。
一般来说,控制单元通过收发器连接到 CAN 驱动总线,这个收发器内有一个接收器,该接收器是安装在接收一侧的差动信号放大器。这个放大器将放大CAN_High 和CAN_Low的电压差,然后传到接收区。如下图:
汽车CAN总线详解
由上图可知,当有电压差,差动信号放大器放大传输,将相应的数据位转化为0。
6  CAN报文
所谓报文,就是CAN 总线上要传输的数据信息。为了安全,我们要对传输的数据信息编码制定协议,这样才不容易出错,所以出现了不同类型帧,仲裁和CRC 校验等。
标识符
标识符顾名思义,是为了区分不同报文的鉴别的字符位。标准帧是11 位,扩展帧是29 位。它决定了报文的优先级,且报文标识符的值越小,报文优先级越高。

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

  1. 数据帧:数据帧将数据从发送器传输到接收器;

  2. 远程帧:总线节点发出远程帧,请求发送具有同一标识符的数据帧;

  3. 错误帧:任何节点检测到总线错误就发出错误帧;

  4. 过载帧:过载帧用已在先行的后续的数据帧(或远程帧)之间提供一附加的延时。

  5. 间隔帧:是用来隔离数据帧的,数据帧(或者遥控帧)通过插入帧间隔可以将本帧与先行帧(数据帧、遥控帧、错误帧、过载帧)分隔开来。

帧类型

帧用途

数据帧

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

遥控帧

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

错误帧

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

过载帧

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

间隔帧

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

7  不同类型帧
1 数据帧
数据帧由 7 个不同位场组成(帧起始、仲裁场、控制场、数据场、CRC场、应答场、帧结尾)。
汽车CAN总线详解
帧起始
数据帧报文开始是一位帧起始,也叫SOF。它用显性位表示,也就是0。帧起始看起来只有一位,其实不简单。为了让所有的节点都同步于发送报文的发送节点,接收数据,需要考虑很多问题。
汽车CAN总线详解
仲裁场
仲裁很抽象,其实只为解决一个问题。如果2个或2 个以上的节点同时传送报文,那么就会有总线访问冲突,仲裁机制就是根据标识符优先级来去掉低优先级的数据。
下图中, 低电平代表0(显性),高电平代表1(隐性);当隐性碰到显性,就变为显性。
汽车CAN总线详解
如上图所示,节点 A 和节点B 的标识符的第10、9、8 位电平相同,因此两个节点侦听到的信息和它们发出的信息相同。第7位节点B发出一个“1”,但从节点上接收到的消息却是“0”。因为A 节点同时发出显性位,让总线也变成显性了,也就是0。节点B 将退出发送,处于监听方式;节点A 成功发送仲裁位从而获得总线的控制权,继而发送全部消息,这就是仲裁机制。
上面我们说过,报文有两种格式,标准和扩展。这里,不同的格式仲裁场是不一样的。标准格式下,仲裁场由11 位识别符和RTR 位组成。但在扩展格式里,包括29 位识别符、SRR 位、IDE 位、RTR 位。
汽车CAN总线详解
标准格式中的数据帧
汽车CAN总线详解
扩展格式中的数据帧
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。其保留位必须发送为显性,但是接收器认可“显性”和“隐性”位的任何组合。其结构如图所示:
汽车CAN总线详解
放大图:
汽车CAN总线详解
数据长度代码(标准格式以及扩展格式)DLC,如下表所示
汽车CAN总线详解
数据长度代码指示了数据场里的字节数量。其中:d—“显性”, r—“隐性”,数据帧允许的数据字节数为{0,1,...,7,8}。其他的数值不允许使用。
数据场
数据场由数据帧里的发送数据组成。它可以为0~8个字节,每字节包含了8个位,首先发送最高有效位(MSB)。
汽车CAN总线详解
CRC场
循环冗余码CRC场是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。CRC场包括CRC序列(CRC Sequence),其后是CRC界定符(CRC Delimiter),结构如图:
汽车CAN总线详解
生成 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。校验码计算过程如图所示:
汽车CAN总线详解
应答场(ACK Field)
应答场长度为2个位,包含应答间隙(ACK Slot)和应答界定符(ACK Delimiter),如图所示。在ACK场(应答场)里,发送节点发送两个“隐性”位。当接收器正确地接收到有效的报文,接收器就会在应答间隙(ACK Slot)期间向发送器发送一“显性”位以示应答。
汽车CAN总线详解
帧结尾
每一个数据帧和远程帧均由一标志序列界定。这个标志序列由7个“隐性”位组成。
2  远程帧
通过发送远程帧,总线的节点发出远程帧,请求以前发送给它数据帧的节点再发送一遍。具体发送哪个数据帧,由远程帧的标识符决定。
与数据帧类似,远程帧也有标准格式和扩展格式,而且都由6个不同的位场组成:帧起始、仲裁场、控制场、CRC场、应答场、帧结尾。
与数据帧相反,远程帧的RTR位是“隐性”的。它没有数据场,数据长度代码DLC的数值是不受制约的(可以标注为容许范围0~8里的任何数值),此数值是相应于数据帧的数据长度代码。远程帧结构如图所示:
汽车CAN总线详解
3  错误帧
错误帧由两个不同的场组成,第一个场是不同节点提供的错误标志(Error Flag)的叠加,第二个场是错误界定符。为了能正确地终止错误帧,“错误认可”的节点要求总线至少有长度为3个位时间的总线空闲。因此,总线的载荷不应为100%。错误帧结构如图:
汽车CAN总线详解
(1) 错误标志
有两种形式的错误标志:激活错误标志和认可错误标志“激活错误”标志由6个连续的“显性”位组成;“认可错误”标志由6个连续的“隐性”的位组成,除非被其他节点的“显性”位重写。
(2) 错误界定符
错误界定符包括8个“隐性”的位。错误标志传送了以后,每个节点就发送一个“隐性”位,并一直监视总线直到检测出一个“隐性”的位为止,然后开始发送其余7个“隐性”位。
4  过载帧
过载帧(Overload Frame)包括两个位场:过载标志 和 过载界定符,其结构如图:
汽车CAN总线详解
有三种过载的情况会引发过载标志的传送:

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

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

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

5  间隔帧

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

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

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

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

标准数据帧波形捕获:

汽车CAN总线详解

扩展数据帧波形捕获:
汽车CAN总线详解

weinxin
扫码关注公众号
关注公众号领精彩彩蛋!
如何理解CAN通信中的UB? 汽车技术

如何理解CAN通信中的UB?

今天这篇文章解答多位同学的疑问:CAN通信中的更新位UB到底是如何起作用的? 什么是更新位? 为了帮助信号或信号组的接收端来识别发送端是否在发送前更新了信号或信号组的数据,AUTOSAR COM模块整...

发表评论