Can 通信-协议

news2024/9/29 17:22:21

概述

CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO国际标准化的串行通信协议。
在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统 被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需 要,1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后,CAN 通过 ISO11898 及 ISO11519 进 行了标准化,现在在欧洲已是汽车网络的标准协议。
现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。
下图 是车载网络的构想示意图。CAN 等通信协议的开发,使多种 LAN 通过网关进行数据交换得以实现。

下图为CAN 的应用示例

发展历史

  1. 1970s:创始

    CAN总线最早于20世纪70年代由德国的罗伯特·博丁(Robert Bosch GmbH)开发,用于解决汽车电子系统的通信需求。博丁的团队在开发CAN总线时主要关注实时性、可靠性和抗干扰性。

  2. 1980s:首次应用于汽车业

    CAN总线于1986年首次应用于汽车电子控制系统,这标志着它在汽车行业中的商业化应用。它取代了传统的多芯电缆,并改进了汽车电子系统的通信。

  3. 1990s:国际标准化

    1991年,CAN总线成为国际标准ISO 11898的一部分。这一标准化促进了CAN总线在世界范围内的广泛应用,不仅用于汽车,还用于工业自动化、医疗设备和其他领域。

  4. 21世纪:广泛应用

    从21世纪初期开始,CAN总线逐渐成为嵌入式系统和工业自动化领域的标准通信协议。它也被广泛用于飞机、火箭、医疗设备和电力系统等领域。

  5. CAN FD(CAN with Flexible Data Rate)

    为了满足更高数据传输速率的需求,CAN FD于2012年引入。CAN FD允许更高的数据速率,同时保持CAN总线的实时性和可靠性。

  6. 2020s:现代化

    CAN总线仍然是许多领域的关键通信协议,但现代应用要求更高的性能、数据吞吐量和网络复杂性。因此,CAN总线继续演进,以满足新的需求。

特点

  • (1) 多主控制

                在总线空闲时,所有的单元都可开始发送消息(多主控制)。
                最先访问总线的单元可获得发送权(CSMA/CA 方式*1)。
                多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权。

  • (2) 消息的发送

        在 CAN 协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以开始发送新消息。两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消
息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。

  • (3) 系统的柔软性

        与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。

  • (4) 通信速度

        根据整个网络的规模,可设定适合的通信速度。
        在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。

  • (5) 远程数据请求

        可通过发送“遥控帧” 请求其他单元发送数据。

  • (6) 错误检测功能·错误通知功能·错误恢复功能

        所有的单元都可以检测错误(错误检测功能)。
        检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。
        正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。

  • (7) 故障封闭

        CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。

  • (8) 连接

        CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。

总线拓扑图

CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。

物理电平


  在 CAN总 线上,利用 CAN_H 和 CAN_L 两根线上的电位差来表示 CAN 信号。CAN 总线上的电位差分为 显性电平(Dominant Voltage) 和 隐性电平(Recessive Voltage) 。其中显性电平为逻辑 0,隐性电平为逻辑 1。模块以线与的方式连接到总线:如果只有一个节点将总线驱动到逻辑0,则整个总线处于该状态,而不管发送逻辑1的节点数量。

  • 高速 CAN 总线在传输显性(0)信号时,会将 CAN_H 端抬向 5V 高电平,将 CAN_L 拉向 0V 低电平。当传输隐性(1)信号时,并不会驱动 CAN_H 或者 CAN_L 端。 显性信号 CAN_H 和 CAN_L 两端差分标称电压为 2V。 终端电阻在没有驱动时,将差分标称电压降回 0V。显性信号(0)的共模电压需要在 1.5V 到 3.5V 之间。隐性信号(1)的共模电压需要在 +/-12V。

  • 低速/容错CAN信号在传输显性信号(0)时,驱动CANH端抬向5V,将CANL端降向0V。在传输隐性信号(1)时并不驱动CAN 总线的任何一端。在电源电压Vcc为5V时,显性信号差分电压需要大于2.3V,隐性信号的差分电压需要小于0.6V。CAN总线两端未被驱动时,终端电阻使CANL端回归到RTH电压(当电源电压Vcc为5V时,RTH电压至少为Vcc-0.3V=4.7V),同时使CANH端回归至RTL电压(RTL电压最大为0.3V)。两根线需要能够承受-27V至40V的电压而不被损坏。

  在高速和低速CAN中,从隐性信号向显性信号过渡的速度更快,因为此时CAN线缆被主动积极地驱动。显性向隐性的过渡速度主要取决于CAN网络的长度和导线的电容。
  CAN总线采用不归零码位填充技术(NRZ),发送器只要检测到位流里有5个连续相同值的位,便自动在位流里插入补充位

错误

 错误状态的种类

单元始终处于 3 种状态之一。
(1) 主动错误状态
主动错误状态是可以正常参加总线通信的状态。
处于主动错误状态的单元检测出错误时,输出主动错误标志。
(2) 被动错误状态
被动错误状态是易引起错误的状态。
处于被动错误状态的单元虽能参加总线通信,但为不妨碍其它单元通信,接收时不能积极地发送错误通知。
处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。
处于被动错误状态的单元检测出错误时,输出被动错误标志。
另外,处于被动错误状态的单元在发送结束后不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8 个位的隐性位)。
(3) 总线关闭态
总线关闭态是不能参加总线上通信的状态。
信息的接收和发送均被禁止。
这些状态依靠发送错误计数和接收错误计数来管理,根据计数值决定进入何种状态。错误状态和计数值的关系如表 1 及下图  所示

错误计数值

发送错误计数值和接收错误计数值根据一定的条件发生变化。
错误计数值的变动条件如表 2 所示。
一次数据的接收和发送可能同时满足多个条件。
错误计数器在错误标志的第一个位出现的时间点上开始计数。

CAN 协议栈的基本概念

CAN 协议如表 3 所示涵盖了 ISO 规定的 OSI 基本参照模型中的传输层、数据链路层及物理层。
CAN 协议中关于 ISO/OSI 基本参照模型中的传输层、数据链路层及物理层,具体有哪些定义如下图所示。

* 1 LLC : Logical Link Control (逻辑链路控制 )
* 2 MAC : Medium Access Control (媒介访问控制)

        数据链路层分为 MAC 子层和 LLC 子层,MAC 子层是 CAN 协议的核心部分。数据链路层的功能是将物理层收到的信号组织成有意义的消息,并提供传送错误控制等传输控制的流程。具体地说,就是消息的帧化、仲裁、应答、错误的检测或报告。数据链路层的功能通常在 CAN 控制器的硬件中执行。
        在物理层定义了信号实际的发送方式、位时序、位的编码方式及同步的步骤。但具体地说,信号电平、通信速度、采样点、驱动器和总线的电气特性、连接器的形态等均未定义*1。这些必须由用户根据系统需求自行确定。

通信帧

帧的种类

通信是通过以下 5 种类型的帧进行的。
• 数据帧
• 遥控帧
• 错误帧
• 过载帧
• 帧间隔
另外,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有 11 个位的标识符(Identifier: 以下称 ID),
扩展格式有 29 个位的 ID。
各种帧的用途如表 7 所示

数据帧


数据帧由 7 个段构成。如下图所示。

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

遥控帧

接收单元向发送单元请求发送数据所用的帧。遥控帧由 6 个段组成。遥控帧没有数据帧的数据段。
帧起始表示数据帧开始的段。
仲裁段表示该帧优先级的段。
控制段表示数据的字节数及保留位的段。
CRC 段检查帧的传输错误的段。
ACK 段表示确认正常接收的段。
帧结束表示数据帧结束的段。

遥控帧和数据帧
• 数据帧和遥控帧的不同
         遥控帧的 RTR 位为隐性位,没有数据段。
        没有数据段的数据帧和遥控帧可通过 RTR 位区别开来。
• 遥控帧没有数据段,数据长度码该如何表示?
        遥控帧的数据长度码以所请求数据帧的数据长度码表示。
• 没有数据段的数据帧有何用途?
        例如,可用于各单元的定期连接确认/应答、或仲裁段本身带有实质性信息的情况下。 

 

错误帧

用于在接收和发送消息时检测出错误通知错误的帧。错误帧由错误标志和错误界定符构成。
错误帧的构成如图 25 所示。
(1) 错误标志
错误标志包括主动错误标志和被动错误标志两种。
 主动错误标志:6 个位的显性位。
 被动错误标志:6 个位的隐性位。
(2) 错误界定符
错误界定符由 8 个位的隐性位构成。 

* 1 主动错误标志
处于主动错误状态的单元检测出错误时输出的错误标志。
* 2 被动错误标志
处于被动错误状态的单元检测出错误时输出的错误标志。

过载帧

过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。
过载帧的构成如图 26 所示。
(1) 过载标志
6 个位的显性位。
过载标志的构成与主动错误标志的构成相同。
(2) 过载界定符
8 个位的隐性位。
过载界定符的构成与错误界定符的构成相同。

帧间隔

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

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

优先级的决定

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

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

(2)标准格式和扩展格式的优先级
标准格式 ID 与具有相同 ID 的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式的 RTR 位为显性位
的具有优先权,可继续发送。
标准格式和扩展格式的仲裁过程如图 30 所示。

位填充

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

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

错误的种类

错误共有 5 种。多种错误可能同时发生。
• 位错误
• 填充错误
• CRC 错误
• 格式错误
• ACK 错误
错误的种类、错误的内容、错误检测帧和检测单元如表 9 所示。

错误帧的输出

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

位时序

由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。
• 同步段(SS)
• 传播时间段(PTS)
• 相位缓冲段 1(PBS1)
• 相位缓冲段 2(PBS2)
这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。
1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。
1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可
同时采样,也可任意设定采样点。
各段的作用和 Tq 数如表 11 所示。1 个位的构成如图 32 所示。

采样点
所谓采样点是读取总线电平,并将读到的电平作为位值的点。位置在 PBS1 结束处。

取得同步的方法


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

硬件同步

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

再同步

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

调整同步的规则

硬件同步和再同步遵从如下规则。
(1) 1 个位中只进行一次同步调整。
(2) 只有当上次采样点的总线值和边沿后的总线值不同时,该边沿才能用于调整同步。
(3) 在总线空闲且存在隐性电平到显性电平的边沿时,则一定要进行硬件同步。
(4) 在总线非空闲时检测到的隐性电平到显性电平的边沿如果满足条件(1)和(2),将进行再同步。但还要
满足下面条件。
(5) 发送单元观测到自身输出的显性电平有延迟时不进行再同步。
(6) 发送单元在帧起始到仲裁段有多个单元同时发送的情况下,对延迟边沿不进行再同步。

参考

https://blog.csdn.net/ZCShouCSDN/article/details/89603298

《CAN 入门书》 作者 瑞萨科技

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

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

相关文章

Spring中shutdown hook作用

在Spring框架中,Shutdown Hook(关闭钩子)是一种机制,用于在应用程序关闭时执行一些清理操作Spring会向JVM注册一个shutdown hook,在接收到关闭通知的时候,进行bean的销毁,容器的销毁处理等操作在…

代码随想录算法训练营第23期day17| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

目录 一、(leetcode 110)平衡二叉树 二、(leetcode 257)二叉树的所有路径 三、(leetcode 404)左叶子之和 一、(leetcode 110)平衡二叉树 力扣题目链接 状态:已AC 求深…

【Qt】三种方式实现抽奖小游戏

简介 本文章是基本Qt与C实现一个抽奖小游戏,用到的知识点在此前发布的几篇文章。 下面是跳转链接: 【Qt控件之QLabel】用法及技巧链接: https://blog.csdn.net/MrHHHHHH/article/details/133691441?spm1001.2014.3001.5501 【Qt控件之QPus…

C++ 类和对象(一)

1.面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完 成。 …

启山智软/商城源码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 启山智软一、五种商业模式赋能1.S2B2C供应链商城2.B2B2C多商户商城3.B2C单商户商城4.O2O外卖配送5.社区团购 二、过硬的编程实力1.前端2.后端 总结 启山智软 想要了…

【【萌新的SOC学习之AXI接口简介】】

萌新的SOC学习之AXI接口简介 AXI总线的初步介绍 AXI 总线是 ARM AMBA 一部分 (高级可扩展接口) AMBA(高级微控制器总线架构) :开放的片内互联的总线标准,能再多主机设计中实现多个控制器和外围设备之间的连接和管理。…

配置Hive使用Spark执行引擎

配置Hive使用Spark执行引擎 Hive引擎概述兼容问题安装SparkSpark配置Hive配置HDFS上传Spark的jar包执行测试速度对比 Hive引擎 概述 在Hive中,可以通过配置来指定使用不同的执行引擎。Hive执行引擎包括:默认MR、tez、spark MapReduce引擎: 早…

利用excel表格进行分包和组包

实际使用中,我们可能希望修改某几个数据之后,最终的数据包能够自动发动数据,类似于在给结构体变量修改数据,自动生成完整的结构体; excel语法 1:拆分数据 LEFT(A4,2) – 取A4单元格左边的两个数据 RIGHT(A4…

4.02 用户中心-上传头像功能开发

详细内容请看下面地址: 地址:http://www.gxcode.top/code

【JavaScript】浅拷贝与深拷贝

引言 浅拷贝、深拷贝是对引用类型而言的。 引用类型的变量对应一个栈区地址,这个栈区地址处存储的值是存放的真正的数据的堆区地址。 基本数据类型的变量也对应一个栈区地址,但是该地址存储的是其真正的值。 let a b发生了什么? let obj…

MAX30102心率血氧传感器

MAX30102心率血氧传感器介绍 背景基本功能基本结构基本原理采集方法直通式采集方法反射式采集方法 血氧采集原理Beer-Lambert 定理皮肤组织模型血氧测量过程AC / DC 的计算 心率采集原理 实验结果代码走读资源链接 背景 目前,基本上所有的可穿戴式设备都集成了心率…

leetcode:190. 颠倒二进制位

一、题目: 函数原型: uint32_t reverseBits(uint32_t n) 解释:uint32是无符号int或short的别称,传入的参数是一个32位二进制串,返回值是该32位二进制串逆序后的十进制值 二、思路: 实际上并不需要真的去逆…

竞赛 深度学习 YOLO 实现车牌识别算法

文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于yolov5的深度学习车牌识别系统实现 该项目较…

计算机网络 | OSI 参考模型

计算机网络 | OSI 参考模型 计算机网络 | OSI 参考模型应用层表示层会话层传输层网络层数据链路层物理层 参考视频:王道计算机考研 计算机网络 参考书:《2022年计算机网络考研复习指导》 计算机网络 | OSI 参考模型 OSI 参考模型自下而上分为7层&…

函数reshape(-1,)里的-1的意思

reshape函数是对narray的数据结构进行维度变换,由于变换遵循对象元素个数不变,在进行变换时,假设一个数据对象narray的总元素个数为N,如果我们给出一个维度为(m,-1)时,我们就理解为将…

6个视频素材库,免费、高清、无水印,你值得拥有~

现在做自媒体的朋友真的越来越多了,对一些视频素材的要求也越来越高,除了自己拍摄之外,还可以在网上找各种无版权视频素材,但国内高质量视频素材大多数不免费,那免费的视频素材要去哪里找呢? 今天就给大家…

探索乡村新风貌:VR全景记录乡村发展,助力乡村振兴

引言: 中国乡村正经历着巨大变革,长期以来,乡村地区一直面临着人口外流、资源匮乏等问题。然而,近年来,政府的政策支持以及新兴技术的崭露头角,如虚拟现实(VR)全景记录,…

UEFI之DXE阶段

一、DXE阶段介绍 DXE(Driver Execution Environment)阶段执行大部分系统初始化工作,进入此阶段时,内存已经可以被完全使用,因而此阶段可以进行大量的复杂工作。 DXE可以分为以下两部分: DXE内核&#xff…

Spring源码解析——AOP的使用及AOP自定义标签

正文 我们知道在面向对象OOP编程存在一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为时,例如日志,安全检测等,我们只有在每个对象里引入公共行为,这样程序中就产生了大量的重复代码,所以有了…

TensorFlow入门(十七、神经元的拟合原理)

深度学习的概念源于人工神经网络的研究,神经网络是由多个神经元组成,。一个神经元由以下几个关键知识点组成: ①激活函数 ②损失函数 ③梯度下降 单个神经元的网络模型如图所示 用计算公式表达如下: z为输出的结果,x为输入,w为权重,b为偏置值。z…