CAN通信笔记

1.物理层

CAN通信是一种异步通讯,利用 CAN_High 和 CAN_Low 两条信号线构成一组差分信号线进行通讯,规定CAN_High 和 CAN_Low 线上的电压均为 2.5v,即电压差=0V代表逻辑1(隐形电平);CAN_High 的电平为 3.5V,CAN_Low 线的电平为 1.5V,即电压差=2V时代表逻辑0(显性电平),显性电平优先于隐形电平,当多个节点同时输出既有隐形也有显性电平时,总线为显性电平0,即所有节点均输出1总线才为1,至少一个节点输出0时总线即为0
image.png

 2.链路协议层

2.1 CAN 的波特率及位同步

由于 CAN 属于异步通讯,没有时钟信号线,因此 CAN 采用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。

为了实现位同步,CAN 协议把每一个数据位的时序分解成如图 所示的 SS 段、PTS 段、PBS1 段、PBS2 段,即同步段,传输段,缓冲段1,缓冲段2,这四段的长度加起来即为一个 CAN 数据位的长度。分解后最小的时间单位是 Tq,而一个完整的位由 8~25 个 Tq 组成。

image.png 该图中表示的 CAN 通讯信号每一个数据位的长度为 19Tq,其中 SS 段占 1Tq, PTS 段占 6Tq, PBS1段占 5Tq, PBS2 段占 7Tq。相位缓冲段有两个,其中夹住的时间点就是采样时间点,硬件设备在这个时间点上对电平进行采样获取当前比特位状态为1或0,通过控制各段的长度,可以对采样点的位置进行偏移,以便准确地采样(同步的原理)

各段作用介绍:

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

PTS段/传播时间段:这个时间段是用于补偿网络的物理延时时间。一般是信号在总线上传播时间的两倍。PTS 段的大小可以为 1~8Tq。

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

PBS2段 /缓冲段2:同样用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以缩短。PBS1 段的初始大小可以为 2~8Tq。

2.2比特率和波特率(略)

比特率(bit/s):每秒钟传输的二进制码元的数量 

波特率(symbol/s):每秒钟传输的有效信息码元的数量

CAN通信中,比特率等于波特率,因为有效信息码元直接对应二进制码元。总线上的各个通讯节点只要约定好 1 个 Tq 的时间长度以及每一个数据位占据多少个 Tq,就可以确定 CAN 通讯的波特率。例如,假设上图中的 1Tq=1us,而每个数据位由 19 个 Tq 组成,则传输一位数据需要时间 T1bit=19us,从而每秒可以传输的数据位个数为:1x10次方/19 = 52631.6 (bps)

这个每秒可传输的数据位的个数即为通讯中的波特率。

十六进制字符编码中,如果一秒传输1000个字符,每个字符对应一种唯一的电平信号,那么波特率就是1000symbol/s;由于一个十六进制字符要用四位二进制编码表示,那么它的比特率就是4000bit/s

2.3同步

CAN 的数据同步分为硬同步和重新同步。硬同步只在“帧起始信号”时起作用,为确保之后续一连串的位时序都是同步的,需要重新同步。

硬同步:当某CAN节点要通过总线发送数据时,会发送一个表示通讯起始的信号 (即帧起始信号),该信号是一个由高变低的下降沿。而挂载到 CAN 总线上的通讯节点在不发送数据时,会时刻检测总线上的信号。当总线出现帧起始信号且某节点检测到总线的帧起始信号不在节点内部时序的 SS 段范围时,会判定它自己的内部时序与总线不同步,因而这个状态的采样点采集得的数据是不正确的。所以节点会通过硬同步的方式,把自己的位时序中的 SS 段平移至总线出现下降沿的部分,获得同步,同步后采样点就可以采集得正确数据了。
image.png

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

image.png

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

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

2.3CAN 的报文种类及结构

2.3.1 报文的种类

CAN 使用的是两条差分信号线,只能表达一个信号,简洁的物理层决定了 CAN 必然要配上一套更复杂的协议,如何用一个信号通道实现同样、甚至更强大的功能呢?CAN 协议给出的解决方案是对数据、操作命令 (如读/写) 以及同步信号进行打包,打包后的这些内容称为报文。在原始数据段的前面加上传输起始标签、片选 (识别) 标签和控制标签,在数据的尾段加上 CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签起到了协同传输的作用。当整个数据包被传输到其它设备时,只要这些设备按格式去解读,就能还原出原始数据,这样的报文就被称为 CAN 的“数据帧”。为了更有效地控制通讯,CAN 一共规定了 5 种类型的帧,它们的类型及用途说明如表(略) 

image.png

 2.3.2数据帧的结构

image.png

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

仲裁段:仲裁段的内容主要为本数据帧的 ID 信息 (标识符),数据帧具有标准格式和扩展格式两种,标准格式的 ID 为 11 位,扩展格式的 ID 为 29 位。在 CAN 协议中, ID 的作用有两个:

①决定数据帧发送的优先级,当同时有多个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,已知总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平,CAN 正是利用这个特性进行仲裁,若两个节点同时竞争 CAN 总线的占有权,当它们发送报文时,若首先出现隐性电平,则会失去对总线的占有权,进入接收状态。

②决定其它节点是否会接收这个数据帧,通过滤波器与掩码配置接收设备可以过滤和匹配出想要接收的信息

过滤器的模式:
列表模式:把要接收报文的 ID 列表,要求报文 ID 与列表中的某一个标识符完全相同才可以接收
掩码模式:把可接收报文 ID 的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码 (关键字) 相同,就符合要求,报文就会被保存到接收FIFO(储存器)
掩码原理:指定要判断的几个位为1(屏蔽码),只要屏蔽码位置的相同,接收报文

以CANID作为匹配规则。标准格式中的CANID长度为11b,即CAN ID最大为0x7ff,对于一个CAN ID为0x114,如果要配置一个滤波器只接收这个CAN D的的话,就需要配置滤波器过滤目标为0x114,掩码为0x7ff。流程就是把掩码变成二进制01串,为1的位要与过滤目标一致段CAN ID为0x114~0x117,如果我要配置一个滤波器只接收这一段CAN ID的的话,就需要配置滤波器过滤目标为0x114,掩码为0x7fc。也就是把掩码变成二进制01串,为1的位要与过滤目标一致。

RTR位:用于区分数据帧和遥控帧的,显性电平表示数据帧,隐性电平表示遥控帧。

IDE位:用于区分标准格式与扩展格式,显性电平表示标准格式,隐性电平表示扩展格式。

SRR位:只存在于扩展格式,用于替代标准格式中的 RTR位。由于扩展帧中的 SRR 位为隐性位,RTR 在数据帧为显性位,所以在两个 ID 相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。

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

数据段数据段为数据帧的核心内容,是节点要发送的原始信息,由 0~8 个字节组成(每一个字节是一个uint8,定义uint8_t TX_data[8]数组用于存放数据),MSB 先行(数据在计算机里面都是二进制存储的,二进制的最高位为MSB为最左侧的bit,最低位是LSB为最右侧的bit)

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

ACK 段:ACK 段包括ACK 槽位和 ACK 界定符位。在 ACK 槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答,当发送节点接收到ACK段为显性位时判定为成功接收。在 ACK 槽和帧结束之间由 ACK 界定符间隔开。、

EOF 段:译为帧结束,帧结束段由发送节点发送的 7 个隐性位表示结束。

2.3.3其它报文的结构(略)

image.png

image.png

2.4 工作模式

(1)正常模式: 正常接收发送数据
(2)静默模式: 只可以向总线发送数据1,可以接收数据
(3)回环模式: 发送的数据直接到输入和总线,不可接收数据
(4)回环静默模式:发送的数据只能到输入,不可接收数据

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值