目录

  • 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. 发送单元在帧起始到仲裁段有多个单元同时发送的情况下,对延迟边沿不进行再同步。

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

  1. qpython3可视图形界面_PySide——Python图形化界面入门教程(三)

    PySide--Python图形化界面入门教程(三) --使用内建新号和槽 --Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...

  2. SpringCloud 入门教程(三): 配置自动刷新

    Spring Cloud 入门教程(三): 配置自动刷新 之前讲的配置管理, 只有在应用启动时会读取到GIT的内容, 之后只要应用不重启,GIT中文件的修改,应用无法感知, 即使重启Config Se ...

  3. 【MATLAB Image Processing Toolbox 入门教程三】快速入门之“在多光谱图像中寻找植被”

    [MATLAB Image Processing Toolbox 入门教程三] 本篇摘要 一.从多光谱图像文件导入彩色红外通道 二.构建近红外光谱散射图 三.计算植被系数并显示其定位 四.综合实例部分 ...

  4. python爬虫入门教程(三):淘女郎爬虫 ( 接口解析 | 图片下载 )

    2019/10/28更新 网站已改版,代码已失效(其实早就失效了,但我懒得改...)此博文仅供做思路上的参考 代码使用python2编写,因已失效,就未改写成python3 爬虫入门系列教程: pyt ...

  5. R语言七天入门教程三:学习基本结构

    R语言七天入门教程三:学习基本结构 一.编程的语言的基本结构 1.三种基本结构 绝大多数编程语言,都有三种最基本的程序结构:顺序结构.分支结构.循环结构.这三种结构的流程图如下所示(从左至右依次为:顺 ...

  6. (原创)LEON3入门教程(三):基于LEON3的SOPC设计以及HELLOWORLD和流水灯

    摘要:通过前两篇博客的介绍,Windows下基本的LEON3开发环境就已经搭建好了.这篇博客将要介绍LEON3 SOPC平台的搭建(使用Cygwin+GRLIB)和 LEON3 IDE(eclipse ...

  7. Python ln_Python入门教程(三):史上最全的Numpy计算函数总结,建议收藏!

    点击上方 蓝字 关注我们 Numpy提供了灵活的.静态类型的.可编译的程序接口口来优化数组的计算,也被称作向量操作,因此在Python数据科学界Numpy显得尤为重要.Numpy的向量操作是通过通用函 ...

  8. python乘法表运算_Python入门教程(三):史上最全的Numpy计算函数总结,建议收藏!...

    点击上方 蓝字 关注我们 Numpy提供了灵活的.静态类型的.可编译的程序接口口来优化数组的计算,也被称作向量操作,因此在Python数据科学界Numpy显得尤为重要.Numpy的向量操作是通过通用函 ...

  9. Python+Opencv图像处理新手入门教程(三):阈值与二值化

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图 1.Intro 今天这节我们主要研究利用阈值处理图像.例如对于输入图像: 如何做一 ...

最新文章

  1. GTX1080 安装 cuda 8.0 + cuDNN5.1
  2. 3.14-19 wc、iconv、dos2unix、diff、vimdiff、rev
  3. 华为S5700系列交换机配置文件导出、导入
  4. [USACO19JAN,Platinum] Redistricting
  5. CentOS7下分布式文件系统FastDFS的安装 配置 (单节点)
  6. Django中form字段操作
  7. window和document对象
  8. 计算机组成原理课后答案(唐朔飞第三版) 第二章
  9. (时间表达式)定时任务Quartz 之 cron表达式及在线生成器
  10. 【思想总结】关于最近思想滑坡的反省
  11. teamview 局域网内使用
  12. 大众点评各城市热门餐厅评分字体加密信息数据采集
  13. golang中的字符串
  14. 【Word】毕业论文使用的调格式技巧
  15. Unity 使用BitmapFont制作自定义字体
  16. 妹妹,这回哥哥听你的了,以前哥哥真的太傻
  17. 用函数编程实现输出 m~n之间所有素数,并求和,m和n由键盘输入。(c语言)
  18. 操作系统思维导图总结
  19. pandas 选择满足特定条件的行
  20. 如何通过 C# 有效的读取 INI 文件?

热门文章

  1. 深入理解Java虚拟机 -- JMM(Java内存模型)
  2. 【视频教程免费领取】48G全套Java视频教程,从入门到跑路!
  3. FPGA调试笔记~PCIE之XDMA(一):一些概念性介绍
  4. 凯撒密码加密解密——Java代码(密码学)
  5. STM32定时器3配置时钟的坑
  6. 逆向工程实验Lab3
  7. 杂谈随感-7:《末代皇帝》电影的启示
  8. python年月日时分秒
  9. 【FXCG】欧元区通胀率意外创纪录新高
  10. lisp CAD二次开发 宗地线自动编号