CAN总线通信协议学习2——数据链路层之帧格式

1 帧格式

帧格式可理解为定义了传输的数据(叫报文)应该“长什么样”来传输,也为后续设定一些规则如错误检查机制提供了思路。


 

首先,帧格式可分为以下5种类型:

PS:CAN总线任意一个设备可当收可当发CAN总线有两种数据传输方式:广播式和请求式。

广播式:CAN其中一个设备其不断地发送报文到总线上,连接到总线上的其他设备“想收就收”。

请求式:CAN中哪个设备有收数据的需求,向发数据方发送一个请求,发数据方收到请求后,才发送报文到总线上。

1.1 数据帧

数据帧有两种格式:标准格式和扩展格式

图上的数字:代表每一段对应的所占的位数,不是点电平逻辑!(黑色粗线才是逻辑电平)

颜色解释:看图的最底下,无论是标准格式还是扩展格式,灰色代表逻辑0,白色代表逻辑1,紫色代表可0可1,ACK位槽特殊情况白色灰色各占一半,规定发送方必须白色即发送逻辑1,接收方必须发送逻辑0

1.1.1 标准格式:

(1)SOF段之前段(帧起始前):总线空闲,上一章提到,高速CAN空闲为1(黑色粗线为逻辑电平1)。

(2)SOF(帧起始):必须为0,表示开始发送了,要与帧之前空闲时1区别,故必须为0;

(3)ID:报文ID共11位,紫色,则视具体情况而定

(4)RTR:远程请求标志位,用于区分数据帧(为0)还是遥控帧(为1),现在是数据帧,如必须为0;

(5)IDE:用于区分标准格式(为0)还是扩展格式(为1),这里为标准格式,故必须为0

(6)r0:保留位,还未用到,为了以后可能升级用,目前先固定设为0。

(7)DLC:表示数字段的长度,数据段要多少字节

(8)DATA:就是传输的数据

(9)CRC:校验算法,会对SOF到DATA的数进行自动检验,得到一个检验码存在这个位置。

(10)CRC界定符:设定为逻辑1

(11)ACK段:ACK槽——ACK界定符:ACK槽为发送方必须白色即发送逻辑1,接收方必须发送逻辑0(同时),ACK界定符设定为逻辑1。(理解:这段可认为是发送方和接收方操作总线权力短暂交接的过程,ACK段前后都是发送方在操作总线,ACK段则是接收方在操作总线,目的是为了让发送方方知道有设备接收了,ACK槽前后要留有权力交接的时间,故设定了CRC界定符和ACK界定符,CRC界定符为逻辑1,发送方释放总线,若有设备接收了,那么ACK槽就会接收方拉下总线,故会出现逻辑0,这样发送方就知道有设备接收到了,接收方发出应答后,又要交出总线的控制权,故接收方在ACK界定符上要发逻辑1,释放总线。)

PS:

  • 数据的应答是一位一位进行的,而不是等所有数据传输完,接收方才来应答。
  • ACK段可多个设备同时拉下总线。

(13)EOF(帧结束):设定为7个逻辑1,表示帧结束了。

1.1.2 扩展格式:

扩展格式是因为ID段不够用用了,所以要加ID段的位数。

扩展格式为了要与标准格式的兼容,再碰到IDE位前,系统也不知道是标准格式还是扩展格式,因此,IDE前的两种格式的解析方式,位数等必须一致(除了帧起始,扩展格式没有),遇到IDE后,则可分标准格式解析还是扩展格式解析,即两种格式可以不一样了。


所以,看到红色框内,即遇到IDE前,先都是11位ID。

此后,标准格式为RTR位+IDE,为了与之一样,扩展格式位SSR+IDE,其实SSR是无用的,强制设定为1,为的是与标准格式的RTR位对应。

遇到IDE位后,扩展格式加进了18位ID,后与标准格式RTR位开始完全一致。

1.2 遥控帧

看结构,遥控帧无数据段(DATA),RTR为隐性电平1(与数据帧区分),其他部分与数据帧相同。

这样理解:遥控帧是请求式,说明接收方向发送方请求发送,那自然没有数据,故没有数据段。

而当是请求式时,需要数据帧和遥控帧配合,先遥控帧(配有一个ID)发出给发送方,发送方收到后,以相同ID报文且用数据帧来发送数据,根据后续仲裁规则,当具有相同ID数据帧和遥控帧同时发送时,数据帧优先,则接收方可以收到数据。

1.3 错误帧

总线上所有设备都会监督总线的数据,错误”或“格式错误”或“应答错误”,这些设备便会发出错误帧来破坏数据,同时终止当前的发送设备

设备默认处于主动错误状态,当某设备处于主动状态时发生的错误太多,就会进入被动错误状态。但无论是哪种状态,但是设备不会乱发错误帧,是当某设备检测出有错误时,该设备才会发出错误帧,即图示错误帧的波形

设备处于主动状态时发出的错误帧的波形为:6个显性位(逻辑0)+6个显性位(逻辑0)【用于延迟】+错误界定符(固定8个逻辑1)

理解:当总线上某一个设备处于主动状态发现错误时,发出6个0,相当于拉下总线,当总线上的传输的数据有1时就会被破换掉,因为0强于1(之前提到),那么最终其他设备收到的数据就被破换掉了。


设备处于被动错误状态时发出的错误帧波形为:6个隐性位(逻辑1)+6个隐性位(逻辑1)【用于延迟】+错误界定符(固定8个逻辑1)

理解:当总线上某一个设备处于被动状态发现错误时,发出6个1,相当于放开总线,就相当于自己这个设备自己破坏自己发的数据,但不破坏总线上别人发的数据(因为总线上数据是1的话就没影响,是0的话,0强于1也没影响)。


  • 两种错误帧都有6位用于延迟:是因为当某一设备发出错误帧时,可能会引起其他设备也出现错误,那么其他设备也可能发错误帧,相当于给一个延迟时间,在来通过界定符来表示结束。
  • 有的同学可能回想,主动发出的错误帧时,发出了六个0,如果刚好总线上的数据也是6个0,那不是没有破换掉数据?或者说不知道是错误帧还是数据,这种情况其实是不可能发生的!!!,连续出现6个0或者6个的情况只能是错误帧,因为CAN还设定了位填充规则(文章末尾)。

1.4 过载帧

当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失。

可以这样理解:因为发送方的发送频率是其自己决定的,当接收方接收不过来的时候,接收方就可以发出一个过载帧来破坏掉这个数据(过载帧和错误帧类似,连续发送了6个0,我们说错误帧的时候提到过这样会破坏数据),发送方的数据没被收到,那么发送方就会重试,那么,破坏和重试这个过程所用的时间就相当于给接收方延迟,让它有机会慢点收数据。(或者如果发送方有相应的处理机制,收到过载帧后就会调整发送频率)。

过载帧形式:6个显性(逻辑0)+延迟一部分(未确定具体多少位0)+过载界定符(8个1)。

1.5 帧间隔

帧间隔的作用是将数据帧和远程帧与前面的帧分离开。

比如:当设备连续发送数据帧时,需要有帧间隔把这些数据帧分离开。

帧间隔也分主动状态和被动状态。

图上方为主动状态:3位隐性电平(逻辑1)+ 总线空闲(n位逻辑1)

图下方为被动状态:3位隐性电平(逻辑1)+ 延迟传送(8位逻辑1)+ 总线空闲(n位逻辑1)

2 位填充

数据帧和遥控帧发送到总线前其实是进行了位填充再发送到总线上的。

位填充规则:发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据。


以下通过下图几个例子来理解:

“即将发送”表示设备要发出去的数据,”移除填充后”是接收方实际接受到的数据,可以看到,以下三个例子这两项都是对应一样的。

第一组:

要发送的数据是100000110,根据位填充规则,连续发送了5个0后,要在他后面追加一个相反电平1,如“实际发送”/“实际接收”所示,接收方最终接收的数据又会把这个追加的1移除。

第二组:

要发的是10000011110,同样,连续5个0后补1得到100000111110,发现补了一个1后又出现了连续5个1的情况,则在后续再追加一个0得到1000001111100,最后实际接收会把这两个填充位都移除。即:位填充插入的数据位,要和原始数据后续的数据位合并,进行新的位填充判定。

第三组:

要发011111111110,连续5个1后补0得到0111110111110,根据第二组得到的规则,追加的0要和后续的位数一起进行为位填充规则判定,发现无连续0,但原始数据中,又出现5个1,0111110111110,故补0得到:01111101111100,同样,最后实际接收会把这两个填充位都移除。

位填充作用:

  • 增加波形的定时信息,利于接收方执行“再同步”,防止波形长时间无变化,导致接收方不能确掌握数据采样时机。
  • 将正常数据流与“错误帧”和“过载帧”区分开,标志“错误帧”和“过载帧”的特异性。(就是我们前面讲错误帧时提到的,不可能在总线上传输的数据出现连续6个相同电平,如果出现,必是错误帧或过载帧)
  • 保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲。(CAN总线规定,当出现11个1后表示CAN总线处于空闲状态,由上面例子的第三组可以看到,传输的数据不可能是连续11个1的情况,出现了则必是表示CAN总线处于空闲状态。)

注:以上均是通过学习参考文献、哔哩哔哩网站上江协科技官方号以及网络资源所得的个人经验,如有侵权,请联系我,欢迎指正。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB中asManyOfPattern函数用法

目录 语法 说明 示例 匹配尽可能多的模式实例 指定要匹配的最小模式数 指定要匹配的最小和最大模式数 asManyOfPattern函数的功能是模式匹配次数尽可能多。 语法 newpat asManyOfPattern(pat) newpat asManyOfPattern(pat,minPattern) newpat asManyOfPattern(pat,m…

1×1卷积的作用与原理详解

11卷积的作用与原理详解 文章目录 11卷积的作用与原理详解引言1. 什么是11卷积?2. 11卷积的数学表达3. 11卷积的主要作用3.1 改变通道数(升维/降维)3.1.1 降维(Dimension Reduction)3.1.2 升维(Dimension I…

网络配置的基本信息

目录 一、网络接口信息 1、关闭虚拟化服务 2、配置临时IP 3、配置静态IP 4、常见网络命令 5、安装Wireshark 一、网络接口信息 输入 ip address,会出现下面的内容 网卡名称及其含义: 网卡名称说明lo 表示本地回环地址。 ens32 有线网卡&#xff0c…

dify绑定飞书多维表格

dify 绑定飞书和绑定 notion 有差不多的过程,都需要套一层应用的壳子,而没有直接可以访问飞书文档的 API。本文记录如何在dify工具中使用新增多条记录工具。 创建飞书应用 在飞书开放平台创建一个应用,个人用户创建企业自建应用。 自定义应…

深入解析Crawl4AI:为AI应用量身定制的高效开源爬虫框架

引言 在当今数据驱动的时代,人工智能(AI)和大型语言模型(LLM)的发展对高质量数据的需求日益增长。如何高效地从互联网上获取、处理和提取有价值的数据,成为了研究人员和开发者面临的关键挑战。Crawl4AI作为…

nginx 动态计算拦截非法访问ip

需求:在Nginx上实现一个动态拦截IP的方法,具体是当某个IP在1分钟内访问超过60次时,将其加入Redis并拦截,拦截时间默认1天。 技术选型:使用NginxLuaRedis的方法。这种方案通过Lua脚本在Nginx处理请求时检查Redis中的黑…

【软件测试】论坛系统功能测试报告

文章目录 1.前言2.项目介绍3. 对项目进行测试3.1 设计测试用例3.2 执行测试用例 1.前言 这次测试是我学习阶段的练习,由于缺少需求规格说明等文档,需要我尽可能发散思维去设计更多的测试用例。但无论如何测试至关重要,以下是核心原因&#x…

MyBatis TypeHandler 详解与实战:FastJson 实现字符串转 List

在 MyBatis 中&#xff0c;TypeHandler 是实现 Java 类型与数据库类型双向转换 的核心组件。无论是处理基础数据类型还是复杂的 JSON、枚举或自定义对象&#xff0c;它都能通过灵活的扩展机制满足开发需求。本文将通过一个 将数据库 JSON 字符串转换为 List<User> 的案例…

《HelloGitHub》第 107 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

【每日一题 | 2025】2.24 ~ 3.2

个人主页&#xff1a;Guiat 归属专栏&#xff1a;每日一题 文章目录 1. 【2.24】P10424 [蓝桥杯 2024 省 B] 好数2. 【2.25】P8665 [蓝桥杯 2018 省 A] 航班时间3. 【2.26】P10905 [蓝桥杯 2024 省 C] 回文字符串4. 【2.27】P10425 [蓝桥杯 2024 省 B] R 格式5. 【2.28】P10426…

【03】STM32F407 HAL 库框架设计学习

【03】STM32F407 HAL 库框架设计学习 摘要 本文旨在为初学者提供一个关于STM32F407微控制器HAL&#xff08;Hardware Abstraction Layer&#xff09;库框架设计的详细学习教程。通过本文&#xff0c;读者将从零开始&#xff0c;逐步掌握STM32F407的基本知识、HAL库的配置步骤…

跟着官方文档学习UE C++ TArray容器系列 迭代 和 排序

一.首先测试下&#xff0c;官方案例 迭代器的方法&#xff0c;有点不常见。有点像个指针&#xff0c;迭代完还自带break. oid AWXTArrayActor::WXLoopArray() {FString JoinedStr1;FString JoinedStr2;TArray<FString> StrArr { "Hello","Baby",&q…

C++中的“结界”机制:作用域与变量可见性探秘

一、编程世界的“结界”概念 源自佛学的结界概念&#xff0c;在C中体现为作用域机制。程序中的每个函数都会形成独立的作用域屏障&#xff0c;如同魔法结界般保护内部变量&#xff0c;使其与外界的同名变量互不干扰。这种机制保证了代码模块的独立性和安全性&#xff0c;但当存…

3-6 WPS JS宏 工作表移动复制实例-1(工作表的拆分操作)学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…

Qt 对象树详解:从原理到运用

1. 什么是对象树&#xff1f; 对象树是一种基于父子关系的对象管理机制。在 Qt 中&#xff0c;所有继承自 QObject 的类都可以参与到对象树中。 当一个对象被设置为另一个对象的父对象时&#xff0c;子对象会被添加到父对象的内部列表中&#xff0c;形成一种树状结构。 Qt 提…

使用hutool将json集合对象转化为对象

集合之间相互转化 //List转Json&#xff0c;maps是List类型的参数 String json JSONUtil.toJsonStr(maps); System.out.println("这是json字符串: "json);//Json转List JSONArray objects JSONUtil.parseArray(json); List<Map> maps1 JSONUtil.toList(objec…

Qt关于平滑滚动的使用QScroller及QScrollerProperties类说明

一、触控时代的滚动工具&#xff1a;QScroller类设计介绍 1.1 从机械滚轮到数字惯性 在触控设备普及前&#xff0c;滚动操作如同老式打字机的滚轴&#xff0c;只能通过鼠标滚轮或滚动条进行离散式控制。QScroller的出现如同给数字界面装上了"惯性飞轮"&#xff0c;…

JavaAPI(网络编程)

网络通信协议 通信协议 ‌所谓通信协议&#xff0c;是指通信双方在进行数据交换时必须遵守的规则和约定。‌这些规则确保了双方能够有效地进行通信&#xff0c;实现信息的交换和资源共享。通信协议定义了传输时的数据格式、控制信息以及传输顺序和速度等&#xff0c;确保双方…

Java---入门基础篇(下)---方法与数组

前言 本篇文章主要讲解有关方法与数组的知识点 ,是基础篇的一部分 , 而在下一篇文章我会讲解类和对象的知识点 入门基础篇上的链接给大家放在下面啦 ! Java---入门基础篇(上)-CSDN博客 感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb; 欢迎各位大佬指点…

Python 爬虫 – BeautifulSoup

Python 爬虫&#xff08;Web Scraping&#xff09;是指通过编写 Python 程序从互联网上自动提取信息的过程。 爬虫的基本流程通常包括发送 HTTP 请求获取网页内容、解析网页并提取数据&#xff0c;然后存储数据。 Python 的丰富生态使其成为开发爬虫的热门语言&#xff0c;特…