基于PicoScope示波器理解CAN/CAN-FD的报文帧格式

news2024/9/20 22:52:41
  • 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
  • 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
  • 🍅 玩转CANoe,博客目录大全,点击跳转👉

请添加图片描述

目录

  • 🍅 CAN、CAN-FDBIAO标准帧格式简介
  • 🍅 显隐性电平定义
  • 🍅 线与机制
  • 🍅 位填充
  • 🍅 一帧CAN报文有多少比特
  • 🍅 CAN-FD帧格式详解
    • 🍅 帧起始段(SOF)
    • 🍅 仲裁段(ARB Field)
      • 🍅 ID
      • 🍅 RTR(CAN)和RRS(CAN-FD)
    • 🍅 控制段(CTRL Field)
      • 🍅 扩展帧标志位(IDE)(CAN和CANFD都有)
      • 🍅 保留位(r0)(只有CAN)
      • 🍅 CANFD标志位( FDF)(只有CANFD)
      • 🍅 保留位( res)(只有CANFD)
      • 🍅 位速率转换( BRS)(只有CANFD)
      • 🍅错误状态指示( ESI )(只有CANFD)
      • 🍅数据长度(DLC)(CAN和CANFD都有)
    • 🍅 数据段(DATA Field)
    • 🍅 CRC段(CRC Field)
    • 🍅 ACK段(ACK Field)
    • 🍅 帧结束段(EOF Field)
  • 🌎总结

🍅 CAN、CAN-FDBIAO标准帧格式简介

CAN 报文帧格式

在这里插入图片描述

CAN–FD 报文帧格式
在这里插入图片描述

🍅 显隐性电平定义

CAN总线采用差分信号传输,通常情况下只需要两根信号线(CAN-H和CAN-L)就可以进行正常的通信。在干扰比较强的场合,还需要用到屏蔽地即CAN-G(主要功能是屏蔽干扰信号),CAN协议推荐用户使用屏蔽双绞线作为CAN总线的传输线。

隐性电平和显性电平是CAN总线上的两种互补的逻辑值。以下是对这两种电平的详细解释:

隐性电平

  • 定义:隐性电平在逻辑层面表现为1,即当CAN总线上所有单元都输出隐性电平时,总线上才呈现隐性状态。
  • 电压特性:典型地,当CAN总线为隐性(逻辑1)时,CAN_H和CAN_L的电平都维持在2.5V左右,此时它们之间的电位差Vdiff为0V。
  • 功能:隐性电平用于表示总线上的空闲状态或某些特定的逻辑值。在CAN总线的通信过程中,如果没有节点正在发送显性电平,那么总线将保持隐性电平状态。

显性电平

  • 定义:显性电平在逻辑层面表现为0,即当CAN总线上有任何一个单元输出显性电平时,总线就呈现显性状态。
  • 电压特性:当CAN总线为显性(逻辑0)时,CAN_H和CAN_L的电平分别为3.5V和1.5V左右,此时它们之间的电位差Vdiff为2.0V左右。这个电位差是CAN总线差分传输机制的基础,用于区分显性电平和隐性电平。
  • 功能:显性电平用于表示总线上的有效数据或控制信号。在CAN总线的通信过程中,当节点需要发送数据时,它会通过输出显性电平来将数据传输到总线上。由于显性电平可以覆盖隐性电平,因此当多个节点同时尝试发送数据时,具有最高优先级的节点(通常通过其ID号决定)将能够成功地将数据发送到总线上

巧记:急急如律令,太上老君快显0

在这里插入图片描述

下图是基于PicoScope示波器抓取的CAN波形,观察下CANH、CANL、CAN_DIFF(差分电压)的电压值
在这里插入图片描述

🍅 线与机制

为什么CAN总线的显性电平(逻辑0,电位差Vdiff = 2.5V)能覆盖隐性电平(逻辑1,电位差Vdiff = 0V)?

线与机制:在CAN总线上,所有节点都是并联连接的。当某个节点输出显性电平时(即CAN_H的电平高于CAN_L的电平一定程度),它会将总线电平拉低,即使其他节点输出隐性电平,总线电平仍然保持低电平。这是因为显性电平是强驱动,而隐性电平是弱驱动,所以显性电平能够覆盖隐性电平。
在这里插入图片描述

🍅 位填充

当发送节点连续发送相同逻辑电平(显性或隐性)的位数达到特定数量(通常是5位)时,必须在下一个位插入一个与该5位相反的电平

  • 发送过程:发送节点在发送数据时,会监测连续相同电平的位数。当达到5位时,会在下一个位插入一个相反的电平。这个过程从数据帧的开始(SOF)到循环冗余校验(CRC)序列的最后一个位结束。
  • 接收过程:接收节点在接收数据时,会自动检测和删除这些插入的填充位,以恢复原始的数据流

位填充的影响与限制

  • 数据长度:位填充会增加数据帧的总长度。在极端情况下,如果数据帧中连续相同电平的位数较多,填充位可能会显著增加。
  • 性能考虑:虽然位填充增加了数据传输的可靠性,但也可能会对总线带宽和性能产生一定影响。因此,在设计CAN总线系统时,需要综合考虑数据传输的可靠性和性能需求。

如下图是一个CANFD报文0x106,根据填充规则,当遇到5个“00000”时,必须在后面填充一个“1”。

  • 有电压差的是显性电平(逻辑值为0)
    在这里插入图片描述

🍅 一帧CAN报文有多少比特

本示例的CANFD总线的仲裁段的波特率为500kBit/s数据段的波特率为2000.0kBit/s

不同的波特率,不同的数据(位填充数不同),发送一帧报文所用的时长都有差别,下面仅仅列出3个实例,以作参考。

  • 如下图是一个数据长度为8的CAN报文,有124Bit ,发送时长为248us(微秒)

在这里插入图片描述

  • 如下图是一个数据长度为8的CANFD报文,有138Bit ,发送时长为114us(微秒)

在这里插入图片描述

  • 如下图是一个数据长度为64的CANFD报文,有675Bit ,发送时长为1350us(微秒)

在这里插入图片描述

🍅 CAN-FD帧格式详解

🍅 帧起始段(SOF)

表示帧开始的段。 1 个位的显性位。
在这里插入图片描述

🍅 仲裁段(ARB Field)

🍅 ID

标准帧(CAN 2.0A):仲裁段的ID域由11位标识符组成,扩展帧(CAN 2.0B):仲裁段的ID域,由29位标识符(包括基本ID的11位和扩展ID的18位)组成。
仲裁段中的ID决定了帧在总线上的优先级。ID值越小,帧的优先级越高。在总线竞争时,优先级高的帧将赢得仲裁,从而得以继续传输

🍅 RTR(CAN)和RRS(CAN-FD)

针对CAN格式帧,ID后面一位是RTR(Remote Thansmison request),该位的作用是区分数据帧(RTR=0)和远程帧(RTR=1)。
针对CAN-FD格式帧,与CAN不同,CAN-FD取消了对远程帧的支持,用RRS(Remote request substitution)位替换了RTR位,为常显性(逻辑0)

如下图是一个CAN-FD和CAN报文的截图对比。(ID占12Bit,是因为有5个连续的0,物理层加了个填充)

在这里插入图片描述

🍅 控制段(CTRL Field)

🍅 扩展帧标志位(IDE)(CAN和CANFD都有)

IDE(Identifier Extension)占一个比特,表示是否为扩展帧(IDE = 1)。

🍅 保留位(r0)(只有CAN)

r0(Reserve Bit )保留位供位未来使用,占一个比特,为常显性(逻辑0)

🍅 CANFD标志位( FDF)(只有CANFD)

FDF(FD Fotmate)是控制段的第2个bit ,当FDF = 1时,表明是CANFD帧,当FDF = 0时,表示是CAN帧(也就是r0的值)

🍅 保留位( res)(只有CANFD)

res(Reserve Bit )保留位供位未来使用,占一个比特,为常显性(逻辑0)

🍅 位速率转换( BRS)(只有CANFD)

BRS 位( Bit Rate Switch):表示位速率转换,当 BRS 为显性位(0)时数据段的位速率与仲裁段的位速率一致(恒定速率),当 BRS 为隐性位(1)时速率可变(即 BRS 到 CRC 使用转换速率传输)。

🍅错误状态指示( ESI )(只有CANFD)

ESI (Error State Indicator):发送节点错误状态指示,主动错误时发送显性位(0),被动错误时发送隐性位(1)。

🍅数据长度(DLC)(CAN和CANFD都有)

DLC占4个比特位,最大能表示长度为1111(15),为了兼容CAN-FD格式的最大64个字节,当数据在0-8时,DLC的值就是线性表示,当数据大于8时.DLC的值和数据域长度的只能用一些离散值表示(9,12)、(10,16)、(11,20)、(12,24)、(13,32)、(14,48)、(15,64)

在这里插入图片描述

如下图是一个CAN-FD和CAN报文的截图对比。

  • 注意: CANFD 帧的控制段有9Bit,传输用时10us ,而CAN 帧的控制段有6Bit,传输用时却是12us ,这是因为CANFD帧从ESI位就开始使用变速速率传输。

在这里插入图片描述

🍅 数据段(DATA Field)

CAN FD兼容CAN的数据格式,同时最大还能支持:12、16、 20、 24、 32、 48和64byte

如下图是一个CAN-FD和CAN报文的截图对比。CANFD帧采用变速速率传输,比CAN帧传输用时少4倍(500kbit/s 和2000kbit/s的区别 )
在这里插入图片描述

🍅 CRC段(CRC Field)

下图是标准CAN帧的CRC段,由15位的CRC位和1位的CRC Del位组成,CRC Del位为常隐性位(逻辑1)
在这里插入图片描述

传统CAN中的循环冗余校验(CRC)为15位,而在CAN FD中由固定填充位FSB(6/7位)、填充位计数(4位)、CRC(17/21位)和CRC界定符(1位)组成,总共28或33位组成。 在传统CAN中,CRC中可以包含0到3个填充位,而在CAN FD中,总是有4个固定填充位以提高通信可靠性

固定填充位(FSB):CRC段中每4个位固定填充一个与上位相反的位。

  • 采用CRC17时,FSB为6个位;(如下图6个黄色区域)
  • 采用CRC21时,FSB为7个位。

填充位计数:由填充位计数(4位)和奇偶校验位(1位)组成

CRC:

  • 报文长度小于16时,采用CRC17,17位组成;
  • 报文长度大于16时,采用CRC21,21位组成。

CRC界定符:固定为隐性位(逻辑值1);从该位采样后,切换为仲裁域波特率。

下图是标准CANFD帧的CRC段:

在这里插入图片描述

🍅 ACK段(ACK Field)

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

  • 发送单元在 ACK 段发送 2 个位的隐性位(逻辑值1)。当接收器正确地接收到有效的报文时,接收器就会在应答间隙(ACK Slot)期间(发送ACK 信号)向发送器发送一个“显性”(逻辑值0)的位以示应答,通知发送单元正常接收结束。
  • ACK Del,固定为隐性(逻辑值1)

在这里插入图片描述

🍅 帧结束段(EOF Field)

CAN和CAN FD的帧结尾都为连续7位的隐性位

IFS(Interframe Space)即帧间隔,通常包含连续三个隐性位。在间隔段期间,所有节点都不允许发送数据帧或远程帧,注意IFS(帧间隔)并不是CAN帧的一部分,而是两个连续帧之间的时间间隔。

在这里插入图片描述

在这里插入图片描述

🌎总结

23

7

  • 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
    18

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

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

相关文章

Qt:21.事件(事件的介绍、事件的基类、用户输入事件、窗口和界面事件、其他系统事件、事件处理的思路)

目录 1.事件的介绍: 2.事件的基类: 3.派生类——用户输入事件: 4.派生类——窗口和界面事件: 5.派生类——其他系统事件: 6.事件处理的思路: 1.事件的介绍: Qt 的事件(Event&…

druid(德鲁伊)数据线程池连接MySQL数据库

文章目录 1、druid连接MySQL2、编写JDBCUtils 工具类 1、druid连接MySQL 初学JDBC时,连接数据库是先建立连接,用完直接关闭。这就需要不断的创建和销毁连接,会消耗系统的资源。 借鉴线程池的思想,数据连接池就这么被设计出来了。…

Java多线程性能调优

Synchronized同步锁优化方法 1.6之前比较重量级,1.6后经过优化性能大大提升 使用Synchronized实现同步锁住要是两种方式:方法、代码块。 1.代码块 Synchronized在修饰同步代码块时,是由 monitorenter和monitorexit指令来实现同步的。进入mo…

mysql的事务,你弄懂了吗?(Innodb)

目录 1.事务的ACID原则 2. 事务的隔离级别 2.1 数据库的脏读问题 2.2 数据库不可重复读问题 2.3 数据库幻读问题 2.4 数据库脏写问题 3.Mysql的锁 3.1 以锁粒度的维度划分 3.2 以互斥性的维度划分: 3.3 以操作类型的维度划分: 3.4 以加锁方式…

树的概念与二叉树的实现

目录 一. 树的概念 二. 访问树的方法 1. 左孩子右兄弟法 2. 双亲表示法 3. 顺序表存孩子的指针(孩子表示法) 三. 二叉树 1. 二叉树的定义 2. 特殊二叉树 3. 二叉树的性质 4. 存储方式 四. 二叉树的前中后序遍历 1. 前序遍历 2. 中序遍历 3. …

C 语言中如何实现图结构?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 📙C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代&…

基于docker-compose部署zabbix7.0

1.安装docker和docker-compose 已有可跳过,没有参照我的docker一件安装脚本连接放在下方 一键安装dockerv24.0.6以及docker-compose可离线_docker 24对应docker-compose-CSDN博客 2.运行zabbix-server 1.创建zabbix工作目录 mkdir /zabbix 2.编写docker-compos…

【人工智能】Transformers之Pipeline(一):音频分类(audio-classification)

​​​​​​​ 目录 一、引言 二、音频分类(audio-classification) 2.1 概述 2.2 技术原理 2.2.1 Wav2vec 2.0模型 2.2.1 HuBERT模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 2.4 pipeline实战 2.4.1 …

【python】Python中常见的KeyError报错分析

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

ESP32FreeRTOS开发笔记:1.双核并行

ESP32 的 Arduino 框架内部集成了 FreeRTOS,允许开发者利用其多任务处理功能。在代码中,xTaskCreatePinnedToCore 函数是 FreeRTOS 提供的 API,用于创建任务并指定任务在哪个核心上运行。 FreeRTOS 是一个流行的实时操作系统内核,…

信息打点web篇--语言开发框架,组件识别

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本章节主要整理 识别语言开发框的打点内容 框架简介 高效理解:把用于做某些事的代码封装起来,使用者无需自己写代码直接一个函数就能完成本该很多行才能完成的功能。 例子:我们要写网站,…

Open3D 点云Kmeans聚类算法

目录 一、概述 1.1算法介绍 1.2实现步骤 二、代码实现 三、实现效果 3.1原始点云 3.2聚类后点云 前期试读,后续会将博客加入该专栏,欢迎订阅Open3D与点云深度学习的应用_白葵新的博客-CSDN博客 一、概述 1.1算法介绍 聚类是一种将数据集分组的方…

Qml 图片和加载器操作

学习目标:Qml 图片和加载器编程 学习前置 Qt Qml编程 基础部分 认识qml-CSDN博客 实现效果 对图片的基本操作 加载器 核心代码 加载器 思路: 创建一个加载器 默认是几个圆点,我们重写加载器元素(contentItem)&…

文献阅读:高效和稳健的 π-FISH rainbow 用于多种生物分子的多重原位检测

文献介绍 文献题目: Highly efficient and robust π-FISH rainbow for multiplexed in situ detection of diverse biomolecules 研究团队: 曹罡(华中农业大学)、戴金霞(华中农业大学) 发表时间&#xff…

RSA算法(C++)

RSA加解密过程 RSA为非对称加密算法,由一对公钥和一对私钥构成,私钥加密公钥解密,公钥加密私钥解密 如下图,D为私密的,假设传输英文字母,我们给英文字母编号A1,B2,C3… RSA加解密过程 两对密钥产生方法如下 C Op…

网络通信基本知识

网络通信 什么是网络通信? 通信网络是指将各个孤立的设备进行物理连接,实现人与人,人与计算机,计算机与计算机之间进行信息交换的链路,从而达到资源共享和通信的目的。 什么是网络协议? 网络协议是计算机…

Python函数 之 参数

1.参数的简单介绍 参数 形式参数(形参):在函数定义的时候,在括号中写⼊变量,这个变量就称为是函数的参数。实际参数(实参):在函数调⽤的时候,可以给定义时候的形参传递具体的数据值,供其使⽤。注: 在函数调⽤的时候,会将函数的实…

wps 将列的内容转换为一个单元格内容,并以逗号分隔

wps 将列的内容转换为一个单元格内容,并以逗号分隔 1.首先在一个空白单元格输入 2.输入函数TEXTJOIN 这个函数有三个参数,第一个:以什么分隔符分隔,第二个:是否忽略空白格,true:忽略 false:不忽略 第三个&…

怎么使用代理IP?如何检测代理IP是否有效?

代理IP是一种网络代理技术,它是通过中间服务器来转发网络请求的IP地址。当我们使用代理IP时,我们的真实IP地址会被隐藏起来,而代理服务器的IP地址会被用作我们的身份标识。使用代理IP的步骤如下: 1.选择合适的代理服务器 考虑服务…

【微信小程序知识点】转发功能的实现

转发功能,主要帮助用户更流畅地与好友分享内容与服务。 想实现转发功能,有两种方式: 1.页面js文件必须声明onShareAppMessage事件监听函数,并自定义转发内容。只有定义了此事件处理函数,右上角菜单才会显示“转发”按…