面对初学者的CAN总线入门教程(三)_CAN通信中帧、优先级、位填充、错误、位时序以及同步的介绍

2023-05-16

目录

  • 1. 数据链路层中的帧
    • 1.1 数据帧
      • 1.1.1 帧起始(标准、扩展格式相同)
      • 1.1.2 仲裁段
      • 1.1.3 控制段
      • 1.1.4 数据段(标准、扩展格式相同)
      • 1.1.5 CRC 段(标准/扩展格式相同)
      • 1.1.6 ACK 段(标准/扩展格式相同)
      • 1.1.7 帧结束(标准/扩展格式相同)
    • 1.2 遥控帧
      • 1.2.1 遥控帧和数据帧的不同
      • 1.2.2 遥控帧没有数据段,数据长度码该如何表示?
      • 1.2.3 没有数据段的数据帧有何用途?
    • 1.3 错误帧
    • 1.4 过载帧
    • 1.5 帧间隔
  • 2. 优先级的确定
    • 2.1 数据帧和遥控帧的优先级
    • 2.2 标准格式和扩展格式的优先级
  • 3. 位填充
  • 4. 错误
    • 4.1 错误的种类
      • 4.1.1 位错误
      • 4.1.2 格式错误
    • 4.2 错误帧的输出
  • 5. 位时序
  • 6. 同步
    • 6.1 取得同步的方法
      • 6.1.1 硬件同步
      • 6.1.2 再同步
    • 6.2 调整同步的规则

1. 数据链路层中的帧

通信是通过以下五种类型的帧进行的。其中,数据帧和遥控帧有标准格式和扩展格式两种格式。 标准格式有 11 个位的标识符(Identifier: 以下称 ID) ,扩展格式有 29 个位的 ID。
下面配有各个帧的构成图片,图中D表示显性电平,R表示隐形电平。

  • 数据帧
    在这里插入图片描述

  • 遥控帧
    在这里插入图片描述

  • 错误帧
    在这里插入图片描述

  • 过载帧
    在这里插入图片描述

  • 帧间隔
    在这里插入图片描述

下图为各种帧的用途。
在这里插入图片描述
接下来对各种帧分别进行介绍。

1.1 数据帧

数据帧由 7 个段构成。
数据帧的构成如下图所示。
在这里插入图片描述

  1. 帧起始
    表示数据帧开始的段。
  2. 仲裁段
    表示该帧优先级的段。
  3. 控制段
    表示数据的字节数及保留位的段。
  4. 数据段
    数据的内容,可发送 0~8 个字节的数据。
  5. CRC 段
    检查帧的传输错误的段。
  6. ACK 段
    表示确认正常接收的段。
  7. 帧结束
    表示数据帧结束的段。

下面对帧的构成进行说明。

1.1.1 帧起始(标准、扩展格式相同)

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

显性电平和隐性电平

总线上的电平有显性电平和隐性电平两种。
总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”。
“显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平。并且,“隐性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。(显性电平比隐性电平更强。)

1.1.2 仲裁段

表示数据的优先级的段。
标准格式和扩展格式在此的构成有所不同。
在这里插入图片描述
在这里插入图片描述
其中 RTR 位用于标识是否是遥控帧(0,数据帧; 1,遥控帧), IDE 位为标识符选择位(0,使用标准标识符; 1,使用扩展标识符), SRR 位为代替远程请求位,为隐性位,它代替了标准帧中的 RTR 位。

1.1.3 控制段

控制段由 6 个位构成,表示数据段的字节数。
标准格式和扩展格式的构成有所不同。
在这里插入图片描述
在这里插入图片描述

下表为数据长度码和字节数的关系。
在这里插入图片描述

1.1.4 数据段(标准、扩展格式相同)

数据段可包含 0~8 个字节的数据。从 MSB(最高位)开始输出。
在这里插入图片描述

1.1.5 CRC 段(标准/扩展格式相同)

CRC 段是检查帧传输错误的帧。由 15 个位的 CRC 顺序和 1 个位的 CRC 界定符(用于分隔的位)构成。
在这里插入图片描述
在这里插入图片描述

1.1.6 ACK 段(标准/扩展格式相同)

ACK 段用来确认是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界定符 2 个位构成。
在这里插入图片描述
在这里插入图片描述

发送ACK

发送 ACK 的是在既不处于总线关闭态也不处于休眠态的所有接收单元中,接收到正常消息的单元(发送单元不发送 ACK)。所谓正常消息是指不含填充错误、格式错误、 CRC 错误的消息。

1.1.7 帧结束(标准/扩展格式相同)

帧结束是表示该该帧的结束的段。由 7 个位的隐性位构成。
在这里插入图片描述

1.2 遥控帧

接收单元向发送单元请求发送数据所用的帧。遥控帧由 6 个段组成。遥控帧没有数据帧的数据段。
遥控帧的构成如下图所示。
在这里插入图片描述

1.2.1 遥控帧和数据帧的不同

  1. 遥控帧的 RTR 位为隐性位,没有数据段。
  2. 没有数据段的数据帧和遥控帧可通过 RTR 位区别开来。

1.2.2 遥控帧没有数据段,数据长度码该如何表示?

遥控帧的数据长度码以所请求数据帧的数据长度码表示。

1.2.3 没有数据段的数据帧有何用途?

例如,可用于各单元的定期连接确认/应答、或仲裁段本身带有实质性信息的情况下。

1.3 错误帧

用于在接收和发送消息时检测出错误通知错误的帧。错误帧由错误标志和错误界定符构成。
错误帧的构成如下图所示。
在这里插入图片描述
在这里插入图片描述

  • 错误标志
    错误标志包括主动错误标志和被动错误标志两种。
  1. 主动错误标志: 6 个位的显性位。
  2. 被动错误标志: 6 个位的隐性位。
  • 错误界定符
    错误界定符由 8 个位的隐性位构成。

1.4 过载帧

过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。
过载帧的构成如下图所示。
在这里插入图片描述

  • 过载标志
    6 个位的显性位。
    过载标志的构成与主动错误标志的构成相同。
  • 过载界定符
    8 个位的隐性位。
    过载界定符的构成与错误界定符的构成相同。

1.5 帧间隔

帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间隔。
帧间隔的构成如下图所示。
在这里插入图片描述

  • 间隔
    3 个位的隐性位。
  • 总线空闲
    隐性电平,无长度限制(0 亦可)。
    本状态下,可视为总线空闲,要发送的单元可开始访问总线。
  • 延迟传送(发送暂时停止)
    8 个位的隐性位。
    只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。

2. 优先级的确定

在总线空闲态,最先开始发送消息的单元获得发送权。
多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。
仲裁的过程如下图所示。
在这里插入图片描述

2.1 数据帧和遥控帧的优先级

具有相同 ID 的数据帧和遥控帧在总线上竞争时, 仲裁段的最后一位(RTR) 为显性位的数据帧具有优先权,可继续发送。
数据帧和遥控帧的仲裁过程如下图所示。
在这里插入图片描述

2.2 标准格式和扩展格式的优先级

标准格式 ID 与具有相同 ID 的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式的 RTR 位为显性位的具有优先权,可继续发送。
标准格式和扩展格式的仲裁过程如下图所示。
在这里插入图片描述

3. 位填充

位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时则添加一个位的反型数据。
位填充的构成如下图所示。
在这里插入图片描述

  • 发送单元的工作
    在发送数据帧和遥控帧时, SOF~CRC 段间的数据,相同电平如果持续 5 位,在下一个位(第 6 个位)则要插入 1 位与前 5 位反型的电平。
  • 接收单元的工作
    在接收数据帧和遥控帧时, SOF~CRC 段间的数据,相同电平如果持续 5 位,需要删除下一个位(第 6 个位)再接收。如果这个第 6 个位的电平与前 5 位相同,将被视为错误并发送错误帧。

4. 错误

4.1 错误的种类

错误共有 5 种。多种错误可能同时发生。

  • 位错误
  • 填充错误
  • CRC 错误
  • 格式错误
  • ACK 错误

错误的种类、错误的内容、错误检测帧和检测单元如下表所示。
在这里插入图片描述

4.1.1 位错误

  • 位错误由向总线上输出数据帧、遥控帧、错误帧、过载帧的单元和输出 ACK 的单元、输出错误的单元来检测。
  • 在仲裁段输出隐性电平,但检测出显性电平时,将被视为仲裁失利,而不是位错误。
  • 在仲裁段作为填充位输出隐性电平时,但检测出显性电平时,将不视为位错误,而是填充错误。
  • 发送单元在 ACK 段输出隐性电平,但检测到显性电平时,将被判断为其它单元的 ACK 应答,而非位错误。
  • 输出被动错误标志( 6 个位隐性位)但检测出显性电平时,将遵从错误标志的结束条件,等待检测出连续相同 6 个位的值(显性或隐性),并不视为位错误。

4.1.2 格式错误

  • 即使接收单元检测出 EOF( 7 个位的隐性位)的最后一位(第 8 个位)为显性电平,也不视为格式错误。
  • 即使接收单元检测出数据长度码( DLC)中 9∼15 的值时,也不视为格式错误。

4.2 错误帧的输出

检测出满足错误条件的单元输出错误标志通报错误。
处于主动错误状态的单元输出的错误标志为主动错误标志;处于被动错误状态的单元输出的错误标志为被动错误标志。
发送单元发送完错误帧后,将再次发送数据帧或遥控帧。
错误标志输出时序如下表所示。
在这里插入图片描述

5. 位时序

由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。

  • 同步段( SS)
  • 传播时间段( PTS)
  • 相位缓冲段 1( PBS1)
  • 相位缓冲段 2( PBS2)

这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。
1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。
1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。
各段的作用和 Tq 数如下表所示。
在这里插入图片描述

1 个位的构成如下图所示。
在这里插入图片描述
在这里插入图片描述

根据这个位时序,我们就可以计算 CAN 通信的波特率了。

6. 同步

6.1 取得同步的方法

CAN 协议的通信方法为 NRZ(Non-Return to Zero)方式。各个位的开头或者结尾都没有附加同步信号。发送单元以与位时序同步的方式开始发送数据。另外,接收单元根据总线上电平的变化进行同步并进行接收工作。
但是,发送单元和接收单元存在的时钟频率误差及传输路径上的(电缆、驱动器等)相位延迟会引起同步偏差。因此接收单元通过硬件同步或者再同步的方法调整时序进行接收。

6.1.1 硬件同步

接收单元在总线空闲状态检测出帧起始时进行的同步调整。
在检测出边沿的地方不考虑 SJW 的值而认为是 SS 段。
硬件同步的过程如下图所示。
在这里插入图片描述

6.1.2 再同步

在接收过程中检测出总线上的电平变化时进行的同步调整。
每当检测出边沿时,根据 SJW 值通过加长 PBS1 段,或缩短 PBS2 段,以调整同步。但如果发生了超出 SJW值的误差时,最大调整量不能超过 SJW 值。
再同步如下图所示。
在这里插入图片描述

6.2 调整同步的规则

硬件同步和再同步遵从如下规则。

  1. 1 个位中只进行一次同步调整。
  2. 只有当上次采样点的总线值和边沿后的总线值不同时,该边沿才能用于调整同步。
  3. 在总线空闲且存在隐性电平到显性电平的边沿时,则一定要进行硬件同步。
  4. 在总线非空闲时检测到的隐性电平到显性电平的边沿如果满足条件1和条件2,将进行再同步。但还要满足下面条件。
    1. 发送单元观测到自身输出的显性电平有延迟时不进行再同步。
    2. 发送单元在帧起始到仲裁段有多个单元同时发送的情况下,对延迟边沿不进行再同步。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面对初学者的CAN总线入门教程(三)_CAN通信中帧、优先级、位填充、错误、位时序以及同步的介绍 的相关文章

  • CAN扩展帧详解

    寻址方式
  • socketcan_bridge 包 设置多路CAN口 小记

    参考链接 xff1a socketcan bridge ROS Wiki 基于ROS 43 CANopen的SocketCAN驱动在Ubuntu下的应用说明 SzZhangfq的博客 CSDN博客 ros socketcan socketc
  • Python 使用can模块(记录稿)

    直接安装 xff1a pip install python can 如果报这个错 更新一下pip pip3 install upgrade pip 或者是 pip install upgrade pip 再安装wrapt pip insta
  • G2O库和Eigen库can not find 问题——FindG2O.cmake FindEigen3.cmake

    目录 CMakeLists设置FindG2O cmake文件内容FindEigen3 cmake 文件内容 CMakeLists设置 在CMakeLists里加入如下这句话 xff0c 并在项目文件夹中新建cmake文件夹 LIST APP
  • Linux下CAN总线速率设置,socketCAN。

    背景 xff1a 飞思卡尔Freescale的ARM9处理器i MX25系列 socketCAN对于在Linux下操作CAN总线非常的快捷方便 xff0c 其配置方法和在Linux下对网卡的配置相似 xff0c 方法如下 xff1a 1 i
  • CAN报文解析—案例

    1 CAN报文定义 CAN报文是指发送单元向接受单元传送数据的帧 我们通常所说的CAN报文是指在CAN线 xff08 内部CAN 整车CAN 充电CAN xff09 上利用ECU和CAN卡接收到的十六进制报文 2 CAN协议中CAN报文种类
  • CAN总线电平(隐性与显性)

    nbsp nbsp nbsp nbsp CAN2 0B规范定义了两种互补的逻辑数值 显性和隐性 同时传送显性和隐性位时 总线呈现显性状态 同时传送显性状态位时 总线呈现显性状态 同时传送隐性状态位时 总线呈现隐性状态 显性数值表示逻辑0 隐
  • ROS-虚拟CAN通讯/实质CAN通信

    xff11 xff0e 源码安装canopen 从官网下载canopen至Ubuntu xff0c 下载地址 xff1a https github com ros industrial ros canopen tree kinetic de
  • c#通过串口及CAN模块实现上位及下位机通讯

    目录 前言 一 串口 CAN总线 二 使用步骤 1 RS232串口通讯 xff08 指令下发与接收 xff09 2 CAN总线通讯 总结 前言 学习及工作中我们经常会遇到上位机与下位机通讯等工作 xff0c 结合场景使用不同的通讯方式实时通
  • CAN为什么会发送失败

    CAN总线调试过程中出现报文发送失败 xff0c 很多工程师都对此只知其一不知其二 xff0c 这里就CAN报文发送失败的问题我们来做一次探讨 在了解CAN报文为什么会发送失败之前我们先看看一条正确的CAN报文到底应该是怎么样的 xff0c
  • rplidar_ros 报错:can‘t bind 和Operation Time Out的解决

    我使用的思岚A2的雷达在ros下运行 1 can t bind无法连接的错误 xff0c 一种是设备号不匹配引起的错误 xff0c 首先可以使用ll dev grep ttyUSB查看一下设备的dev号 xff0c 再检查一下rplidar
  • CAN通信学习笔记(一)

    1 CAN通信的基本原理 1 1 基本概念 CAN 是 Controller Area Network 的缩写 xff08 以下称为 CAN xff09 xff0c 是 ISO 国际标准化的串行通信协议 在北美和西欧 xff0c CAN 总
  • Nvidia jetson agx xavier can通讯失败,修改时钟源pllaon

    一 问题详情 在调试Xavier can的过程中 xff0c can通信始终有问题 xff0c 收发都会报错 后来发现时钟源导致波特率不匹配 xff0c 所以不能通信 二 修改时钟源 在虚拟机使用官方sdkmanager xff0c 下载安
  • kvaser pcie can 在ros中使用socketcan开发

    kvaser pcie can 在ros中使用socketcan开发 0 系统配置 Ubuntu 16 04 6 LTS Linux version 4 15 0 45 generic 1 官网下载地址 https www kvaser c
  • 从零读懂CAN总线(上)

    概要 上世纪八十年代以来 汽车ECU越来越多 如ABS 电控门窗 电子燃油喷射装置 如果仍然采用常规的点对点布线方式 即电线一段与开关相接 另一端与用电设备相通 将会导致车上电线数目的急剧增加 从而带来线束的冗余及维修成本的提高 这就对汽车
  • STM32的CAN总线的接收双FIFO使用方法

    通过下面的框图我们可以看到 STM32F013有两个接收FIFO 但是实际的使用中如何让着两个FIFO都被使用呢 解决办法就在这里 1 STM32F103有0 13共14个过滤器组 每个过滤器组都可以绑定指定的FIFO 2 特别需要注意的一
  • CAN与CANOpen(一)

    CAN与CANOpen 一 基本概念 CAN与CANOpen 二 报文格式 CAN与CANOpen 三 错误处理 CAN与CANOpen 四 CANOpen对象字典 CAN与CANOpen 五 PDO和SDO CAN与CANOpen 六 网
  • STM32学习心得三十二:CAN通信基础知识、原理、配置及实验

    记录一下 方便以后翻阅 主要内容 1 CAN通信基础知识 2 STM32 CAN控制器简介 3 相关实验代码解读 参考资料 STM32中文参考手册 V10 第22章 控制器局域网 bxCAN 实验功能 CAN实验需要两个开发板 系统启动后
  • STM32 CAN通信的学习笔记总结(从小白开始)

    知识来源于互联网 回馈于互联网 目录 1 总体概述 1 1 基本概念 1 2 通讯方式 1 3 为什么使用CAN 1 4 CAN的协议及组成 2 上帝视角看CAN的通讯过程 2 1 数据传输原理实现 2 2 通信的整个过程 2 2 1 空闲
  • STM32F407 CAN1 CAN2

    注意CAN1可以单独使用 CAN2要开启CAN1时钟才能使用 u8 CAN1 Mode Init u8 mode GPIO InitTypeDef GPIO InitStructure CAN InitTypeDef CAN InitStr

随机推荐