一文搞懂CAN总线协议帧格式

简介: CAN总线上传输的信息称为报文,当总线空闲时任何连接的单元都可以开始发送新的报文。

CAN总线上传输的信息称为报文,当总线空闲时任何连接的单元都可以开始发送新的报文。


CAN通信是通过以下5种类型的帧进行的:


数据帧

遥控帧

错误帧

过载帧

帧间隔

另外,数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有 11 个位的标识符(Identifier: 以下简称 ID), 扩展格式有 29 个位的 ID。


各种帧的用途如下表所示:


3187e9e3f094429ca97e43b0ba0caa1d[6].png


关注公众号:美男子玩编程,优先推送最新技术博文,创作不易,请各位朋友多多点赞、收藏、关注支持~


数据帧由7个段构成,图解说明如下所示:


ef933d05d7d54d119b0fbd29d20a20b2[1].png


帧起始:表示数据帧开始的段;

仲裁段:表示该帧优先级的段,根据仲裁段ID码长度的不同,分为标准帧(CAN 2.0A)和扩展帧(CAN 2.0B);

控制段:表示数据的字节数及保留位的段;

数据段:数据的内容,可发送0~8个字节的数据;

CRC段:检查帧的传输错误的段;

ACK段:表示确认正常接收的段;

帧结束:表示数据帧结束的段。


1、数据帧


1.1、帧起始

帧起始由1个显性位组成。总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。


058a19e7c51c4e56aaa1cf18f29e1781[1].png


总线上的电平有显性电平和隐性电平两种。


总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”。


“显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平。并且,“隐性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。(显性电平比隐性电平更强。)


1.2、仲裁段

仲裁段用于写明需要发送到目的CAN节点的地址、确定发送的帧类型(当前发送的是数据帧还是遥控帧),并确定发送的帧格式是标准帧还是扩展帧。


仲裁段在标准格式帧和扩展格式帧中有所不同。标准格式帧的仲裁段由11位标识符和远程发送请求位RTR组成,扩展格式帧的仲裁场由29位标识符和远程发送请求位RTR组成。


1679867f6662485d97d01b46a23e5c21[1].png


85c1de8c3d464b8d85aaf11526369001[3].png


8be9c5d5de134cffb411d7b6e883f351[4].png


4a472823ef6b4d4793c8346e991ce843[3].png


1.2.1、标准数据帧

标准数据帧基于早期的CAN规格(1.0和2.0A版),使用了11位的识别域。


CAN标准帧帧信息是11字节,包括帧描述符和帧数据两部分。如下表所列:


9c6ba7befddf43a5ba1ebe17619b18ae[3].jpeg


前3字节为帧描述部分。字节1为帧信息,第7位(FF)表示帧格式,在标准帧中FF=0,第6位(RTR)表示帧的类型,RTR=0表示为数据帧,RTR=1表示为远程帧。DLC表示在数据帧时实际的数据长度。


标准数据帧的 ID 有 11 个位。从 ID10 到 ID0 依次发送。禁止高 7 位都为隐性(禁止设定:ID=1111111XXXX)。


字节2~3为报文识别码,其高11位有效。


字节4~11为数据帧的实际数据,远程帧时无效。


1.2.2、扩展数据帧

CAN扩展帧帧信息是13字节,包括帧描述符和帧数据两部分,如下表所示:


76da5affab27401f92fcfc09d7ac73ab[3].jpeg


前5字节为帧描述部分。字节1为帧信息,第7位(FF)表示帧格式,在扩展帧中FF=1,第6位(RTR)表示帧的类型,RTR=0表示为数据帧,RTR=1表示为远程帧。DLC表示在数据帧时实际的数据长度。


扩展格式的 ID 有 29 个位。基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0 表示。基本 ID 和 标准格式的 ID 相同。禁止高 7 位都为隐性(禁止设定:基本 ID=1111111XXXX)。


字节2~5为报文识别码,其高28位有效。


字节6~13为数据帧的实际数据,远程帧时无效。


1.3、控制段

控制段由6个位组成,包括数据长度代码和两个将来作为扩展用的保留位,标准格式和扩展格式的构成有所不同。


数据长度代码指示了数据段中的字节数量。数据长度代码为4个位,在控制段里被发送,数据帧长度允许的字节数为0、1、2、3、4、5、6、7、8,其他数值为非法的。


e9a09cac2789424797aab572cef8dcc0[1].png


保留位(r0、r1)必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。


数据长度码(DLC)与数据的字节数的对应关系如下表所示:


2e418104d399486ebe4b92ccee8f4af6[1].png


数据的字节数必须为 0~8 字节,但接收方对 DLC = 9~15 的情况并不视为错误。


1.4、数据段

数据段由数据帧中的发送数据组成,它可以为0~8字节,每字节包含了8位,首先发送最高有效位MSB,依次发送至最低有效位LSB。


c92a618ef6d14b21aaa611d8021d035a[1].png


1.5、CRC段

CRC段是检查帧传输错误的帧,包括:15 个位的 CRC序列(CRC SEQUENCE)和1 个位的CRC界定符(CRC DELIMITER)构成。


83b8ec9103bd4f2ba61aee7b905173a7[1].png


CRC序列是根据多项式生成的 CRC 值,CRC 的计算范围包括:帧起始、仲裁段、控制段、数据 段。 接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。


818893bfe4534c9e806d359954f3e39d[1].png


1.6、ACK段

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


cbaaf373f32a4b5f90003fa9ddf5b6fc[1].png


发送单元在 ACK 段发送 2 个位的隐性位。当接收器正确地接收到有效的报文时,接收器就会在应答间隙(ACK SLOT)期间(发送ACK 信号)向发送器发送一个“显性”的位以示应答,通知发送单元正常接收结束,这称作“发送 ACK”或者“返回 ACK”。


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


1.7、帧结束

帧结束是由每一个数据帧和远程帧的标志序列界定的,这个标志序列由7个“隐性”位组成。


51e76c43818746df83057819cbcefff8[1].png


2、标准数据帧和扩展数据帧

CAN协议可以接收和发送11位标准数据帧和29位扩展数据帧,CAN标准数据帧和扩展数据帧只是帧ID长度不同,以便可以扩展更多CAN节点。


2.1、标准数据帧

标准数据帧基于早期的CAN规格(1.0和2.0A版),使用了11位的识别域。


CAN标准帧帧信息是11字节,包括帧描述符和帧数据两部分。如下表所列:


9c6ba7befddf43a5ba1ebe17619b18ae[4].jpeg


前3字节为帧描述部分。字节1为帧信息,第7位(FF)表示帧格式,在标准帧中FF=0,第6位(RTR)表示帧的类型,RTR=0表示为数据帧,RTR=1表示为远程帧。DLC表示在数据帧时实际的数据长度。


标准数据帧的 ID 有 11 个位。从 ID10 到 ID0 依次发送,可以出现2^11种报文,帧ID的范围是:000-7FF,禁止高 7 位都为隐性(禁止设定:ID=1111111XXXX)。


字节2~3为报文识别码,其高11位有效。


字节4~11为数据帧的实际数据,远程帧时无效。


2.2、扩展数据帧

CAN扩展帧帧信息是13字节,包括帧描述符和帧数据两部分,如下表所示:


76da5affab27401f92fcfc09d7ac73ab[4].jpeg


前5字节为帧描述部分。字节1为帧信息,第7位(FF)表示帧格式,在扩展帧中FF=1,第6位(RTR)表示帧的类型,RTR=0表示为数据帧,RTR=1表示为远程帧。DLC表示在数据帧时实际的数据长度。


扩展格式的 ID 有 29 个位,基本 ID 从 ID28 到 ID18,扩展 ID 由 ID17 到 ID0 表示,基本 ID 和 标准格式的 ID 相同,可以出现2^29种报文,且在数据链路上是有间隙的(对操作者透明),帧ID的范围是0000 0000-1FFF FFFF,禁止高 7 位都为隐性(禁止设定:基本 ID=1111111XXXX)。


字节2~5为报文识别码,其高28位有效。


字节6~13为数据帧的实际数据,远程帧时无效。


2.3、标准数据帧和扩展数据帧的特性

CAN标准数据帧和扩展数据帧只是帧ID长度不同,功能上都是相同的,它们有一个共同的特性:帧ID数值越小,优先级越高。


85c1de8c3d464b8d85aaf11526369001[4].png

8be9c5d5de134cffb411d7b6e883f351[5].png

4a472823ef6b4d4793c8346e991ce843[4].png


3、遥控帧


3.1、遥控帧格式

遥控帧是接收单元向发送单元请求发送数据所用的帧,遥控帧由 6 个段组成,遥控帧没有数据段。


遥控帧的构成如下所示:


帧起始(SOF):表示帧开始的段;

仲裁段:表示该帧优先级的段。可请求具有相同 ID 的数据帧;

控制段:表示数据的字节数及保留位的段;

CRC 段:检查帧的传输错误的段;

ACK 段:表示确认正常接收的段;

帧结束:表示遥控帧结束的段。

遥控帧格式如下图所示:


6812892b493047b8b26db7287ed41d98[1].png


3.2、数据帧和遥控帧的区别

数据帧和遥控帧主要有两点区别:


遥控帧没有数据帧的数据段;

遥控帧RTR位是隐性,RTR位的极性表示了所发送的帧是数据帧(RTR位“显性”)还是远程帧(RTR位“隐性”)。所以,没有数据段的数据帧和遥控帧可通过 RTR 位区别开来。

9ee1ad5234c04d4c9e5a71e891507eb9[1].png


4、错误帧


4.1、错误帧格式

错误帧由错误标志(Error Flag)和错误界定符(Error Delimiter)组成。


接收节点发现总线上的报文有错误时,将自动发出活动错误标志,它是6个连续的显性位。其他节点检测到活动错误标志后发送错误认可标志,它由6个连续的隐性位组成。由于各个接收节点发现错误的时间可能不同,所以总线上实际的错误标志可能由6~12个显性位组成。


错误界定符由 8 个位的隐性位构成。当错误标志发生后,每一个CAN 节点监视总线,直至检测到一个显性电平的跳变。此时表示所有的节点已经完成了错误标志的发送,并开始发送8个隐性电平的界定符。


如下所示:


a0c307eb595b408b936933a595d15d25[2].png


4.2、主动错误标志和被动错误标志

错误标志包括主动错误标志和被动错误标志两种。

主动错误标志:处于主动错误状态的单元检测出错误时输出的错误标志,6 个位的显性位;

被动错误标志:处于被动错误状态的单元检测出错误时输出的错误标志,6 个位的隐性位。

db1be57a517744cc8623e9b4ea1bacca[2].png


4.3、错误帧种类

错误帧共有 5 种,多种错误可能同时发生,种类如下所示:


位错误

填充错误

CRC 错误

格式错误

ACK 错误

错误的种类、错误的内容、错误检测帧和检测单元如下表所示:


350d64e029854d92bdfd9e5e8978f1b0[2].png


重点聊一聊位错误和格式错误。


位错误特性如下所示:


位错误由向总线上输出数据帧、遥控帧、错误帧、过载帧的单元和输出 ACK 的单元、输出错误的单元来检测;

在仲裁段输出隐性电平,但检测出显性电平时,将被视为仲裁失利,而不是位错误;

在仲裁段作为填充位输出隐性电平时,但检测出显性电平时,将不视为位错误,而是填充错误;

发送单元在 ACK 段输出隐性电平,但检测到显性电平时,将被判断为其它单元的 ACK 应答,而非位错误;

输出被动错误标志(6 个位隐性位)但检测出显性电平时,将遵从错误标志的结束条件,等待检测出连续相同 6 个位的值(显性或隐性),并不视为位错误。

格式错误特性如下所示:


即使接收单元检测出 EOF(7 个位的隐性位)的最后一位(第 8 个位)为显性电平,也不视为格式错误;

即使接收单元检测出数据长度码(DLC)中 9∼15 的值时,也不视为格式错误。

发送单元发送完错误帧后,将再次发送数据帧或遥控帧,错误标志输出时序如下表所示:


edce1143e2f34bcab79928fa65f56c44[2].png


5、过载帧

过载帧是用于接收单元通知其尚未完成接收准备的帧,过载帧由过载标志和过载界定符构成。


53f4d8a7a0f645e6ab26084d98008dbf[1].png


过载标志由6个位的显性位组成,过载标志的构成与主动错误标志的构成相同。过载标志其形式破坏了间歇场的固定格式,结果使其他所有节点也检测到了一个出错状态,就都各自送出一个超载标志。

8810645ef09e42a7b52fc91f1cc8fe43[1].png


过载界定符由8个位的隐性位组成,过载界定符的构成与错误界定符的构成相同。过载标志发送完毕后,每个节点都对总线进行监察,直到检测到一个隐性位为止。此时,每个节点均已发送完各自的过载标志,接着所有节点还要同时开始发送7个隐性位,配齐长达8位的过载界定符。

过载帧的构成如下图所示:


f4142b53ff984ae0a2b4abcdcba39bd6[1].png


6、帧间隔

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


帧间隔的构成如下图所示:


918b4f4aec104fa9942377a40b5d5a8a[1].png


帧间隔由间隔段、总线空闲段和延迟传送段组成,具体说明如下所示:


间隔段:间歇由3个隐性位构成。在间歇期间,不允许任何节点发送数据帧或远程帧。唯一可以执行的操作是通报超载状态;

总线空闲段:总线空闲时间长短不限。总线一经确认处于空闲状态,则任何节点都可以访问总线来传送信息。因另一帧正在传送而延期发送的帧是从间歇之后的第一位开始送出的。通过对总线进行检测,出现在总线空闲期间的显性位将被认为是帧起始;

延迟传送段:处于错误认可状态的节点完成其发送动作后,在被允许发送下一帧以前,它要在间歇之后送出8个隐性位。如果间歇期间执行了(由另一个节点引起的)发送动作,此节点将会变成正被发送的帧的接收器。


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
CAN总线位时序的介绍
CAN总线利用CAN_H和CAN_L线的电位差传输数据,显性电平(0,2.5V差值)对应逻辑0,隐性电平(1,0V差值)对应逻辑1。由于NRZ无返回零通信方式,同步是个挑战,特别是距离远时。为解决同步问题,CAN总线采用硬件同步和再同步技术,位时序分为同步段、传播段、两个相位缓冲段,每个段由Tq时间量子构成,允许调整以确保多个单元间的同步采样。
547 0
|
开发工具 Perl
zynq 7000 sdk下裸机can(ps/pl) 调试
zynq 7000 sdk下裸机can(ps/pl) 调试
1350 0
zynq 7000 sdk下裸机can(ps/pl) 调试
|
10月前
|
存储 安全 数据安全/隐私保护
STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建
本文介绍了基于STM32的Customer BootLoader刷新项目的第一部分:使用STM32CubeMX搭建UART串口通信工程。项目采用正点原子探索者v2开发板,通过USB串口与上位机通信,实现固件刷新功能。主要内容包括: 1. 硬件原理图介绍:详细描述了开发板的串口连接方式及电路图。 2. STM32CubeMX工程搭建:从创建新工程、配置系统时钟、USART串口设置到生成代码,一步步详细说明。 3. 代码编写:展示了如何使用HAL库实现串口接收和发送数据,并提供了main.c的完整代码。 4. 工程下载和调试:编译并下载工程到开发板,通过串口调试助手验证通信功能。
STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建
|
IDE 开发工具
【CAN总线】手把手教你学习CAN总线(一)
【CAN总线】手把手教你学习CAN总线(一)
|
10月前
|
安全 数据安全/隐私保护
如何制作劳务人员实名制管理二维码?
在建筑行业,二维码技术正革新人员管理方式。通过为每位工人配备专属二维码,企业可实时掌握其身份、培训和安全状况,简化信息录入与查询流程,提升管理精度与效率,降低安全风险。典型应用案例包括中建三局、中铁上海局等企业,通过二维码实现智能化、精细化管理。制作实名制二维码简单快捷,涵盖信息收集、登录草料二维码官网、批量生成及打印发放等步骤。此外,二维码还在设备管理、区域巡查、信息展示和安全生产教育等方面发挥重要作用,助力企业实现数字化转型,提升整体工作效率与安全性。
|
Java Android开发
Eclipse启动报错:org.eclipse.e4.core.di.InjectionException: java.lang.NoClassDefFoundError: javax/annotat
Eclipse启动报错:org.eclipse.e4.core.di.InjectionException: java.lang.NoClassDefFoundError: javax/annotat
1094 0
Eclipse启动报错:org.eclipse.e4.core.di.InjectionException: java.lang.NoClassDefFoundError: javax/annotat
|
11月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
603 15
|
传感器
CAN 帧有哪些类型
CAN帧主要有五种类型:数据帧,用于传输数据;远程帧,用于请求数据;错误帧,表示检测到错误;过载帧,表示接收器需要延时;帧间隔,用于分隔不同的帧。
|
缓存 JavaScript 前端开发
js和html代码一定要分离吗
JavaScript(JS)和HTML代码的分离虽非绝对必要,但通常被推荐