【CAN通讯系列5】CAN数据帧及其仲裁

在CAN通讯系列3-CAN通讯如何传递信号中,由于传递信号的分析需要,引出了CAN数据帧的ID,长度和数据段的概念,它们都与CAN协议帧相关。CAN协议帧有5种类型,如下表:

         

而我们当前使用到的是数据帧,故本文将根据CAN协议来介绍数据帧。

1 CAN数据帧

数据帧有标准和扩展两种格式,且这2种格式都具有相同的帧结构,都由7个段构成,分别是:帧起始,仲裁段,控制段,数据段,CRC段,ACK段和帧结束,如下所示:

图片

Source: CAN入门书,renesas

1.1 帧起始(SOF, Start of Frame)

帧起始表示帧开始的段,1个位的显性位。总线空闲时为隐性位,故帧起始以显性位可识别一帧数据开始发送,对于标准和扩展格式均如此:

图片

Source: CAN入门书,renesas

1.2 仲裁段(Arbitration Field)

仲裁段表示数据的优先级的段,其作用就是根据报文ID来确定其发送优先级,ID数值越小,其优先级越高。标准格式和扩展格式在此的构成有所不同,如下所示:

Source: CAN入门书,renesas

对于数据帧,标准格式和扩展格式区别主要有3点:

  • 长度,标准格式仲裁段有12位,而扩展格式仲裁段有32位;

  • ID数,标准格式最大有(2^11)个ID,而扩展格式最大有(2^29)个ID;

  • 格式标志RTR/SRR,如果是标准格式,则RTR/SRR为显性;如果是扩展格式,则RTR/SRR为隐性。

具体如何利用该段进行仲裁,看后面的仲裁机制章节。

1.3 控制段(Control Field)

控制段表示数据段的有效字节数,由6个位构成,标准格式和扩展格式的构成也有所不同。

图片

Source: CAN入门书,renesas

这里只关注4位数据长度码DLC,DLC与数据的字节数对应关系如下所示:

图片

Source: vector learning

1.4 数据段(Data Field)

数据段可包含0-8个字节的数据,从MSB(最高位)开始输出。

图片

Source: CAN入门书,renesas

数据段的数据有几个字节,取决于控制段的数据长度码DLC的数值,DLC可以取0-15的值,但是它取9-15时没意义,因为已经超过数据段的长度。

1.5 CRC段(Cyclic Redundancy Check Field)

检查帧的传输错误的段,由15个位的CRC序列和1个位的CRC界定符(用于分隔位)构成,CRC界定符恒为隐性。

图片

Source: CAN入门书,renesas

CRC序列是根据多项式生成的CRC值,CRC的计算范围包括帧起始,仲裁段,控制段和数据段。

Source: CAN2.0B

1.6 ACK段(Acknowledge Field)

用来确认是否正常接收的段,由ACK槽和ACK界定符2个位构成。

图片

Source: CAN入门书,renesas

对于发送单元,在ACK段默认2个位的隐性位;而对于接收单元,接收到正确消息的单元在ACK槽发送显性位,通知发送单元正常接收结束。可理解为ACK段数值取决于接收单元,结合下图理解下该逻辑:

图片

1.7 帧结束(End of Frame)

表示帧的结束的段,由7个位的隐性位构成。

Source: CAN入门书,renesas

通过上述对数据帧定义与作用的介绍,不难理解,如果VCU要传递信号给MCU,那么先要定义CAN数据帧或CAN报文的ID号,再定义要装载数据段多长的数据,通过设置DLC实现,最后数据段部署信号及其顺序。

2仲裁机制

基于仲裁段的定义来分析下数据帧的仲裁过程,由于数据帧有两种格式,所有分为3种情况进行说明:标准格式的仲裁,扩展格式的仲裁 和标准格式与扩展格式的仲裁。

Source: CAN入门书,renesas

假设CAN总线上有两个节点Node_A和Node_B,某一刻他俩同时向总线上发送数据,如下

图片

注:Tx表示发送,Rx表示接收,每个节点都有发送与接收功能。当节点作为发送方,会去接收自己发送的内容以进行检查,即回读机制。对比发送的数据与回读的数据,比如发现ACK槽为显性了,就说明发送的数据已被其他节点正确接收。

情况1:标准格式的仲裁

Node_A和Node_B都是标准格式,那么仲裁发生在11位ID范围,即从D10-D0,采用线与机制(逢0变0),逐位进行比较,一旦某位出现不同,如上图的ID7位,则显性位覆盖隐性位,仲裁结束,显性位的对应节点Node_A胜出。

情况2:扩展格式的仲裁,与情况1类似。

情况3:标准格式与扩展格式的仲裁

同样先进行前11位ID的比较,一旦某位出现不同,显性位的对应节点胜出;如果都一样,则标准格式的节点胜出,因为11位ID后1位,标准格式的RTR位恒为显性,扩展格式的SRR位恒为隐性,显性位的对应节点胜出。

由上述分析可知,ID越小,其优先级越高。因此,当VCU要传递信号给MCU时,对于优先级高的VCU信号,应该将它们分配到ID号小的CAN报文中,确保能与其他节点的ID仲裁中胜出。

3 小结

到此,根据CAN数据帧的定义和作用,我们对于报文ID和数据长度有了新的认识,同时获取一些思路如何去设置他俩,为了定义控制器间的CAN通讯更近了一步。

另外,本文也提到了一些陌生的概念,比如显性和隐性。实际上,这些概念涉及到了CAN总线的定义。为了更加全面了解CAN协议,下篇文章将安排CAN总线内容的介绍。

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

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

相关文章

常用命令git branch

Git Branch 命令总结 列出分支 git branch&#xff1a;显示本地分支&#xff0c;当前分支会被标记。git branch -r&#xff1a;显示远程分支。git branch -a&#xff1a;显示所有本地和远程分支。 创建分支 git branch <branch_name>&#xff1a;创建一个新分支但不自…

【WEB安全】 PHP基础与数据库教学下(超详细)

文章目录 php与mysql 简述 MySQLi 和 PDO 连接 MySQL 实例 Linux 和 Windows: 在 php5 mysql 包安装时 MySQLi 扩展多事情况下是自动安装的。 PDO 安装 实例 (MySQLi - 面向对象) 实例 (MySQLi - 面向过程) 实例 (PDO) 使用 MySQLi 和 PDO 向 MySQL 插入数据 实例 (M…

正向解析、反向解析、DNS主从、多区域、ntp时间同步

DNS配置回顾 编号主机名IP地址说明1web服务器192.168.1.17发布部署web服务2dns服务器192.168.1.20用于解析域名和IP地址3clien主机192.168.1.18用于模拟客户机 修改 client主机&#xff1a;修改了dns的访问主机&#xff1b;临时修改echo "nameserver IP地址"&…

docker 常用管理命令及数据备份

docker 常用管理命令及数据备份 常用管理命令 重启 cd share docker compose restart 停止 cd share docker compose stop 启动 cd share ./deploy.sh 升级 cd share ./deploy.sh 查看日志 cd share docker compose logs -f 数据备份 以下备份相关命令均要求在doc…

【Web开发手礼】探索Web开发的秘密(十三)-Vue(3)好友列表、登录

前言 主要介绍了好友列表、登录界面所涉及的vue知识点&#xff01;&#xff01;&#xff01; 好友列表 从云端API读取数据信息 地址 https://app165.acapp.acwing.com.cn/myspace/userlist/方法&#xff1a;GET是否验证jwt&#xff1a;否输入参数&#xff1a;无返回结果&…

【diffusers极速入门(四)】EMA 操作是什么?

系列文章目录 【diffusers 极速入门&#xff08;一&#xff09;】pipeline 实际调用的是什么&#xff1f; call 方法!【diffusers 极速入门&#xff08;二&#xff09;】如何得到扩散去噪的中间结果&#xff1f;Pipeline callbacks 管道回调函数【diffusers极速入门&#xff0…

基于okhttp3拦截器实现短时间内重复请求的拦截

基于okhttp3拦截器实现短时间内重复请求的拦截 背景 某次需求代码实现存在缺陷, 导致用户在点击某标签的时候发起了2次请求(即一次重复请求)。由于开发自测阶段没有盯着抓包软件看请求次数, 测试也没有关注接口请求次数问题, 最终将问题带上线。 影响面 导致被调用的接口QPS翻…

C#知识|文件与目录操作:文本读写操作

哈喽,你好啊,我是雷工! 今天学习文件与目录的操作,以下为文本读写操作的学习笔记。 01 文件操作说明 1.1、数据的存取方式 数据库:适合存取大量且关系复杂并有序的数据; 文件:适合存取大量但数据关系简单的数据,像系统的日志文件; 1.2、文件存取的优点 ①:读取操…

探索 GPT-4o mini:成本效益与开发效率的完美平衡

随着人工智能技术的飞速发展&#xff0c;OpenAI 最新发布的 GPT-4o mini 模型以其卓越的性能和极具竞争力的价格引发了广泛关注。作为一名在计算机行业深耕多年的专家&#xff0c;我已经开始深入探索这一“迄今为止最具成本效益的小模型”。本文将分享我在使用 GPT-4o mini 及其…

ECharts - 坐标轴刻度数值处理

写图表时&#xff0c;Y轴的数值过大&#xff0c;不太可能直接展示&#xff0c;这时候就得简写了&#xff0c;或者百分比展示的也要处理&#xff0c;如下图&#xff1a; yAxis: {type: value,// Y轴轴线axisLine: { show: false }, // 刻度线axisTick: { show: false },// 轴刻度…

收藏!2024年GPU算力最新排名

​GPU&#xff08;图形处理单元&#xff09;算力的提升是驱动当代科技革命的核心力量之一&#xff0c;尤其在人工智能、深度学习、科学计算和超级计算机领域展现出了前所未有的影响力。2024年的GPU技术发展&#xff0c;不仅体现在游戏和图形处理的传统优势上&#xff0c;更在跨…

House of Lore

House of Lore 概述&#xff1a; House of Lore 攻击与 Glibc 堆管理中的 Small Bin 的机制紧密相关。House of Lore 可以实现分配任意指定位置的 chunk&#xff0c;从而修改任意地址的内存。House of Lore 利用的前提是需要控制 Small Bin Chunk 的 bk 指针&#xff0c;并且…

Android中如何手动制造logcat各等级日志(VERBOSE、DEBUG、INFO、WARNING、ERROR、FATAL)

文章目录 1、logcat与log工具2、通过log生成logcat日志2.1、logcat日志等级2.2、log指令说明2.3、log生成日志指令 3、制作日志生成shell脚本4、增加日志生成控制5、附录 1、logcat与log工具 logcat&#xff1a;是Android操作系统中用于记录和查看系统日志的工具。它是Android…

Docker基础概念

Docker 是一个流行的容器化平台&#xff0c;它使开发者能够打包他们的应用程序及其依赖项到一个轻量级、可移植的容器中。这有助于确保应用程序无论在哪里运行都能获得一致的结果。以下是 Docker 的几个基础概念的详细解释&#xff1a; 1. Docker 镜像 (Image) 定义: Docker …

如何在 VPS 上安装和使用 VirtualMin

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 关于 Virtualmin Virtualmin 是 Webmin 的一个模块&#xff0c;允许对&#xff08;多个&#xff09;虚拟专用服务器进行广泛的管理。您…

【华为OD机考】2024D卷最全真题【完全原创题解 | 详细考点分类 | 不断更新题目】

可上 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1441了解算法冲刺训练&#xff08;备注【CSDN】否则不通过&#xff09; 文章目录 相关推荐阅读栈常规栈单调栈 队列&#xff08;题目极少&#xff0c;几乎不考&#xff09;哈希哈希集合哈希表 前缀和双指针同向双指针 贪…

在C++里使字符数组变成字符串(2)

在C中&#xff0c;‌将字符数组转换为字符串可以通过几种方法实现。‌以下是一些常见的方法&#xff1a;‌ 使用std::string构造函数&#xff1a;‌可以直接使用std::string的构造函数&#xff0c;‌将字符数组作为参数&#xff0c;‌从而创建一个字符串对象。‌例如&#xff1…

七、SpringBoot日志

1. 得到日志对象 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; //打印日志…

C++程序使用开源zlib库对二进制字节流数据进行压缩和解压(附源码)

目录 1、概述 2、zlib开源库与开源zip.cpp和unzip.cpp的区别 3、发送端先调用compress压缩,再将数据发出去 4、接收端接收到数据,调用uncompress解压,解压后再使用 5、最后 C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.c…