当前位置: 首页 > news >正文

CAN的协议层

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

这个“位同步”很重要,后面会讲

位时序分解

为了实现位同步,CAN协议把每一个数据位的时序分解成如图CAN位时序分解图所示的

SS段,PTS段,PBS1段,PBS2段,这四段的长度加起来即为一个CAN数据位的长度,分解后最小的时间单位是Tq,而一个完整的位是由8~25个Tq组成的。

我们这个高低电平就直接当成逻辑0和1吧,

我们这个图中的CAN通讯信号每一个数据位的长度为19Tq,其中SS段是1Tq,PTS段是6Tq,PBS1段是5Tq,PBS2段是7Tq。

信号的采样点位于PBS1段和PBS2段之间,通过控制各段的长度,可以对采样点的位置进行偏移。以便于更准确的采样。

各段的作用如介绍下:

(1)SS段(SYNC SEG)

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

(2)PTS段(PROP SEG)

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

(3)PBS1段(PHASE SEG1)

PBS1译为相位缓冲段,主要用来补偿边沿阶段的误差,它的时间长度在重新同步的时候可以加长

PBS1的初始大小可以为1~8Tq。

(4)PBS2段(PHASE SEG2)

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

通讯的波特率

总线上的各个通讯节点只要约定好1个Tq的时间长度以及每一个数据位占据多少个Tq,就可以确定CAN通讯的波特率。

例如我们上面1Tq = 1us,而每个数据位由19个Tq组成,则传输一位数据需要时间T = 19us,

我们每秒可以传输的数据位个数就是:

1*10^6 us /19 =52631.6(bps)

这就是它的波特率。

同步过程分析

波特率只是约定了每个数据位的长度,数据同步还涉及到相位的细节,这个时候就需要用到数据位内的SS,PTS,PBS1及PBS2段了。

根据对段的应用方式差异,CAN的数据同步分为硬同步和重新同步。其中硬同步只是当存在“帧起始信号”时起作用,无法确保后续一连串的位时序都是同步的,而重新同步方式可解决该问题,这两种方式具体介绍如下:

(1)硬同步

若某个CAN节点通过总线发送数据时,它会发送一个表示通讯起始的信号(帧起始信号),该信号是一个由高到低的下降沿。而挂载在CAN总线上的通讯节点在不发送数据时,会时刻检测总线上的信号。

看上面这个硬同步过程图,我们可以看到当总线上出现帧起始信号的时候,我们某节点检测到总线的帧起始信号不在节点内部时序的SS段,所以我们判断到它自己的内部时序与总线不同步,因此我们这个采样到的数据是不正确的。所以节点以硬同步的方式调整,把自己的位时序中的SS段平移至总线出现下降沿的部分,获得同步,同步后采样点就可以采集地正确数据了。

(2)重新同步

前面的硬同步只是当存在帧起始信号时才起作用,如果在一帧很长的数据内,节点信号和总线信号相位有偏移时,这种同步方式就无能为力了。

因而需要引入重新同步方式,它利用普通数据位的高至低电平的跳变沿来同步(帧起始信号是特殊的跳变沿),它和硬同步相似的地方都是使用SS段来检测,同步的目的都是使节点内的SS段把跳变沿包含出来。

重新同步的方式分为超前和滞后两种情况,以总线跳变沿与SS段的相对位置进行区分。第一种相位超前的情况就如下图所示,节点从总线的边沿跳变中,检测到它内部的时序比总线的时序相对超前2Tq,这时候我们控制器在下一个位时序中的PBS1段增加2Tq的时间长度

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

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

CAN的报文种类及结构

(1)报文的种类

有五种,如下所示:数据帧  遥控帧 错误帧 过载帧 帧间隔

数据帧的结构

数据帧是在CAN通讯中最主要,最复杂的报文

数据帧是以一个显性位(逻辑0)开始,以七个连续的隐形位(逻辑1)结束

它们之间有仲裁段  控制段 数据段 CRC段 ACK段

1.帧起始

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

2.仲裁段

当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包被传输。

仲裁段的内容主要为本数据帧的ID信息(标识符),数据帧有标准数据帧和扩展数据帧两种,区别就在于ID信号的长度,标准格式是11位,扩展的有29位,它在标准的基础上多出来18位。

报文的优先级,是通过ID的仲裁来决定的,总线上出现显性电平和隐性电平,总线的状态会被置位显性电平,当我们发送报文的时候,首先出现了隐性电平,就失去了总线的占有权,进入了接收状态,如上图所示。

我们看数据帧结构中除了报文ID还有RTR,IDE和SRR位。

(1)RTR位,它用来区分数据帧还是遥控帧。显性电平就是数据帧,隐性电平是遥控帧。

(2)IDE位,它是用来区分数据标准帧和数据扩展帧的,显性就是标准,隐性就是扩展帧。

(3)SRR位,只存在扩展帧,它用来替代了RTR位,它是隐性电平的,标准帧的RTR是显性,所以我们的标准帧比扩展帧优先级更高。

3.控制段

图错了 ,标准帧的IDE应该是r1,我们的r1和r0为保留位,默认设置为显性位。他最主要的是DLC段,由4个数据位组成,用于表示本报文中的数据段含有多少个字节,DLC段表示的数字为0~8.

4.数据段

它是节点要发送的数据,由0~8个字节组成,MSB先行。

5.CRC段

为了保证数据的正常传输,CAN报文中包括了一段15位的CRC校验码,如果我们接收节点算出的CRC校验码和接收到的CRC码不同,那么就会向发送节点反馈出错信息,利用错误帧请求它重新发送。

CRC的部分一般由CAN控制器硬件完成,出错的时候,我们软件控制最大重发数。

在CRC校验码后面有一个CRC界定符它是隐性位,是为了和后面的ACK分隔开。

6.ACK段

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

7.帧结束

EOF段,由发送节点发送的7个隐性位表示结束

关于其他CAN报文结构就如下图

相关文章:

  • Windows批处理数值计算实战
  • Twitter Api查询用户粉丝列表
  • vue 使用自定义标签URL Protocol 调用本地exe 并传参
  • Pycharm+Neo4j红楼梦人物关系图谱
  • Golang 开发实战day07 - Functions
  • 关于在PyCharm中使用虚拟环境
  • 04 - 7 段 16 进制数码管显示
  • DIY蓝牙键盘(1) - 理解 键盘报文(免费)
  • JAX深度学习库入门
  • JS实现双向数据绑定的三种方式
  • 面试题:RabbitMQ 消息队列中间件
  • 基于ssm的轻型卡车零部件销售平台(java项目+文档+源码)
  • 站群服务器如何提高搜索引擎排名
  • Linux中部署Java jar 包 shell 脚本
  • Excel中文显示问号
  • hexo+github搭建个人博客
  • 时间复杂度分析经典问题——最大子序列和
  • LeetCode18.四数之和 JavaScript
  • leetcode388. Longest Absolute File Path
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • python学习笔记-类对象的信息
  • Service Worker
  • 你真的知道 == 和 equals 的区别吗?
  • 前嗅ForeSpider采集配置界面介绍
  • 物联网链路协议
  • 学习笔记TF060:图像语音结合,看图说话
  • C# - 为值类型重定义相等性
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #### go map 底层结构 ####
  • #13 yum、编译安装与sed命令的使用
  • #图像处理
  • %check_box% in rails :coditions={:has_many , :through}
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1)(1.9) MSP (version 4.2)
  • (1)常见O(n^2)排序算法解析
  • (3)选择元素——(17)练习(Exercises)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (pojstep1.3.1)1017(构造法模拟)
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (论文阅读11/100)Fast R-CNN
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (转)Linux下编译安装log4cxx
  • (转)winform之ListView
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .Net 6.0 处理跨域的方式
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表