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

简介: 一文读懂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]

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
一文读懂Can总线错误处理
一文读懂Can总线错误处理
一文读懂Can总线错误处理
|
存储 安全 算法
一文理解UDS安全访问服务(0x27)
一文理解UDS安全访问服务(0x27)
一文理解UDS安全访问服务(0x27)
|
Kubernetes 网络协议 Linux
Softether VPN 打通 Kubernetes 调试网络
通过 Softether VPN 打通 Kubernetes 调试网络,其中包括无拆分隧道限制的版本,可以自定义推送路由
2496 2
|
4月前
|
固态存储 Windows
固态硬盘如何正确分区?SSD实用分区方案
固态硬盘(SSD)已成为提升电脑速度的关键。本文详解SSD正确分区方法,避免性能下降与寿命缩短,教你如何合理分区分区、设置4K对齐,并提供Windows磁盘管理与DiskGenius两种实用分区方案,助你高效使用SSD。
|
传感器 算法 安全
CAN 帧中 CRC 场的作用
CAN帧中的CRC场用于检测数据传输错误,通过计算发送数据的校验码并在接收端进行验证,确保数据的完整性和准确性。
|
存储 缓存 网络协议
了解 ARP 系列 – ARP、inARP、GARP 和 RARP
了解 ARP 系列 – ARP、inARP、GARP 和 RARP
903 4
|
异构计算
【FPGA】Verilog 编码实现:与非门 | 或非门 | 异或门 | NAND/NOR/XOR 行为验证
【FPGA】Verilog 编码实现:与非门 | 或非门 | 异或门 | NAND/NOR/XOR 行为验证
2671 0
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
3237 4
|
前端开发 数据可视化
前端轮询问题之使用setInterval进行轮询时遇到问题如何解决
前端轮询问题之使用setInterval进行轮询时遇到问题如何解决
361 0
|
存储 安全 Linux
嵌入式Linux系统bringup 启动全景解析
嵌入式Linux系统bringup 启动全景解析
496 0

热门文章

最新文章