CAN通讯协议层--秉火STM32学习笔记

首先非常感谢秉火团队为我们提供学习STM32的丰富资料及详细教程,此笔记仅用作个人学习记录,以此加深记忆,如果读者也喜欢,请一同感谢并支持秉火团队。
1. CAN 的波特率及位同步
由于CAN 属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口异步通讯那样,节点间使用约定好的波特率进行通讯,特别地,CAN 还会使用“位同步”的方式来抗干扰、吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。位时序分解
为了实现位同步,CAN 协议把每一个数据位的时序分解成如下图 所示的SS 段、PTS 段、PBS1 段、PBS2 段,这四段的长度加起来即为一个CAN 数据位的长度。分解后最小的时间单位是Tq,而一个完整的位由8~25 个Tq 组成。为方便表示,图 42-5 中的高低电平直接代表信号逻辑0 或逻辑1(不是差分信号)。
在这里插入图片描述
该图中表示的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 通讯的波特率。
例如,假设上图中的1Tq=1us,而每个数据位由19 个Tq 组成,则传输一位数据需要时间T1bit =19us,从而每秒可以传输的数据位个数为:
1x106/19 = 52631.6 (bps)
这个每秒可传输的数据位的个数即为通讯中的波特率。
同步过程分析
波特率只是约定了每个数据位的长度,数据同步还涉及到相位的细节,这个时候就
需要用到数据位内的SS、PTS、PBS1 及PBS2 段了。
根据对段的应用方式差异,CAN 的数据同步分为硬同步和重新同步。其中硬同步只是当存在“帧起始信号”时起作用,无法确保后续一连串的位时序都是同步的,而重新同步方式可解决该问题,这两种方式具体介绍如下:
(1) 硬同步
若某个CAN 节点通过总线发送数据时,它会发送一个表示通讯起始的信号(即帧起始信号),该信号是一个由高变低的下降沿。而挂载到CAN 总线上的通讯节点在不发送数据时,会时刻检测总线上的信号。
如下图可以看到当总线出现帧起始信号时,某节点检测到总线的帧起始信号不在节点内部时序的SS 段范围,所以判断它自己的内部时序与总线不同步,因而这个状态的采样点采集得的数据是不正确的。所以节点以硬同步的方式调整,把自己的位时序中的SS段平移至总线出现下降沿的部分,获得同步,同步后采样点就可以采集得正确数据了。
在这里插入图片描述
(2) 重新同步
前面的硬同步只是当存在帧起始信号时才起作用,如果在一帧很长的数据内,节点信号与总线信号相位有偏移时,这种同步方式就无能为力了。因而需要引入重新同步方式,它利用普通数据位的高至低电平的跳变沿来同步(帧起始信号是特殊的跳变沿)。重新同步与硬同步方式相似的地方是它们都使用SS 段来进行检测,同步的目的都是使节点内的SS段把跳变沿包含起来。
重新同步的方式分为超前和滞后两种情况,以总线跳变沿与SS 段的相对位置进行区分。第一种相位超前的情况如下图 ,节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前2Tq,这时控制器在下一个位时序中的PBS1 段增加2Tq 的时间长度,使得节点与总线时序重新同步。
在这里插入图片描述
2. CAN 的报文种类及结构
报文的种类
在原始数据段的前面加上传输起始标签、片选(识别)标签和控制标签,在数据的尾段加上CRC 校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包好,就可以用一个通道表达各种信号了,各种各样的标签就如同SPI 中各种通道上的信号,起到了协同传输的作用。
为了更有效地控制通讯,CAN 一共规定了5 种类型的帧。

帧类型帧用途
数据帧用于节点向外传输数据
遥控帧用于向远端节点传输数据
错误帧用于向远端节点通知校验错误,请求重新发送上一个数据
帧间隔用于将数据帧及遥控帧与前面的帧分离开来

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

帧起始SOF 段(Start Of Frame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平,它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。
仲裁段当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称的由来。 仲裁段的内容主要为本数据帧的ID 信息(标识符),数据帧具有标准格式和扩展格式两种,区别就在于ID 信息的长度,标准格式的ID 为11 位,扩展格式的ID 为29 位,它在标准ID 的基础上多出18 位
RTR位位(Remote Transmission Request Bit),译作远程传输请求位,它是用于区分数据帧和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。
IDE 位(Identifier Extension Bit),译作标识符扩展位,它是用于区分标准格式与扩展格式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。
SRR 位(Substitute Remote Request Bit),只存在于扩展格式,它用于替代标准格式中的RTR 位。由于扩展帧中的SRR 位为隐性位,RTR 在数据帧为显性位,所以在两个ID相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。
控制段在控制段中的r1 和r0 为保留位,默认设置为显性位。它最主要的是DLC 段(DataLength Code),译为数据长度码,它由4 个数据位组成,用于表示本报文中的数据段含有多少个字节,DLC 段表示的数字为0~8。
数据段数据段为数据帧的核心内容,它是节点要发送的原始信息,由0~8 个字节组成,MSB先行。
CRC 段为了保证报文的正确传输,CAN 的报文包含了一段15 位的CRC 校验码,一旦接收节点算出的CRC 码跟接收到的CRC 码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC 部分的计算一般由CAN 控制器硬件完成,出错时的处理则由软件控制最大重发数。在CRC 校验码之后,有一个CRC 界定符,它为隐性位,主要作用是把CRC 校验码与后面的ACK 段间隔起来。
帧结束EOF 段(End Of Frame),译为帧结束,帧结束段由发送节点发送的7 个隐性位表示结束。

关于其它的CAN 报文结构如下表
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值