CAN总线的报文分析(三)

2023-11-15

系列文章目录



前言

CAN总线上的节点发送数据都是以报文的形式广播给网络中的所有节点,每一条报文就叫做“一帧”数据。(传输数据的基本单位)

CAN总线的报文帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔5种类型

名称 用途
数据帧 用于发送单元向接收单元传送数据的帧。
远程帧/遥控帧 用于接收单元向具有相同 ID 的发送单元请求数据的帧。
错误帧 用于当检测出错误时向其它单元通知错误的帧。
过载帧 当一个节点正忙于处理接收的信息,可以通知其它节点暂缓发送新报文。
帧间隔 用于将数据帧及遥控帧与前面的帧分离开来的帧

数据帧和遥控帧有标准格式扩展格式
标准格式有11位标识符,扩展格式有29位标识符。


一、数据帧(最常用)

结构上由7段组成: 帧起始+仲裁段+控制段+数据段+CRC段+ACK段+帧结束

名称 介绍
帧起始 表示帧的开始,由一个的显性电平组成。
仲裁段 表示帧的优先级, 由标识符(ID)和传送帧类型(RTR)组成。
控制段 表示数据的字节数,由6个bit构成
数据段 可发送0~8 个字节的数据
CRC段 用于校验传输是否正确
ACK段 表示确认是否正常接收
帧结束 由7个连续的隐形位组成
隐性电平:逻辑1
显性电平:逻辑0

1.帧起始

无论是标准数据帧还是扩展数据帧都包含这两个段。帧起始标志着数据帧和远程帧的起始,由一个单独的显性位(逻辑0)组成。总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。(总线空闲时为隐性位,故帧起始以显性位非常好识别)
在这里插入图片描述

2.仲裁段

当多个节点同时发送数据,总线应该怎么处理呢?所以仲裁段表示数据传输的优先级,作用就是根据报文ID来确定其发送优先级。标准格式和扩展格式在此的构成有所不同。
在这里插入图片描述

标准帧ID为11位。
扩展帧ID为29位。

数据分析:
在这里插入图片描述
如何仲裁呢?
首先判断节点发送位的电平与总线上的电平是否一致,不一致则停止发送。
在这里插入图片描述
分析:

1.当总线的电平为显性时(逻辑0),节点A ,C的第五位都是显性,节点B为隐性,淘汰节点B。进入只听模式。
2.当节点A,C竞争时,第3位不一致了,节点C的第三位位隐性,节点A的为显性,所以淘汰节点C,节点C进入只听模式。

3.控制段

控制段共6位。
标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成;
扩展帧控制段则由r1、r0和DLC组成。
在这里插入图片描述
IDE:标准帧中该位位于控制段,为显性0。扩展帧中属于仲裁段,为隐性1。
r0,r1:保留位,各占1bit,默认设置为显性位
DLC:数据长度码,它由4个数据位组成,用于表示本报文中的数据段含有多少个字节,DLC段表示的数字为0~8。数据的字节数必须为 0~8字节。但接收方对 DLC=9~15的情况并不视为错误。

4.数据段

数据段为数据帧的核心内容,可包含0-8个字节的数据,从MSB(最高位)开始输出。遥控帧没有此段。
在这里插入图片描述

5.CRC段

为了保证报文的正确传输,CAN的报文包含了一段15位的CRC校验码,一旦接收节点算出的CRC码跟接收到的CRC码不同,则它会向发送节点反馈出错信息,利用错误帧请求它重新发送。CRC部分的计算一般由CAN控制器硬件完成.
CRC界定符恒为隐性1。
在这里插入图片描述

6.ACK段

用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符2个位构成。
在这里插入图片描述
应答槽:
发送节点:发送隐性电平1
接受成功的节点:发送显性电平0
总线电平与与节点的发送结果对比:显性发送成功,隐性发送失败。
应答标识:一个隐性电平1

7.帧结束

表示该帧的结束的段,由7个连续的隐形位(1111111)组成
在这里插入图片描述

二、远程帧

与数据帧相比,远程帧结构上无数据段,由6个段组成,同理分为标准格式和扩展格式,且RTR位为1(隐性电平)。
在这里插入图片描述
如下图所示由于数据帧的RTR位为显性电平,远程帧的RTR位为隐性电平。
所以帧格式和帧ID都相同情况下,数据帧的优先级比远程帧优先级高。
在这里插入图片描述
数据帧与远程帧的区别:
在这里插入图片描述

三、错误帧

用于在接收和发送消息时检测出错误通知错误的帧,
错误帧由错误标志和错误界定符构成。
主要错误的类型:在这里插入图片描述
当出现错误时,发送或接收节点将发送错误帧。错误帧的结构如下,
其中错误标识分为主动错误标识和被动错误
在这里插入图片描述
(1)主动错误状态:可以正常参加总线通信的状态,处于主动错误状态的单元检测出错误时,输出主动错误标志。
(2)被动错误状态:是易引起错误的状态。处于被动错误状态的单元虽能参加总线通信,但为不妨碍其他单元通信,接收时不能积极地发送错误通知;处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。处于被动错误状态的单元检测出错误时,输出被动错误标志。另外,处于被动错误状态的单元在不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8个位的隐性位)。
(3)总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。
在这里插入图片描述

四、过载帧

当某个接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点;
过载帧由过载标志(6个位的显性位)和过载界定符(8个位的隐性位)构成。过载界定符的构成与错误界定符的构成相同。
在这里插入图片描述
在这里插入图片描述
对于过载帧的帧结构我们可以这样理解:接收节点达到接收极限时,就会发出过载帧到总线上,显然,过载标志的6个连续显性位会屏蔽掉总线上其它节点的发送,也就是说这个时候的接收节点通过发送过载帧的方式来破坏其它节点的发送,这样在接收节点发送过载帧期间,其它节点就不能成功发送报文,于是就相当于把其它节点的发送推迟了,也就是说接收节点在其发送过载帧的这段时间得以“休息”。

有3种情况会引起过载帧:
1.接收节点自身原因。接收节点由于某种原因需要延迟接收下一个数据帧或者遥控帧。
2.在帧间隔的间歇段的第一位和第二位检测到一个显性位(正常的间歇段都是隐性位)。帧间隔的间隔段本应是三个连续的隐性位,如果接收节点在间隔段检测到显性位,那么就意味着此时有报文发向接收节点,但这个时候是不应该有报文发来的,于是接收节点发送过载帧。
3.CAN节点在错误界定符或过载界定符的第八位(最后一位)听到一个显性位0,节点会发送一个过载帧,且错误计数器不会增加。接收节点在错误界定符和过载界定符的最后一位听到显性位,也意味着有报文发向接收节点,但这个时候是不应该有报文发来的,于是接收节点发送过载帧。

五、帧间隔

帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间隔。
1 .帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。
在这里插入图片描述
2 .帧间隔过后,如果无节点发送帧,则总线进入空闲。
在这里插入图片描述
3 .帧间隔过后,如果被动错误节点要发送帧,则先发送8个隐性电平的传输延迟,再发送帧.
在这里插入图片描述
在这里插入图片描述
间隔为3个位的隐性位;总线空闲为隐性电平,无长度限制(0亦可);延迟传送为8个位的隐性位,只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。这里为什么需要延迟传送段呢?
首先,考虑主动错误状态的节点A,发送主动错误标志之后,随之就要重新发送刚刚发送失败的报文,但是为了间隔开与前面刚刚发送的错误帧,总线在错误帧之后就会插入3个隐形位的帧间隔,在这3个隐形位期间,其它的节点不足以判定总线空闲(需要连续11个隐性位才能判定),所以节点A仍然占据着总线的控制权,于是在帧间隔之后,节点A能够接着发送报文。现在节点A转入到被动错误状态了,说明它已经不是很可靠了,这个时候如果没有延迟传送段,在节点A发出被动错误标志之后,它仍然能够在3位的帧间隔之后立即重新发送报文,这是不符合我们对被动错误状态的处理要求的当然也是不符合CAN协议的,于是乎对于发送出被动错误标志的节点,总线在帧间隔中加入了8个连续隐性位的延迟传送段,这样的3+8=11个连续隐性位。就能让节点A在这个帧间隔期间失去对总线的控制权,从而优先保证其它正常(处于主动错误状态)节点能够使用总线,而不必等着一个已经不可靠的节点A占据总线。

总结

仅仅用于个人学习使用!
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CAN总线的报文分析(三) 的相关文章

  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re

随机推荐