一文读懂CAN通讯协议(二)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 一文读懂CAN通讯协议

3.1数据帧和遥控帧

数据帧和遥控帧都有标准格式扩展格式,这2种格式都具有相同的帧结构

数据帧由7个段构成,遥控帧由6个段构成。先看数据帧

edd265496c687901eb64d45ec6a3bbca_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图13 数据帧结构及其两种格式(引自[4])

991917713e32ca2bb17b3e91dc69689c_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[6]

这里结合实际采集的CAN总线电压信号来看下标准格式的数据帧。

41e6b99028c37bddd839978b10976f11_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图14 标准(格式)数据帧的CAN总线电压(引自[5])

再看遥控帧(也叫远程帧):

19cdb504a0c3e4f0288c6b66f41a6402_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图15 遥控帧的两种格式(引自[4])

通过图13和15对比数据帧和遥控帧有:

8d140ac648dd6f1c46b21a42707879ba_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

通过对数据帧和遥控帧有了基本认识,下面我们再具体了解下每个段。

1) 帧起始(SOF, Start of Frame)

表示帧开始的段1个位的显性位。(总线空闲时为隐性位,故帧起始以显性位非常好识别),对于数据帧和遥控帧的标准/扩展格式均如此。

669ff91c64e6821110c2bbb20c503f7b_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

2) 仲裁段(Arbitration field)

表示数据的优先级的段,起作用就是根据报文ID来确定其发送优先级。标准格式和扩展格式在此的构成有所不同。

26c66d5f4d8b945c3b40a7f763e37975_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

这里对比数据帧与遥控帧各自的两个格式,其不同为:

27567cd148ae404bc5c37f05bdf38213_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

针对上表的这种设计,后面会具体分析其在仲裁过程的作用。

3) 控制段(Control field)

表述数据段的字节数,由6个位构成,标准格式和扩展格式的构成有所不同。

d648f15c40fce9d179aa745c7d6618de_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

7ea973879d18f2a7bab6c241b0ac1cf6_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

e08630537623bad8c2516f41b1cc18ce_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图16 控制段与数据段的关系(引自[5])

4) 数据段(Data Field)

数据段可包含0-8个字节的数据,从MSB(最高位)开始输出。遥控帧没有此段。

c790091cb7974337c94351d597674fa3_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

5) CRC段(Cyclic Redundancy Check Field)

检查帧传输错误的帧,由15个位的CRC顺序和1个位的CRC界定符(用于分隔位)构成。CRC界定符恒为隐性。

036c4f2588ebb6f4dc9f46aa841327f1_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

这里CRC顺序是根据多项式生成的CRC值,CRC的计算范围包括帧起始,仲裁段,控制段和数据段。

b2ec9be063453f3a7560ef312e3e15c9_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图17 CRC序列计算方法

附2:en.wikipedia.org/wiki/C , 如何通俗的理解CRC校验并用C语言实现, zhuanlan.zhihu.com/p/77

6) ACK段(Acknowledge Field)

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

14a7687a8faad70c712ce458a53d87ee_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

8085d3dc844b3a4726fadd76d4fb6b5c_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

ba40d592b3657152d173fa586325f81b_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图18 发送与接收时的ACK槽状态(引自[3])

7) 帧结束(End of Frame)

表示该帧的结束的段。由7个位的隐性位构成。

56b0c7f750d3e948793fdfb3b2178c63_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

3.2 错误帧

用于在接收和发送消息时检测出错误通知错误的帧,错误帧由错误标志错误界定符构成。

3f156e1cdec23b88b1048671901789da_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图19 错误帧结构(引自[4])

上图的错误标志包括主动错误标志(6个位的显性位)和被动错误标志(6个位的隐性位)两种。主动错误标志处于主动错误状态下的单元检测出错误时输出的错误标志。被动错误标志处于被动错误状态的单元检测出错误时输出的错误标志。错误界定符由8个位的隐性位构成。

注意上图0~6位的错误标志重叠,这段怎么确定呢?需先介绍2个概念:位填充错误类型

1)位填充(Bit Stuffing)

位填充是为防止突发错误而设定的功能。当同样的电平持续5位则添加一个位的反型数据位:

c640ed33075d05a31a0f366ae65792b5_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图20 位填充示意(引自[4])

271fe01074e05767200a7348ffc96667_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

注意:位填充作用范围为SOF-CRC段机间的数据

2)错误类型

5f8c5004a6a25bfa1213396bb02e0c22_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

d0e7e0d93ba28dd62a6269bd637bcf56_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图21 CRC匹配示意(引自[6])

af20fa6b0991dd0b7a00196d316992dd_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图22 CRC错误(引自[6])

针对上述 位错误再做说明(引自[3]):所谓“发出的电平与从总线上回读的电平不一致”,指的就是 节点向总线发出隐性位,却从总线上回读到显性位或者 节点向总线发出显性位,却从总线上回读到隐性位这两种情况。有三种例外情况不属于位错误:在仲裁区,节点向总线发送隐性位却回读到显性位,不认为是位错误,这种情况表示该节点仲裁失败;在ACK槽,节点向总线发送隐性位却回读到显性位,不认为是位错误,这种情况表示,该节点当前发送的这一帧报文至少被一个其它节点正确接收;一个节点发送被动错误标志,该节点向总线发送连续六个隐性位(被动错误标志)却回读到显性位,不认为是位错误。因为被动错误标志是六个连续的隐性位,所以在总线上按照线与机制,有可能这六个连续隐性位被其它节点发送的显性电平覆盖。

3)错误处理

错误状态的种类有:主动错误状态被动错误状态总线关闭态3种状态。单元始终处于3种状态之一。

(1)主动错误状态:可以正常参加总线通信的状态,处于主动错误状态的单元检测出错误时,输出主动错误标志。

(2)被动错误状态:是易引起错误的状态。处于被动错误状态的单元虽能参加总线通信,但为不妨碍其他单元通信,接收时不能积极地发送错误通知;处于被动错误状态的单元即使检测出错误,而其它处于主动错误状态的单元如果没发现错误,整个总线也被认为是没有错误的。处于被动错误状态的单元检测出错误时,输出被动错误标志。另外,处于被动错误状态的单元在不能马上再次开始发送。在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8个位的隐性位)。

(3)总线关闭态是不能参加总线上通信的状态。信息的接收和发送均被禁止。

以上这些状态依靠发送错误计算和接收错误计数来管理,根据计数值决定进入何种状态。错误状态和计数值的关系如下表:

97cafb26d12239dbda825508434fc42f_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

0f0b1aab8b59a8a7096ccf6a1d50c8ca_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图23 单元的错误状态(引自[4])

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

7671c20ab7088e5c8edc8ccf6f2ef4ec_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

4)错误帧发送

检查到错误后,什么时候发送错误帧呢?按照CAN协议的规定:

  • 位错误、填充错误、格式错误、ACK错误。在错误产生的那一位的下一位开始发送错误帧
  • CRC错误。紧随ACK界定符后的位发送错误帧

具体来看一个例子:

574687c64b90ad077178caba3987ac92_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图24 错误帧(引自[3])

  • 1)发送节点Node_A发送一个显性位,但是却从总线上听到一个隐形位,于是Node_A节点就会检测到一个位错误;
  • 2)Node_A检测到位错误之后,立即在下一位开始发送主动错误帧:6个连续显性位的主动错误标志+8个连续隐性位的错误界定符;
  • 3)对应Node_A发出的主动错误标志,总线上电平为6个连续显性位;
  • 4)接收节点Node_B和Node_C从总线上听到连续6个显性位,那么就会检测到一个填充错误,于是这两个节点都会发送主动错误帧;
  • 5)对应Node_B和Node_C发出的主动错误标志,总线电平又有6个连续显性电平,对应Node_B和Node_C发出的错误界定符,总线电平有8个连续的隐性电平。
  • 6)在间歇场之后,Node_A节点重新发送刚刚出错的报文。

在了解了错误帧的发送后,回到之前提到错误标志重叠部分是怎样形成的,再看一个例子:

3a02212edb7c4e01c896811adc092a2b_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

图25 (引自[3])

在这个例子,我们知道位错误的错误标志与填充错误的错误标志重叠2位,剩下部分还有4位:

9def96191bfe41a7b7dd267e55d0e3d0_640_wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1.jpg

引自[4]

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
编解码 监控 网络协议
一文读懂以太网与CANoe的配置
一文读懂以太网与CANoe的配置
一文读懂以太网与CANoe的配置
|
1月前
|
存储 网络协议 Linux
|
1月前
|
网络协议 Java 网络安全
【计算机网络】—— Socket通信编程与传输协议分析
【计算机网络】—— Socket通信编程与传输协议分析
52 0
|
1月前
|
网络协议 算法 安全
|
10月前
|
网络协议 网络架构
LinuxUDP协议编程(下)
LinuxUDP协议编程(下)
68 0
|
1月前
|
存储 传感器 移动开发
嵌入式系统中详解 Modbus 通信协议(清晰易懂)
嵌入式系统中详解 Modbus 通信协议(清晰易懂)
187 0
|
10月前
|
存储 域名解析 网络协议
LinuxUDP协议编程(上)
LinuxUDP协议编程
90 0
|
芯片
一文搞懂I2C协议-硬件基础
I2C总线是由飞利浦在80年代初设计的,以允许位于同一电路板上的组件之间能够轻松通信。其大大简化了电路的设计,早期的电视机中很多地方用到了I2C这种通信方式。飞利浦半导体于2006年迁移到了NXP。I2C名称翻译为“ Inter IC”。有时,该总线称为IIC或I²C总线。I2C总结的基本的特征
918 0
|
算法 大数据 数据处理
一文读懂AutoSAR通信模块
一文读懂AutoSAR通信模块
一文读懂AutoSAR通信模块
|
域名解析 存储 缓存
计算机网络协议基础知识
网络协议基础知识:OSI七层网络模型,TCP/IP四层、五层协议,TCP协议的三次握手和四次挥手,HTTP协议POST 与 GET 的区别。。。
99 0
计算机网络协议基础知识