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报文结构就如下图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/514640.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker实战教程 第2章 Docker基础

3-1 Docker介绍 什么是Docker 虚拟化,容器 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上&…

【活动预告】SLMOps 系列(三)|SLMOps 的最后一公里 - 模型评估技巧

点击蓝字 关注我们 编辑:Alan Wang 排版:Rani Sun 2023年,Azure OpenAI Service 引领了 AI 2.0 时代的热潮,各行业企业都在 AI 模型的探索与应用中持续发力。相比复杂度更高的大模型,有时候轻量且高效的小模型&#xf…

【windows自带exe】使用`findstr.exe`来搜索包含某个字符串的文件

【windows自带exe】使用findstr.exe来搜索包含某个字符串的文件 写在最前面什么是findstr.exe?如何使用findstr.exe查找文件中的字符串?示例:查找JSP文件中包含"jsonp"的文件 注意事项小结 🌈你好呀!我是 是Yu欸 &…

基于Python的简单颜色替换

当我们临时需要改变一个照片的颜色,使其符合我们想要的主题色时,对于不会PS的我就只能使用一下Python来实现这个简单的过程 比如我想要中国农大农学院的院徽,但在官网上提取出来的图片是白色的 而我想要符合农学主题的绿色,将图片…

go juc 线程中的子类

1.go test() 主死随从 package mainimport ("fmt""strconv""time" )func test() {for i : 1; i < 10; i {fmt.Println("hello " strconv.Itoa(i))//阻塞time.Sleep(time.Second)} } func main() {//开启协程go test()for i : 1; …

使用pip安装geopandas(24.4更新)

geopandas是我们用Python进行地理分析常用的库&#xff0c;在数据处理、分析、制图等场景中有着极为广泛的应用&#xff0c;但是在安装过程中会出现各种问题。​geopandas的安装方式有很多&#xff0c;今天我们选取较为简单的pip来进行geopandas的安装。 ​首先&#xff0c;我…

Java多态世界(day18)

多态&#xff1a;重写的方法调用和执行 1.静态绑定&#xff1a;编译器在父类中找方法&#xff0c;如&#xff1a; 上面的eat&#xff08;&#xff09;方法是先在父类中找方法&#xff0c;父类没有的话&#xff0c;就算子类有编译也会报错。&#xff08;如果引用方法在父类中存…

深度学习:神经网络模型的剪枝和压缩简述

深度学习的神经网路的剪枝和压缩&#xff0c;大致的简述&#xff0c; 主要采用&#xff1a; network slimming&#xff0c;瘦身网络... 深度学习网络&#xff0c;压缩的主要方式&#xff1a; 1.剪枝&#xff0c;nerwork pruing&#xff0c; 2.稀疏表示&#xff0c;sparse rep…

React + 项目(从基础到实战) -- 第三期

react内置hooks useState 如何让页面动起来(实时更新) import React,{FC,useState} from "react";const Demo:FC()>{let count0; //普通js变量无法触发组件更新function add(){count;console.log("count: ",count);}return <div><button onCl…

(免费分享)基于微信小程序自助停取车收费系统

本项目的开发和制作主要采用Java语言编写&#xff0c;SpringBoot作为项目的后端开发框架&#xff0c;vue作为前端的快速开发框架&#xff0c;主要基于ES5的语法&#xff0c;客户端采用微信小程序作为开发。Mysql8.0作为数据库的持久化存储。 获取完整源码&#xff1a; 大家点赞…

基于SpringBoot的“简历系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“简历系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 管理员登录界面图 用户管理界面图 简历模板管理界面图…

Ubuntu Desktop 安装有道词典

Ubuntu Desktop 安装有道词典 1. 有道词典2. Installation2.1. 解压 deb 包到 youdao 目录2.2. 解压 deb 包中的 control 信息 (包的依赖写在该文件里面)2.3. 编辑 control 文件&#xff0c;删除依赖里面的 gstreamer0.10-plugins-ugly2.4. 创建 youdaobuild 目录&#xff0c;重…

数据结构—红黑树

红黑树介绍 红黑树&#xff08;Red Black Tree&#xff09;是一种自平衡二叉查找树。由于其自平衡的特性&#xff0c;保证了最坏情形下在 O(logn) 时间复杂度内完成查找、增加、删除等操作&#xff0c;性能表现稳定。 在 JDK 中&#xff0c;TreeMap、TreeSet 以及 JDK1.8 的 …

2024-04-03 NO.4 Quest3 手势追踪抓取物体

文章目录 1 手势抓取方式1.1 Hand Grab1.2 Touch Hand Grab1.3 Distance Hand Grab 2 HandGrabExamples 示例场景2.1 Interactor 对象2.2 Interactable 对象2.2.1 父子结构2.2.2 “Hand Grab lnteractable” 脚本2.2.3 “Move Towards Target Provider” 脚本2.2.4 其他 Moveme…

C#编写MQTT客户端软件

主要参考C#MQTT编程06--MQTT服务器和客户端(winform版)_c#mqttserver-CSDN博客 但由于使用的.NET版本和MQTT库版本存在差异&#xff0c;因此有些不同。 MQTT协议内容在此不做描述&#xff0c;仅介绍VS使用C#的实现过程。本次使用VS2015&#xff0c;.netframwork4.6。 C#语言本身…

LeetCode每日一题之专题一:双指针 ——复写零

复写零OJ链接&#xff1a;1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 解法&#xff08;原地复写-双指针&#xff09;&#xff1a; 算法思路&#xff1a; 如果「从前向后」进⾏原地复写操作的话&#xff0c;由于 0 的出现会复写两次&#xff0c;导致…

无法打开pycharm虚拟环境

问题&#xff1a;在pycharm的terminal中执行pip命令&#xff0c;但是下载的包没有安装到该项目的虚拟环境中。 激活虚拟环境&#xff0c;打开terminal&#xff0c;执行myenv\Scripts\activate&#xff0c;显示执行出错 无法加载文件 D:\Project\RF_Project\venv\Scripts\acti…

1999-2022年各省研究与试验发展经费内部支出数据/研发经费内部支出数据/RD经费内部支出数据

1999-2022年各省研究与试验发展经费内部支出数据/研发经费内部支出数据/R&D经费内部支出数据 1、时间&#xff1a;1999-2022年 2、来源&#xff1a;整理自科技年鉴 3、指标&#xff1a;研究与试验发展经费内部支出/R&D经费内部支出/研发经费内部支出 4、范围&#…

Stable Diffusion 本地化部署

一、前言 最近在家背八股文背诵得快吐了&#xff0c;烦闷的时候&#xff0c;看到使用 AI 进行作图&#xff0c;可以使用本地话部署。刚好自己家里的电脑&#xff0c;之前买来玩暗黑4&#xff0c;配置相对来说来可以&#xff0c;就拿来试试。 此篇是按照 Github 上的 stable-d…

Leetcode 1143. 最长公共子序列

心路历程&#xff1a; 这道题还是按照之前公共子数组的角度去思考的话会超时&#xff0c;即考虑最后一个元素一定是公共子序列的最后一个元素。需要换一种建模思路&#xff0c;从而简化整个递推过程。 状态&#xff1a;以i, j为结尾的区间的最长公共子序列&#xff0c;text1[…