can协议标准快速理解

CAN 模块介绍

CAN是控制器局域网络(Controller Area Network)的简称,它是由研发和生产汽车电子产品著称的
德国BOSCH公司开发的,并最终成为国际标准( ISO11519),是国际上应用最广泛的现场总线
之一。
CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以
CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。近年来,它具有的高可靠性和良
好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强及
振动大的工业环境。

CAN 基础知识

CAN 物理层

与I2C、 SPI等具有时钟信号的同步通讯方式不同, CAN通讯并不是以时钟信号来进行同步的,它
是一种异步通讯,只具有CAN_High和CAN_Low两条信号线,共同构成一组差分信号线,以差分
信号的形式进行通讯。

闭环总线网络

CAN物理层的形式主要有两种, 图 5-49 CAN闭环总线通讯网络是一种遵循ISO11898标准的高
速、短距离“闭环网络”,它的总线最大长度为40m,通信速度最高为1Mbps,总线的两端各要求有
一个“120欧”的电阻。

图 5-49 CAN 闭环总线通讯网络

在这里插入图片描述

开环总线网络

图 5-50 CAN开环总线通讯网络是一种遵循ISO11519-2标准的低速、远距离“开环网络”,它的最
大传输距离为1km,最高通讯速率为125kbps,两根总线是独立的、不形成闭环,要求每根总线上
各串联有一个“2.2千欧”的电阻。

图 5-50 CAN 开环总线通讯网络

在这里插入图片描述

通讯节点

从CAN通讯网络图可了解到, CAN总线上可以挂载多个通讯节点,节点之间的信号经过总线传输,
实现节点间通讯。由于CAN通讯协议不对节点进行地址编码,而是对数据内容进行编码的,所以
网络中的节点个数理论上不受限制,只要总线的负载足够即可,可以通过中继器增强负载。
CAN通讯节点由一个CAN控制器及CAN收发器组成,控制器与收发器之间通过CAN_Tx及
CAN_Rx信号线相连,收发器与CAN总线之间使用CAN_High及CAN_Low信号线相连。其中
CAN_Tx及CAN_Rx使用普通的类似TTL逻辑信号,而CAN_High及CAN_Low是一对差分信号线,
使用比较特别的差分信号,下一小节再详细说明。
当CAN节点需要发送数据时,控制器把要发送的二进制编码通过CAN_Tx线发送到收发器,然后
由收发器把这个普通的逻辑电平信号转化成差分信号,通过差分线CAN_High和CAN_Low线输出
到CAN总线网络。而通过收发器接收总线上的数据到控制器时,则是相反的过程,收发器把总线
上收到的CAN_High及CAN_Low信号转化成普通的逻辑电平信号,通过CAN_Rx输出到控制器中。
例如, GD32的CAN片上外设就是通讯节点中的控制器,为了构成完整的节点,还要给它外接一个
收发器,在GD32E103V-EVAL V1.0开发板上使用型号为SN65HVD230的芯片作为CAN收发器。
CAN控制器与CAN收发器的关系如同TTL串口与MAX3232电平转换芯片的关系, MAX3232芯片
把TTL电平的串口信号转换成RS-232电平的串口信号, CAN收发器的作用则是把CAN控制器的
TTL电平信号转换成差分信号(或者相反)。

差分信号

差分信号又称差模信号,与传统使用单根信号线电压表示逻辑的方式有区别,使用差分信号传输
时,需要两根信号线,这两个信号线的振幅相等,相位相反,通过两根信号线的电压差值来表示
逻辑0和逻辑1。 图 5-51 差分信号使用了V+与V-信号的差值表达出了图下方的信号。

图 5-51 差分信号

在这里插入图片描述
相对于单信号线传输的方式,使用差分信号传输具有如下优点:

  1. 抗干扰能力强,当外界存在噪声干扰时,几乎会同时耦合到两条信号线上,而接收端只关心
    两个信号的差值,所以外界的共模噪声可以被完全抵消。
  2. 能有效抑制它对外部的电磁干扰,同样的道理,由于两根信号的极性相反,他们对外辐射的
    电磁场可以相互抵消,耦合的越紧密,泄放到外界的电磁能量越少。
  3. 时序定位精确,由于差分信号的开关变化是位于两个信号的交点,而不像普通单端信号依靠
    高低两个阈值电压判断,因而受工艺,温度的影响小,能降低时序上的误差,同时也更适合
    于低幅度信号的电路。
    由于差分信号线具有这些优点,所以在USB协议、 485协议、以太网协议及CAN协议的物理层中,
    都使用了差分信号传输。

CAN 协议中的差分信号

CAN协议中对它使用的CAN_High及CAN_Low表示的差分信号做了规定,见表 5-24 CAN协议标
准表示的信号逻辑及图 5-52 CAN差分信号(高速) 。以高速CAN协议为例,当表示逻辑1时(隐
性电平), CAN_High和CAN_Low线上的电压均为2.5v,即它们的电压差VH-VL=0V;而表示逻辑
0时(显性电平), CAN_High的电平为3.5V, CAN_Low线的电平为1.5V,即它们的电压差为VHVL=2V。例如,当CAN收发器从CAN_Tx线接收到来自CAN控制器的低电平信号时(逻辑0),它会
使CAN_High输出3.5V,同时CAN_Low输出1.5V,从而输出显性电平表示逻辑0。
在这里插入图片描述

图 5-52 CAN 差分信号(高速)

在这里插入图片描述
在 CAN 总线中,必须使它处于隐性电平(逻辑 1)或显性电平(逻辑 0)中的其中一个状态。假如有两
个 CAN 通讯节点,在同一时间,一个输出隐性电平,另一个输出显性电平,类似 I2C 总线的“线
与”特性将使它处于显性电平状态,显性电平的名字就是这样来的,即可以认为显性具有优先的意
味。
由于 CAN 总线协议的物理层只有 1 对差分线,在一个时刻只能表示一个信号,所以对通讯节点来
说, CAN 通讯是半双工的,收发数据需要分时进行。在 CAN 的通讯网络中,因为共用总线,在
整个网络中同一时刻只能有一个通讯节点发送信号,其余的节点在该时刻都只能接收。

CAN 协议层

以上是 CAN 的物理层标准,约定了电气特性,以下介绍的协议层则规定了通讯逻辑。

CAN 的波特率及位同步

由于CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通
讯那样,节点间使用约定好的波特率进行通讯,特别地, CAN还会使用“位同步”的方式来抗干
扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。

位时序分解

为了实现位同步, CAN 协议把每一个数据位的时序分解成如图 5-53 CAN 位时序分解图所示的 SS
段、 PTS 段、 PBS1 段、 PBS2 段,这四段的长度加起来即为一个 CAN 数据位的长度。分解后最
小的时间单位是 Tq,而一个完整的位由 8~25 个 Tq 组成。为方便表示, 图 5-53 CAN 位时序分解
图中的高低电平直接代表信号逻辑 0 或逻辑 1(不是差分信号)。

图 5-53 CAN 位时序分解图

在这里插入图片描述
该图中表示的 CAN 通讯信号每一个数据位的长度为 19Tq,其中 SS 段占 1Tq, PTS 段占 6Tq,
PBS1 段占 5Tq, PBS2 段占 7Tq。信号的采样点位于 PBS1 段与 PBS2 段之间,通过控制各段的
长度,可以对采样点的位置进行偏移,以便准确地采样。
各段的作用介绍如下:

SS段(SYNC SEG)

SS 译为同步段,若通讯节点检测到总线上信号的跳变沿被包含在 SS 段的范围之内,则表示节点
与总线的时序是同步的,当节点与总线同步时,采样点采集到的总线电平即可被确定为该位的电
平。 SS 段的大小固定为 1Tq。

PTS段(PROP SEG)

PTS 译为传播时间段,这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和
输出驱动器延时总和的两倍。 PTS 段的大小可以为 1~8Tq。

PBS1段(PHASE SEG1)

PBS1 译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加
长。 PBS1 段的初始大小可以为 1~8Tq。

PBS2段(PHASE SEG2)

PBS2 这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以
缩短。 PBS2 段的初始大小可以为 2~8Tq。

通讯的波特率

总线上的各个通讯节点只要约定好1个Tq的时间长度以及每一个数据位占据多少个Tq,就可以确
定CAN通讯的波特率。
例如,假设图5-52中的1Tq=1us,而每个数据位由19个Tq组成,则传输一位数据需要时间T1bit
=19us,从而每秒可以传输的数据位个数为:
1x106/19 = 52631.6 (bps)
这个每秒可传输的数据位的个数即为通讯中的波特率。

同步过程分析

波特率只是约定了每个数据位的长度,数据同步还涉及到相位的细节,这个时候就需要用到数据
位内的SS、 PTS、 PBS1及PBS2段了。
根据对段的应用方式差异, CAN 的数据同步分为硬同步和重新同步。其中硬同步只是当存在“帧起
始信号”时起作用,无法确保后续一连串的位时序都是同步的,而重新同步方式可解决该问题,这
两种方式具体介绍如下:
(1)硬同步
若某个 CAN 节点通过总线发送数据时,它会发送一个表示通讯起始的信号(即下一小节介绍的帧
起始信号),该信号是一个由高变低的下降沿。而挂载到 CAN 总线上的通讯节点在不发送数据时,
会时刻检测总线上的信号。
如图 5-54 硬同步过程图,可以看到当总线出现帧起始信号时,某节点检测到总线的帧起始信号
不在节点内部时序的 SS 段范围,所以判断它自己的内部时序与总线不同步,因而这个状态的采
样点采集得的数据是不正确的。 所以节点以硬同步的方式调整,把自己的位时序中的 SS 段平移
至总线出现下降沿的部分,获得同步,同步后采样点就可以采集得正确数据了。

图 5-54 硬同步过程图

在这里插入图片描述
(2)重新同步
前面的硬同步只是当存在帧起始信号时才起作用,如果在一帧很长的数据内,节点信号与总线信
号相位有偏移时,这种同步方式就无能为力了。因而需要引入重新同步方式,它利用普通数据位
的高至低电平的跳变沿来同步(帧起始信号是特殊的跳变沿)。重新同步与硬同步方式相似的地方
是它们都使用 SS 段来进行检测,同步的目的都是使节点内的 SS 段把跳变沿包含起来。
重新同步的方式分为超前和滞后两种情况,以总线跳变沿与 SS 段的相对位置进行区分。第一种
相位超前的情况如图 5-55 相位超前时的重新同步,节点从总线的边沿跳变中,检测到它内部的
时序比总线的时序相对超前2Tq,这时控制器在下一个位时序中的PBS1段增加2Tq的时间长度,
使得节点与总线时序重新同步。

图 5-55 相位超前时的重新同步

在这里插入图片描述

第二种相位滞后的情况如图 5-56 相位滞后时的重新同步,节点从总线的边沿跳变中,检测到它
的时序比总线的时序相对滞后 2Tq,这时控制器在前一个位时序中的 PBS2 段减少 2Tq 的时间长
度,获得同步。

图 5-56 相位滞后时的重新同步

在这里插入图片描述

在重新同步的时候, PBS1 和 PBS2 中增加或减少的这段时间长度被定义为“重新同步补偿宽度
SJW (reSynchronization Jump Width)”。一般来说 CAN 控制器会限定 SJW 的最大值,如限定了
最大 SJW=3Tq 时,单次同步调整的时候不能增加或减少超过 3Tq 的时间长度,若有需要,控制
器会通过多次小幅度调整来实现同步。当控制器设置的 SJW 极限值较大时,可以吸收的误差加
大,但通讯的速度会下降。

CAN 的报文种类及结构

在 SPI 通讯中,片选、时钟信号、数据输入及数据输出这 4 个信号都有单独的信号线, I2C 协议
包含有时钟信号及数据信号 2 条信号线,异步串口包含接收与发送 2 条信号线,这些协议包含的
信号都比 CAN 协议要丰富,它们能轻易进行数据同步或区分数据传输方向。而 CAN 使用的是两
条差分信号线,只能表达一个信号,简洁的物理层决定了 CAN 必然要配上一套更复杂的协议,如
何用一个信号通道实现同样、甚至更强大的功能呢? CAN 协议给出的解决方案是对数据、操作命
令(如读/写)以及同步信号进行打包,打包后的这些内容称为报文。
在原始数据段的前面加上传输起始标签、片选(识别)标签和控制标签,在数据的尾段加上 CRC 校
验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各
种信号了,各种各样的标签就如同 SPI 中各种通道上的信号,起到了协同传输的作用。当整个数
据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被
称为 CAN 的“数据帧”。
为了更有效地控制通讯, CAN 一共规定了 5 种类型的帧,它们的类型及用途说明如表 5-25 帧的
种类及其用途。
表 5-25 帧的种类及其用途
帧 帧用途
数据帧 用于节点向外传送数据
遥控帧 用于向远端节点请求数据
错误帧 用于向远端节点通知校验错误,请求重新发送上一个数据
过载帧 用于通知远端节点:本节点尚未做好接收准备
帧间隔 用于将数据帧及遥控帧与前面的帧分离开来

数据帧的结构

数据帧是在 CAN 通讯中最主要、最复杂的报文,我们来了解它的结构,见图 5-57 数据帧的结
构。

图 5-57 数据帧的结构

在这里插入图片描述

数据帧以一个显性位(逻辑 0)开始,以 7 个连续的隐性位(逻辑 1)结束,在它们之间,分别有仲裁
段、控制段、数据段、 CRC 段和 ACK 段。

帧起始

SOF 段(Start Of Frame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平,它用于通
知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。

仲裁段

当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称
的由来。
仲裁段的内容主要为本数据帧的 ID 信息(标识符),数据帧具有标准格式和扩展格式两种,区别就
在于 ID 信息的长度,标准格式的 ID 为 11 位,扩展格式的 ID 为 29 位,它在标准 ID 的基础上多
出 18 位。在 CAN 协议中, ID 起着重要的作用,它决定着数据帧发送的优先级,也决定着其它节
点是否会接收这个数据帧。 CAN 协议不对挂载在它之上的节点分配优先级和地址,对总线的占有
权是由信息的重要性决定的,即对于重要的信息,我们会给它打包上一个优先级高的 ID,使它能
够及时地发送出去。也正因为它这样的优先级分配原则,使得 CAN 的扩展性大大加强,在总线上
增加或减少节点并不影响其它设备。
报文的优先级,是通过对 ID 的仲裁来确定的。根据前面对物理层的分析我们知道如果总线上同时
出现显性电平和隐性电平,总线的状态会被置为显性电平, CAN 正是利用这个特性进行仲裁。
若两个节点同时竞争CAN总线的占有权,当它们发送报文时,若首先出现隐性电平,则会失去对
总线的占有权,进入接收状态。如图5-58 仲裁过程,在开始阶段,两个设备发送的电平一样,
所以它们一直继续发送数据。到了图中箭头所指的时序处,节点单元1发送的为隐性电平,而此
时节点单元2发送的为显性电平,由于总线的“线与”特性使它表达出显示电平,因此单元2竞争总
线成功,这个报文得以被继续发送出去。

图 5-58 仲裁过程

在这里插入图片描述

仲裁段 ID 的优先级也影响着接收设备对报文的反应。因为在 CAN 总线上数据是以广播的形式发
送的,所有连接在 CAN 总线的节点都会收到所有其它节点发出的有效数据,因而我们的 CAN 控
制器大多具有根据 ID 过滤报文的功能,它可以控制自己只接收某些 ID 的报文。
回看图 5-57 数据帧的结构中的数据帧格式,可看到仲裁段除了报文 ID 外,还有 RTR、 IDE 和
SRR 位。
(1) RTR 位(Remote Transmission Request Bit),译作远程传输请求位,它是用于区分数据帧和遥
控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。
(2) IDE 位(Identifier Extension Bit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当
它为显性电平时表示标准格式,隐性电平时表示扩展格式。
(3) SRR 位(Substitute Remote Request Bit),只存在于扩展格式,它用于替代标准格式中的 RTR
位。由于扩展帧中的 SRR 位为隐性位, RTR 在数据帧为显性位,所以在两个 ID 相同的标准格式
报文与扩展格式报文中,标准格式的优先级较高。

控制段

在控制段中的 r1 和 r0 为保留位,默认设置为显性位。它最主要的是 DLC 段(Data Length Code),
译为数据长度码,它由 4 个数据位组成,用于表示本报文中的数据段含有多少个字节, DLC 段表
示的数字为 0~8。

数据段

数据段为数据帧的核心内容,它是节点要发送的原始信息,由 0~8 个字节组成, MSB 先行。

CRC 段

为了保证报文的正确传输, CAN 的报文包含了一段 15 位的 CRC 校验码,一旦接收节点算出的
CRC 码跟接收到的 CRC 码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。
CRC 部分的计算一般由 CAN 控制器硬件完成,出错时的处理则由软件控制最大重发数。
在 CRC 校验码之后,有一个 CRC 界定符,它为隐性位,主要作用是把 CRC 校验码与后面的 ACK
段间隔起来。

ACK 段

ACK 段包括一个 ACK 槽位,和 ACK 界定符位。类似 I2C 总线,在 ACK 槽位中,发送节点发送
的是隐性位,而接收节点则在这一位中发送显性位以示应答。在 ACK 槽和帧结束之间由 ACK 界
定符间隔开。

帧结束

EOF 段(End Of Frame),译为帧结束,帧结束段由发送节点发送的 7 个隐性位表示结束。

其它报文的结构

关于其它的 CAN 报文结构,不再展开讲解,其主要内容见图 5-59 各种 CAN 报文的结构。

图 5-59 各种 CAN 报文的结构

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值