CAN总线接口–协议

8.2 CAN总线接口–协议

       这一节我们将详细地了解CAN总线的协议以深入地掌握CAN总线应用和设计。目前CAN总线的标准化被分割成6个部分,即ISO 11898-1~6, 这个6个部分分别对CAN总线的链路层和物理层、高速物理介质附属层、低速物理介质附属层、时间触发的CAN通讯(即TTCAN)、低功耗的高速物理附属层、 可选择性唤醒的高速物理附属层等进行标准化以便于全球CAN网络节点制造商的产品能够相互兼容和互联。这些标准化文档的简介在ISO组织网站[1]可以搜索到, CAN网络节点产品的开发者必须仔细阅读这些文档确保自己的产品遵循这些标准。

       目前在用CAN总线版本分为2.0A、2.0B、FD,虽然CAN XL已经启动但尚未正式应用,除了已废止的标准,在用的ISO 11898的6个部分分别对这三种版本的低层协议实施标准化。 低层协议仅包括数据链路层(DLL)和物理层(PHY),CAN总线的高层协议基本上与行业有关。

       在8.1节我们从CAN2.0A的一个标准数据帧的位流开始了解CAN总线,现在我们再深入了解CAN2.0A标准的协议。 CAN2.0A标准协议支持4种协议帧:标准数据帧、远程请求帧、错误帧和过载帧,其中错误帧和过载帧都属于容错处理。当数据帧发送节点发送数据期间侦测到数据发送错误, 则发起主动错误帧(由连续6个显性位‘0’代表错误帧标志和连续8个隐性位’1‘代表错误定界符)告知CAN网络上其他节点放弃本次通讯,当数据帧接收者侦测到数据错误时, 则可以直接发出被动错误帧(由连续6个隐性位‘1’代表错误帧标志和连续8个隐性位’1‘代表错误定界符)。当网络接收者侦测到连续的数据帧之间侦测到非法的显性位‘0’时, 则直接发出过载帧(由连续6个显性位‘0’代表过载帧标志和连续8个隐性位’1‘代表过载帧定界符)。根据我们目前对CAN总线的竞争和仲裁方法的认识,被动错误帧不影响数据帧的发送, 过载帧被触发时将会破坏数据帧的发送,这是因为6个连续的显性位‘0’将违反CAN总线的位填充规则,迫使数据帧的发送者停止发送或发起主动错误帧。

       CAN总线的错误帧和过载帧的协议设计十分巧妙,使得CAN总线的数据传输效率极高且容错性也很高。事实上,在用的几种CAN总线版本始终沿用CAN2.0A的这种容错处理机制。 图8.6给出CAN2.0A标准的数据帧和远程请求帧,这两种位流是最常用的正常位流。信息发送者使用数据帧将节点数据广播到网络上,其他节点根据消息ID确定是否处理该消息。 某些节点需要主动地从其他节点读取信息时,只需要将远程请求帧(仅包含消息ID且无数据域)广播到网络上,然后具有对应消息ID的CAN网络节点将会发送一个标准的数据帧(包含有远程请求帧ID和数据), 到网络上,主动发起远程请求帧的CAN总线节点将会收到请求的数据。

../_images/can20a_protocol_frame_format.jpg

图8.6 CAN2.0A协议帧(标准数据帧和远程请求帧的位流格式)

       CAN2.0A标准的数据帧和远程请求帧仅支持11位长度的ID,数据域长度为0~8个字节。如图8.6,CAN2.0A标准的数据帧和远程请求帧的主要区别是仲裁域的最后一个位: RTR(Remote Transmission Request),标准数据帧中该位是显性的(‘0’),远程请求帧只能够该位是隐性的(‘1’)。此外,两种数据帧的控制域中4个DLC(Data Length Code)位用来指定数据域的字节个数, 标准数据帧中DLC[3:0]={0, 1, .., 8},远程请求帧中DLC的4个位都是‘0’表示无数据域。

       CAB2.0B标准仅仅是在CAN2.0A的基础上增加消息ID的位长度扩展,2.0B支持29个位长度的ID,同时将仲裁域的位个数也扩展至32个。为什么要扩展ID位长度呢? CAN总线使用ID和RTR位来竞争和仲裁总线的占用权,并不对CAN网络节点做其他的寻址定义,消息ID就像网络上数据信息的地址资源一样, 按照存储器映射机制,消息ID的二进制位宽度影响CAN网络上所有节点的数据信息总容量。因此,CAN2.0A标准迭代至CAN2.0B本质上是CAN网络上信息总容量的提升。

       引入29位的ID扩展之后,CAN2.0B还必须兼容CAN2.0A,即遵循CAN2.B标准的CAN网络节点和早期的CAN2.0A节点能够在同一个CAN网络上安全地传输数据, 这或许是制订CAN2.0B标准时的最大挑战。使用基本ID和ID扩展的CAN2.0B标准的数据帧和远程请求帧的位流格式如图8.7所示。

../_images/can20b_protocol_frame_format.jpg

图8.7 CAN2.0B协议帧(两种ID位长度的标准数据帧和远程请求帧的位流格式)

       对于图8.6和8.7的控制域的首位,在CAN2.0A标准的数据帧中该位称作保留位1(RB1)且始终保持为显性的(‘0’),在CAN2.0B标准的数据帧中该位被称作IDE(IDentifier Extension)。 再来对比图8.7(a)和(b),我们不难发现IDE位的作用,当遵循CAN2.0B标准的节点使用11位基本ID传送数据时该位保持显性(‘0’)与CAN2.0A标准的数据帧保持一致, 这样的数据帧在两种标准组成的CAN网络上传输时接收者不会有任何歧义;当遵循CAN2.0B标准的节点使用29位长的ID发送数据时该位则变成隐性(‘1’), 遵循CAN2.0A的网络节点将忽略此类数据帧,遵循CAN2.0B的节点则能够识别这是一个29位长度的ID的数据帧或远程请求帧。

       在8.1节中我们仅以CAN2.0A标准的位流来了解CAN总线的竞争和仲裁,把位流中的RB1和RB0两个保留位解释的非常简单,保留位本来是没有特定意义的, 标准中要求这些位保持显性位‘0’,如果CAN2.0A标准的产品开发者随意处理这些保留位,譬如发送者将数据帧中的这些保留位按隐性位‘1’发送, 很显然在两种标准的CAN网络节点共享一个CAN网络时将会引起歧义。CAN2.0A和CAN2.0B是一对非常好的技术迭代和向后兼容的案例,也让我们知道如何正确地处理“目前毫无意义的保留位”。

       使用29位长度ID的CAN2.0B标准的数据帧中,如图8.7(b),仲裁域总共有32个位,即29位ID、1位SRR(Substitute Remote Request,固定为‘1’)、 1位IDE(固定为‘1’代表此帧使用ID扩展)和1位RRS(Remote Request Substitution,RTR的替代位),其中RRS位与CAN2.0A标准中的RTR位具有同等作用。

       除了仲裁域之外,CAN2.0B标准的控制域和数据域等仍保持与CAN2.0A标准一致,而且CAN2.0B标准的控制域仍预留2个固定为‘0’的保留位。 这两种CAN总线标准被广泛使用近20年,CAN2.0A标准随未被弃用但遵循该标准的产品已非常少见。截至目前,CAN FD标准的诞生时间并不长, ISO 11898-1的2015版本才正式将CAN FD纳入标准并同时废止2003版(仅包含CAN2.0A/B的定义)。相较于之前的2种版本,CAN FD标准的最大变化是增加数据域的字节个数(最大64个字节)和该域的波特率, 而且CAN FD标准不支持远程请求帧。在理论上,CAN FD仍兼容CAN2.0B标准,即支持两种标准的CAN网络节点可以共享同一个CAN网络, 继续保留11位宽度ID的数据帧。

../_images/canfd_protocol_frame_format.jpg

图8.8 CAN FD协议帧(两种ID位长度和数据域长度的标准数据帧的位流格式)

       此外,CAN FD标准的数据帧的CRC域也被调整,根据数据域的字节个数(16个字节及以下或20个字节及以上)分别使用17位或21位的CRC域位宽度。 图8.8给出11位宽度ID和29位宽度ID的CAN FD标准的数据帧格式,以及使用29位宽度ID和64个字节数据域的数据帧。

       对比图8.7和8.8,CAN FD标准的仲裁域与CAN2.0B完全相同,但两者的控制域变化较大。同样使用11位ID时,在CAN2.0B标准数据帧的控制域的前2个保留位分别是IDE和一个保留位RB0, 但CAN FD标准数据帧的控制域的这两个位分别定义位IDE和FDF(FD Frame);对于控制域的首个位,使用11位ID意味着IDE位都是‘0’,如果第二个位仍为‘0’则代表CAN2.0B数据帧, 如果第二个位为‘1’则代表CAN FD数据帧;当FDF为‘1’时,即CAN FD标准的数据帧,控制域的后续位将被重新定义。很显然, 使用11位ID时理论上允许CAN2.0B和CAN FD两种节点共享同一个CAN网络。

       使用29位ID时,CAN2.0B控制域的2个保留位默认都是‘0’,在CAN FD标准数据帧的控制域中这两个位的首位被定义成FDF,当FDF为‘1’时,即CAN FD标准的数据帧标志位有效, 与CAN20.0B相比较,CAN FD数据帧中控制域的其他位被重新定义,分别为BRS(Bit Rate Switch)和ESI(Error State Indicator)。 BRS位是CAN FD标准数据帧的控制域中新增的一个关键位,当BRS为‘1’时,该位之后且直到CRC界定符之间的每一个位的传输波特率将切换位为8倍速; 顾名思义,ESI位在正常传输时保持‘0’,除非发送节点侦测到错误则将此位发送成‘1’。

       值得注意的是,CAN FD标准是首次采用2种不同波特率传输单个数据帧的机制,使用规则是仲裁域到控制域BRS位(包含该位)采用低波特率(兼容CAN2.0B不超过1Mbps), BRS位之后直到CRC界定符的所有位采用8倍速传输,确认域、帧结束域和帧间隔域则恢复低波特率传输。CAN FD标准的数据域最长可达64个字节,这是CAN2.0A/B标准的8倍, 如果传输CAN FD标准数据帧时允许使用8倍速传输数据域和CRC域的各位,CAN FD传输64个字节数据时占用CAN总线的时间不大于CAN2.0A/B的8个字节数据域的耗时。 有些文献中称CAN FD标准支持的最大波特率可达10Mbps,事实上这是一种误解。

       此外,CAN FD仍使用4个位DLC[3:0]来界定数据域的字节数,但是CAN FD支持最大为64字节的数据域,这是为什么呢?如果采用线性对应关系:(2^DLC的二进制位个数)-1 –> 数据域的字节个数, 对于数据域最大的字节个数为64的情况,合适的DLC的二进制位个数应等于7。事实上,CAN FD协议使用非线性的映射关系:

  1. DLC[3:0] <= 8,数据域的数据个数 = DLC[3:0]字节 (保持线性关系)
  2. DLC[3:0] = 9, 数据域的数据个数 = 12字节
  3. DLC[3:0] = 10, 数据域的数据个数 = 16字节
  4. DLC[3:0] = 11, 数据域的数据个数 = 20字节
  5. DLC[3:0] = 12, 数据域的数据个数 = 24字节
  6. DLC[3:0] = 13, 数据域的数据个数 = 32字节
  7. DLC[3:0] = 14, 数据域的数据个数 = 48字节
  8. DLC[3:0] = 15, 数据域的数据个数 = 64字节

       在图8.8中可以看出,CAN FD标准的CRC域也有很大变化,不仅根据数据域的字节数改变CRC算法,还增加4个位(即Stuff Count子域)用于验证该域之前的数据帧中二进制位个数。 Stuff Count的前3个位:Stuff_Count[2:0] = 数据位个数%8(即除以8的余数)的格雷码;第4个位是Stuff_Count[2:0]的奇校验位。增加Stuff Count子域的目的是提升数据帧的检错能力。

       格雷码(Grey Code)是一种可靠性较高的绝对编码方式,相邻的两个码之间仅有一个位不同,与其他编码(如连续的二进制编码)相比出错率更低。3位二进制码与格雷码对照关系:

  • 序数:0, 1, 2, 3, 4, 5, 6, 7
  • 3位二进制码:000, 001, 010, 011, 100, 101, 110, 111
  • 3位格雷编码:000, 001, 011, 010, 110, 111, 101, 100

       比较三种版本的CAN标准,CAN总线的竞争和仲裁机制始终保持不变,即CAN网络架构始终不变;CAN2.0B标准增加消息ID的二进制位宽度以提升CAN网络上数据信息的总容量; CAN FD标准将数据域的字节个数提高8倍并支持8倍波特率传输数据域,在不增加CAN数据帧传输时间的条件下将每帧的数据信息提高8倍;CAN FD标准使用改进的CRC域提升数据帧的检错能力。 很显然,CAN标准的每一次迭代的目的都是在信息容量、信息传输效率等方面的提升,这也正是为了满足汽车控制和工业控制等领域不断地提升的信息容量、信息交换速度。

       对比三种不同CAN总线标准的数据帧格式,随着信息容量和传输速度不断地提升,数据帧的检错能力也随之提升,数据帧的结构越来越复杂。 尤其新标准向后兼容的需求等会不会使CAN总线的应用软硬件接口设计越来越复杂(兼容更多种标准)呢?不会的。

       多种CAN标准的协议控制器都是成熟的硬件功能单元,无论是集成在MCU内部或是独立IC,图8.6~8.8的数据帧都是由协议控制器根据用户程序待传输的消息ID和消息数据自动封装而成的, 用户程序仅仅是把11位或29位宽度的消息ID和对应的消息体数据字节逐个写入CAN协议控制器的发送缓冲区或从接收缓冲区读回RAM的操作。 图8.9给出11宽度或29位宽度消息ID和消息数据封装成CAN2.0B标准的数据帧的操作。

../_images/can20b_msgid_message_to_data_frame.jpg

图8.9 消息ID和消息数据如何封装成CAN2.0B标准的数据帧

图8.10给出11位或29位宽度消息ID和消息数据封装成CAN FD标准的数据帧的操作。

../_images/canfd_msgid_message_to_data_frame.jpg

图8.10 消息ID和消息数据如何封装成CAN FD标准的数据帧

       对于MCU片内的CAN协议控制器单元,消息ID和消息体数据缓冲区都是MCU片上外设的存储器单元,消息ID和消息体的读回(接收)/写入(发送)操作都是存储器单元的读写操作。 如果使用独立的CAN协议控制器IC,该IC可通过高速SPI、UART或并行总线接口与主MCU连接(片外功能单元的扩展), CAN总线的配置(消息ID的位宽度、波特率等)、发送缓冲区和接收缓冲区等都将被映射成寄存器,消息ID和消息体数据的读写操作本质上是通过SPI、UART或并行总线读写这些寄存器。

       后续的两个小节中将分别介绍独立的CAN协议控制器的硬件和软件接口设计。

参考文献:

[1] https://www.iso.org/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第八届:世界3D渲染挑战赛《无尽阶梯》正式开启

全世界的3D艺术创作者们引颈期盼的盛事“全球3D渲染艺术大奖赛”已迈入第八个年头。本届比赛的主题为“无尽的阶梯”&#xff0c;参赛者们可通过挑战赛展现自身的创造力&#xff0c;比赛在行业内拥有极高的知名度&#xff0c;含金量十足&#xff0c;参赛这可通过这里提高自己在…

给ChatGPT喂词,模仿风格

例如给出下面一段话&#xff1a; 翻译成中文&#xff1a; 下面图片是ChatGPT回复的&#xff1a; 下面的两张图是提示1和提示2在Midjourney里面生成的图&#xff0c;从图片上看整体画风出来的图片效果还是不错的&#xff1a; 章节视频 下载地址 请到到百度网盘自由观看 链接&a…

业务拓展利器!跨境电商如何选对代理IP?IPIDEA 一键连接全球商机!

文章目录 一、跨境电商发展与海外代理IP的重要性1.1 跨境电商的发展现状1.2 海外代理IP在跨境电商中的重要性 二、选对代理IP品牌的关键因素三、IPIDEA海外IP代理的优势3.1 IPIDEA的优势3.2 IPIDEA提供的代理类型 四、使用IPIDEA爬虫实战五、总结 一、跨境电商发展与海外代理IP…

Pandas教程11:关于pd.DataFrame.shift(1)数据下移的示例用法

---------------pandas数据分析集合--------------- Python教程71&#xff1a;学习Pandas中一维数组Series Python教程74&#xff1a;Pandas中DataFrame数据创建方法及缺失值与重复值处理 Pandas数据化分析&#xff0c;DataFrame行列索引数据的选取&#xff0c;增加&#xff0c…

TrinityCore安装记录

TrinityCore模拟魔兽世界&#xff08;World of Warcraft&#xff09;的开源项目&#xff0c;并且该项目代码广泛的优化、改善和清理代码。 前期按照官方手册按部就班的安装即可。 注意几点&#xff1a; 1 需要配置Ubuntu22.04版本的服务器或者Debian11 服务器。2 需要使用gi…

本地缓存Ehcache的应用实践 | 京东云技术团队

java本地缓存包含多个框架&#xff0c;其中常用的包括&#xff1a;Caffeine、Guava Cache和Ehcache&#xff0c; 其中Caffeine号称本地缓存之王&#xff0c;也是近年来被众多程序员推崇的缓存框架&#xff0c;同时也是SpringBoot内置的本地缓存实现。但是除了Caffeine之外&…

打开双重el-dialog后出现遮罩后如何解决?

背景&#xff1a; 打开el-dialog后&#xff0c;再次打开另外一个el-dialog&#xff0c;出现以下画面。 解决方式&#xff1a;在第二个el-dialog增加append-to-body <el-dialog :close-on-click-modal“true” :visible.sync“createVisible” v-if“createVisible” :width…

【Java网络编程05】网络原理进阶(三)

1. HTTP协议概述 HTTP协议&#xff1a;又被称为"超文本传输协议"&#xff0c;是一种使用非常广泛的应用层协议&#xff0c;我们之前在文件章节介绍过文本文件与二进制文件的区别&#xff0c;文本可以看做字符串&#xff08;能在utf8/gbk等编码表中查找到合法字符&am…

【并发编程】原子累加器

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 JDK8之后有专门做累加的类&#xff0c;效率比自己做快数倍以上 累加器性能比较 参数是方法 // supplier 提供者 无中生有 ()->结果// func…

Springboot 整合 Quartz(定时任务框架)

一、java 定时任务调度的实现方式 1、Timer 特点是&#xff1a;简单易用&#xff0c;但由于所有任务都是由同一个线程来调度&#xff0c;因此所有任务都是串行执行的&#xff0c;同一时间只能有一个任务在执行&#xff0c;前一个任务的延迟或异常都将会影响到之后的任务&#…

SpringBoot 集成 WebSocket,实现后台向前端推送信息

SpringBoot 集成 WebSocket&#xff0c;实现后台向前端推送信息 在一次项目开发中&#xff0c;使用到了Netty网络应用框架&#xff0c;以及MQTT进行消息数据的收发&#xff0c;这其中需要后台来将获取到 的消息主动推送给前端&#xff0c;于是就使用到了MQTT&#xff0c;特此…

spring-authorization-server 公共客户端方式获取授权码和Token的流程

spring-authorization-serve【版本1.2.1】官方文档中提及了关于RegisteredClient中所涉及的客户端身份验证方法&#xff0c;也就是RegisteredClient中提及的clientAuthenticationMethods属性对应的“none”值&#xff0c;目前clientAuthenticationMethods属性支持的值包含&…

SpringBoot 登录检验JWT令牌 生成与校验

JWT官网 https://jwt.io/ 引入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>设置过期时间 LocalDateTime localDateTime LocalDateTime.now().…

《低功耗方法学》翻译——附录B:UPF命令语法

附录B&#xff1a;UPF命令语法 本章介绍了文本中引用的所选UPF命令的语法。 节选自“统一电源格式&#xff08;UPF&#xff09;标准&#xff0c;1.0版”&#xff0c;经该Accellera许可复制。版权所有&#xff1a;(c)2006-2007。Accellera不声明或代表摘录材料的准确性或内容&…

【经典项目】Java小游戏 —— 会说话的汤姆猫

一、游戏回顾 【预期效果】 【玩法介绍】 1、 和它说话&#xff0c;它将用有趣的声音重复你的话。 2、打它的头&#xff0c;它会装成被打的样子&#xff0c;连续打还会晕倒&#xff1b;抚摸肚子&#xff0c;它会打呼噜&#xff1b;打肚子&#xff0c;它会装肚子疼&#xff1b…

WhisperFusion:与 AI 无缝语音对话(超低延迟),深入理解用户每句话背后的含义

演示视频里面&#xff0c;那老哥问它问题之后&#xff0c;后面更改问题&#xff0c;依然能很好的记录问题变化的过程并给出答案。 WhisperFusion 是基于 WhisperLive 和 WhisperSpeech 的强大工具&#xff0c;将声音转文字和文字理解融为一体&#xff0c;让你与AI机器人无缝语…

双非本科准备秋招(10.2)—— JVM3:垃圾收集器

垃圾收集器 分为七种&#xff0c;如下&#xff1a; 从功能的角度分为 1、串行&#xff1a;Serial、Serial Old 2、吞吐量优先&#xff1a;Parallel Scavenge、Parallel Old 3、响应时间优先&#xff1a;CMS 吞吐量优先VS响应时间优先 吞吐量运行用户代码时间/(运行用户代码…

开源软件全景解析:驱动技术创新与行业革新的力量

目录 什么是开源 开源的核心 开源软件的特点 为什么程序员应该拥抱开源 1.学习机会&#xff1a; 2.社区支持&#xff1a; 3.提高职业竞争力&#xff1a; 4.加速开发过程&#xff1a; 5.贡献和回馈&#xff1a; 开源软件的影响力 开源软件多元分析&#xff1a; 开源…

Java实现婚恋交友网站 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 会员管理模块2.3 新闻管理模块2.4 相亲大会管理模块2.5 留言管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 会员信息表3.2.2 新闻表3.2.3 相亲大会表3.2.4 留言表 四、系统展示五、核心代码5.…

【Java EE初阶十】多线程进阶二(CAS等)

1. 关于CAS CAS: 全称Compare and swap&#xff0c;字面意思:”比较并交换“&#xff0c;且比较交换的是寄存器和内存&#xff1b; 一个 CAS 涉及到以下操作&#xff1a; 下面通过语法来进一步进项说明&#xff1a; 下面有一个内存M&#xff0c;和两个寄存器A,B; CAS(M,A,B)&am…