CAN通信协议

news2024/11/14 20:55:01

CAN

物理电平
  • 以高速CAN为例
    • 有电压差(2.5V)为显性,逻辑0
    • 无电压差为隐性,逻辑1
帧结构

在这里插入图片描述

  • SOF
    • 恒为显性,逻辑0
  • 仲裁段
    • 当有多个设备发送数据,产生总线冲突时,来判断一个先后顺序
    • 由于总线是线与机制,所以显性0的存在感更强,所以ID越小优先级越高
    • 标准帧
      • 11 id + RTR
      • 数据帧的RTR位为0,远程帧的RTR位为1
    • 扩展帧
      • 11 id + SRR + IDE + 18 Extend id + RTR
      • SRR位恒为1
      • 标准帧的IDE0,扩展帧的IDE位为1
    • RTR保证数据帧的优先级大于远程帧
    • IDE保证标准帧的优先级大于扩展帧
  • 控制段
    • 标准帧
      • IDE + r0 + DLC(4bits)
      • r0为显性电平0
    • 扩展帧
      • r1 + r0 + DLC(4bits)
      • r1r0为显性电平0
    • DLC数据帧长度,取0-8
  • 数据段
    • 发送数据,0-8个字节
  • CRC
    • CRC校验序列(15bits) + CRC界定符(DEL恒为隐性1
    • CRC计算范围包括:SOF、仲裁场、控制场和数据场
  • ACK
    • ACK槽 + ACK界定符(DEL恒为隐性1
    • 目的:发送节点确保自己发出的报文至少有一个节点正确接收了
    • 发送节点发出11,接收节点将ACK槽中填充0,这时候发送节点回读总线电平时,就是01
  • EOF
    • 七个连续隐性1
错误帧种类
  • 位发送错误
    • 节点发送到总线的电平与从总线回读的电平不一致
  • ACK错误
    • 发送节点在ACK槽上没有回读到显性0
  • 位填充错误
    • SOFCRC校验序列之间不允许有6个连续的相同电平,发送器只要检测到5个连续相同逻辑位时,就会在下一位插入一个相反的逻辑电平。
    • 位填充错误是指在SOFCRC校验序列之间检测到有6个连续相同的逻辑电平
    • 剩余位域(CRC界定符、ACK段和EOF)形式固定,不填充
    • 作用:确保数据帧不会被识别为EOF和错误帧(6个连续显性位获隐性位)
  • CRC错误
    • 发送节点发出的CRC序列与接收节点自行计算的CRC序列结果不一致
  • 格式错误
    • 一些位恒定不变,比如:EOF连续七个隐性1CRC界定符恒为1ACK界定符恒为1
错误帧
  • 错误标志(6bits) + 错误标志重叠部分(0-6bits) + 错误界定符(8bits)
  • 主动错误标志:6个连续显性0
    • 处于主动错误状态的节点会发送主动错误标志。由于主动错误标志违反了位填充规则,就造成其它节点也检测到错误并发送错误标志(这就是错误标志重叠形成的原因)
  • 被动错误标志:6个连续隐性1
    • 被动错误标志可能会被其它节点的显性位改写,所以节点只需要关注发送了6个连续隐性位就行,不需要关注总线上的状态有没有被其它节点更改
    • 发送节点发送被动错误标志,将会导致接收节点的位填充错误
    • 接收节点发送被动错误标志,不会对总线产生影响
  • 错误界定符:8个连续隐性1
    • 当发送完错误标志后,所有节点开始向总线发送一个隐性位,并检测到总线电平为隐性时,发送剩下的七个隐性位
  • 错误帧发送时刻
    • 位发送错误、位填充错误、格式错误和ACK错误产生后,将直接在下一位发送错误帧
    • CRC错误产生后,在ACK界定符后的位发送错误帧
    • 错误帧发送完成后,总线空闲时自动重发出错的数据帧
错误状态(11898 P68

在这里插入图片描述

  • 根据错误计数来切换状态,发送错误计数器(TEC)和接收错误计数器(REC)
    • 当接收方检测到错误时,接收错误计数器(REC)应该加1
    • 当接收方在发送一个错误标志后,检测到主导位作为第一个位时,接收错误计数器(REC)应该加8
    • 当发送方发送错误标志时,发送错误计数器(TEC)应该加8
    • 当发送方在发送主动错误标志或过载标志时,发送错误计数器(TEC)应该加8
    • 当接收方在发送主动错误标志或过载标志时,接收错误计数器(REC)应该加8
    • 在一个帧成功传输后(得到ACK并且在EOF完成之前没有检测到错误),发送错误计数器(TEC)应该减1;发送错误计数器(TEC)为0时例外
    • 在成功接收到一个帧后(ACK槽位前无错误接收,并成功发送ACK位),如果接收错误计数器(REC)在1127之间,应该减1。如果REC0,则保持0不变。如果REC大于127,则设置为119127之间的值
  • 主动错误状态(TECREC均小于128)
    • 初始化后进入主动错误状态,可靠,能够正常进行总线通信
    • 发送节点或者接收节点,检测出错误时,会发出主动错误标志(6个连续显性位)
    • 发送主动错误标志,相当于告诉其它节点作废上次的报文
  • 被动错误状态(TECREC大于127)
    • 不可靠,错误较多,能够进行总线通信,但不能连续发送了
    • 检测到错误时,发出被动错误标志(6个连续隐性位)。发送结束后,处于被动错误状态的节点在下一次发送之前需要等一下(帧间隔(3个隐性位) + 延时段(8个隐形位)),从而让其它正常节点优先使用总线
    • 发送节点发送被动错误标志,不能连续发送,需要等待
  • Bus off(TEC大于255)
    • 总线关闭,不能收发任何报文
    • 重启后恢复CAN通信
    • 或者监控了128次空闲状态(idle condition)后,错误计数器归0,变为主动错误状态
    • idle condition11位连续的隐性1
  • 假设没有进一步的错误,从检测到一个错误到可能开始下一帧的恢复时间,在主动错误状态下通常是17-23个比特位(错误标志6bit + 错误标准重叠部分0-6bit + 错误界定符8bit);在被动错误状态下会多8个比特位(8位延时段),高达31个比特位。

CAN FD

相较于CAN的优点
  • 增加了数据的长度,最多支持64个字节,提高了协议效率
  • 增加传输速度,支持双比特率,仲裁比特率最大为1Mbit/s,数据比特率可实现5Mbit/s
  • 可兼容传统CAN
帧结构

在这里插入图片描述

  • SOF

    • 恒为显性,逻辑0
  • 仲裁段

    • CAN FD取消了对远程帧的支持,用RRS位替换了RTR位,恒为显性0
  • 控制段

    • IDE + FOF + res + BRS + ESI + DLC
    • 相比于CAN,增加了FOFBRSESI
    • FDF(Flexible Data Rate Formate),恒为隐性1,对应传统CAN中的保留位r
    • BRS(Bit Rate Switch)表示位率转换,为显性0时,数据段和仲裁段的速率保持一致;为隐性1时,数据段以更高的速率传输。从ESI开始到CRC界定符结束。
    • ESI(Error State Indicator)错误状态指示器,主动错误为显性0,被动错误为隐性1
    • DLC取值:0-8,12,16,20,24,32,48,64
  • 数据段

    • 最多能发64个字节
  • CRC

    • CRC位数

      • 传统CAN15位的CRC校验。
      • CAN FD中,当传输数据最多16个字节时,使用17位的CRC校验
      • 当传输数据大于16个字节时,使用21位的CRC校验
    • 添加了Stuff Count(4bits)

      • 格雷码计算:CRC区域之前的填充位数对8取余,然后进行格雷码计算(Bit0-2)
      • 奇偶校验:通过格雷码计算后的值进行偶校验,填充到Parity
    • CRC校验场中使用固定填充位

      • CRC校验场的第一位
      • 每间隔4位添加一个固定填充位
      • 固定填充位的值是上一位的反码
  • ACK

    • ACK槽 + ACK界定符
    • 由于会从高速的数据场到慢速的ACK段,时钟切换会引用收发器相移和总线传播延迟,所以在CAN FD中,接收节点利用2位时间识别应答位。
  • EOF

    • 七个连续隐性1

总线负载(Bus load)

  • 固定时间(1s)内,总线上实际传输的bit数除以理论上总线传输的bit

    假设比特率设置为500kbps,那么理论上每秒能够传输 500 * 1000 bit
    现在实际上每秒有100帧报文(CAN标准帧,大概一帧120bit)
    那么 bus load = (120 * 100) / (500 * 1000) * 100% = 2.4% 
    
  • 总线负载太高,容易出现丢包

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

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

相关文章

重学C++系列之友元

一、什么是友元 在C中,为了提高程序的效率,在一些场景下,引入友元,但同时类的封装性就会被破坏。 二、怎么实现友元 友元关键字(friend) // 在类中声明另一个类的成员函数来做为友元函数 // 以关键字&…

golangd\pycharm-ai免费代码助手安装使用gpt4-免费使用--[推荐]

golangd-ai免费代码助手安装使用,pycharm可以使用,估计只要是xx的ide都是可以使用这个插件 目前GPT4以及gpt的大规模使用,如何快速掌握以及在ide中快速使用的办法,今天安装一款golangd编辑器的插件已经使用 一、安装以及使用 1.在golangd中…

texshop mac中文版-TeXShop for Mac(Latex编辑预览工具)

texshop for mac是一款可以在苹果电脑MAC OS平台上使用的非常不错的Mac应用软件,texshop for mac是一个非常有用的工具,广泛使用在数学,计算机科学,物理学,经济学等领域的合作,这些程序的标准tetex分布特产…

PKG内容查看工具:Suspicious Package for Mac安装教程

Suspicious Package Mac版是一款Mac平台上的查看 PKG 程序包内信息的应用,Suspicious Package Mac版支持查看全部包内全部文件,比如需要运行的脚本,开发者,来源等等。 suspicious package mac使用简单,只需在选择pkg安…

Druid连接池与Mybatis-Plus非Spring环境整合:报错异常:NoClassDefFoundError

最近在搞一个Netty与扫描枪通信项目;通过调研框架使用Mybatis-PlusDruid作为获取数据库数据,结果整合报了个错,顺便记录下: 一,配置文件: driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql://127.0.0.1:3306/xxxxxxx?useUnicodetrue&characterEncodin…

SQL编译优化原理

最近在团队的OLAP引擎上做了一些SQL编译优化的工作,整理到了语雀上,也顺便发在博客上了。SQL编译优化理论并不复杂,只需要掌握一些关系代数的基础就比较好理解;比较困难的在于reorder算法部分。 文章目录 基础概念关系代数等价 j…

面试 | 校招字符串相关高频算法题汇总【C++实现】

文章目录 1、反转字符串2、反转字符串||3、字符串最后一个单词的长度4、找字符串中第一个只出现一次的字符5、仅仅反转字母6、验证一个字符串是否是回文7、反转字符串中的单词【⭐】(1)移除给出字符串中的多余空格(2)反转整个字符…

Linux下安装VirtualBox虚拟机

1. 简介 VirtualBox是一款强大的x86和AMD64/Intel64虚拟化产品,适用于企业和家庭。VirtualBox不仅是为企业客户提供的一款功能丰富、高性能的产品,它也是根据GNU通用公共许可证(GPL)版本3条款作为开放源码软件免费提供的唯一专业解决方案。有关VirtualBo…

Modbus TCP使用例程

一、Modbus介绍 关于Modbus的介绍可参考前面的文章<modbus tcp协议介绍及分析>和<modbus rtu通信格式测试解析>这2篇文章。 二、Agile Modbus软件包介绍 Agile Modbus软件包的链接地址&#xff1a; https://gitee.com/RT-Thread-Mirror/agile_modbus Agile Modbus的…

Day46 算法记录| 动态规划 13(子序列)

这里写目录标题 300.最长递增子序列 674. 最长连续递增序列718. 最长重复子数组 300.最长递增子序列 视频解析&#xff1a; 第一层for循环遍历每一个元素&#xff0c; ------- 第二层for循环找到当前元素前面有几个小于该值的元素 结尾需要统计最多的个数 class Solution {pu…

如何有效地使用ChatGPT写小说讲故事?

​构思故事情节&#xff0c;虽有趣但耗时&#xff0c;容易陷入写作瓶颈。ChatGPT可提供灵感&#xff0c;帮你解决写作难题。要写出引人入胜的故事&#xff0c;关键在于抓住八个要素——主题、人物、视角、背景、情节、语气、冲突和解决办法。 直接给出故事模板&#xff0c;你可…

无线温湿度信息收集点模块的组成和工作状态及编程与组网建议

在传感技术与物联网的不断发展下&#xff0c;无线温湿度信息收集点模块作为一种重要的终端设备&#xff0c;被广泛应用于各个领域。本文将详细介绍该模块的组成和工作状态&#xff0c;并给出编程和组网的建议。 一、组成 该无线温湿度信息收集点模块由以下几个核心组成部分构成…

Banana Pi BPI-KVM – 基于 Rockchip RK3568 SoC 的 KVM over IP 解决方案

Banana Pi 已经开始开发基于 Rockchip RK3568 SoC 的 BPI-KVM 盒&#xff0c;但它不是迷你 PC&#xff0c;而是 KVM over IP 解决方案&#xff0c;旨在远程控制另一台计算机或设备&#xff0c;就像您在现场一样&#xff0c;例如能够打开和关闭连接的设备、访问 BIOS 等。 商业…

vagrant centos7 根目录扩容

目录 1 创建 centos7 虚拟机 2 扩容根目录 我知道的扩容方式有两种&#xff1a;1 直接扩容分区 &#xff1b;2 扩容逻辑卷。 我没找到为根目录设置到逻辑卷的方法&#xff0c;所以使用直接扩容分区。 1 创建 centos7 虚拟机&#xff0c; vagrant up vagrant ssh 查看磁盘…

Git-分支管理

文章目录 1.分支管理2.合并冲突3.合并模式4.补充 1.分支管理 Git分支管理是指在Git版本控制系统中&#xff0c;使用分支来管理项目的不同开发线路和并行开发的能力。通过分支&#xff0c;开发者可以在独立的环境中进行功能开发、bug修复等工作&#xff0c;而不会影响到主分支上…

文章详情页 - 评论功能的实现

目录 1. 准备工作 1.1 创建评论表 1.2 创建评论实体类 1.3 创建 mapper 层评论接口和对应的 xml 实现 1.4 准备评论的 service 层 1.5 准备评论的 controller 层 2. 总的初始化详情页 2.1 加载评论列表 2.1.1 实现前端代码 2.1.2 实现后端代码 2.2 查询当前登录用户的…

SFP6012A-ASEMI代理海矽美快恢复二极管参数、尺寸、规格

编辑&#xff1a;ll SFP6012A-ASEMI代理海矽美快恢复二极管参数、尺寸、规格 型号&#xff1a;SFP6012A 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247AC 恢复时间&#xff1a;100ns 正向电流&#xff1a;60A 反向耐压&#xff1a;1200V 芯片大小&#xff1a;102MIL*2…

苍穹外卖day-04

苍穹外卖day-04 本项目学自黑马程序员的《苍穹外卖》项目&#xff0c;是瑞吉外卖的Plus版本 功能更多&#xff0c;更加丰富。 结合资料&#xff0c;和自己对学习过程中的一些看法和问题解决情况上传课件笔记 视频&#xff1a;https://www.bilibili.com/video/BV1TP411v7v6/?sp…

一、window安装vagrant

篇章一、window安装vagrant 前言 在日常的学习中&#xff0c;需要在Window中学习Linux相关的操作命令&#xff0c;在本地熟悉Linux服务器环境&#xff0c;因此需要在电脑中安装Vagrant虚拟机来管理所需安装的Linux系统&#xff08;也就是后续的Centos-7&#xff09;。 1、下…

无涯教程-jQuery - Bounce方法函数

弹跳效果可以与effect()方法一起使用。这会在垂直或水平方向多次反弹元素。 Bounce - 语法 selector.effect( "bounce", {arguments}, speed ); 这是所有参数的描述- direction - 效果的方向。可以是"上(up)"&#xff0c;"下(down)"&#xf…