CAN总线-ACK应答机制分析

2023-05-16

1:应答场定义

        应答场长度为 2 个位,包含应答间隙(ACK SLOT)和应答界定符(ACK DELIMITER)。在应答场里,发送站发送两个“隐性”位。当接收器正确地接收到有效的报文,接收器就会在应答间隙(ACK SLOT)期间(发送 ACK 信号)向发送器发送一“显性”的位以示应答。


 2:ACK应答机制浅析

       CAN的发送是个双向互动过程,发送节点在发送数据的同时会对总线上数据进行回读以及Ack Slot场的判定;接收节点在发送节点发送过程中需及时确认报文正确性并令总线上ACK SLOT位置 “显性”,以告知发送节点数据正常接收;

       CAN是一种基于广播的通讯方式,为了保证总线上的每一个节点都能正确的接收到报文,报文的发送者要求每一个接收节点在报文发送结束前,也就是ACK SLOT 的时间内,作出应答,即在ACK段上,要求接收节点在报文正确性的基础上及时发送一个“显性”位。发送者在发送的同时会监视总线上的数据,如果与发送的数据不一致,则表示发送失败或自己失去仲裁,立即停止发送或转入接收模式。由于发送者在发送数据的同时会向ACK段连续写入2个隐性位,如果发送者在回读过程中监控到ACK SLOT 位为“显性”位,则说明接收者已正确接收;如果发送者在回读过程中监控到ACK SLOT 位为“隐性”位,则说明没有节点正确接收该报文,则发送者会检测到这个隐性位而知道发送失败,此条报文需要重发。

       多节点接收工况下若出现仅单节点正确接收,那么又会出现什么情况呢?  由于某节点正常接收,基于线与机制总线上ACK SLOT 位必定为“显性”,隐性失效,从而可以说明:ACK场是用于确定报文被至少一个节点正确接收。该工况下就无法基于ACK场进行判断,但会触发错误帧相关机制,立即开始发送一个错误帧,则接下去总线上的信号就是这个错误帧,其它的节点和发送者也都会收到这个错误帧,那所有的节点都知道出错了,接收者会丢掉此次消息,而发送者会试图重发此次消息。
3:ACK应答机制框图

补充:1 通道表征发送节点的 TX;2 通道表征发送节点的 RX;3 通道表征接收节点的 TX;4通道表征接收节点的 RX;

CAN总线-错误处理机制分析

在工作中提及CAN错误大家首先会想到的是Busoff故障,但是大家考虑过CAN总线是如何诊断出Busoff故障?总线上那种状态属于故障状态?总线故障后立即触发Busoff吗?总线故障后如何恢复?那么下面将带着这些问题对CAN总线的错误处理机制进行分析。

CAN总线错误处理机制:

    错误检测
    错误界定
    错误处理

错误检测机制:

CAN总线的回读机制、循环冗余检查、位填充和报文格式检查保证了CAN总线数据交互的准确性,当然也为此提供了5种CAN错误类型【位错误,位填充错误,CRC错误,格式错误,ACK错误】;如果总线上检测到此类错误,那么必定会触发相应CAN节点的动作,但是是否触发Busoff并非取决于CAN错误类型而是取决于CAN节点的错误状态;

    位错误 : 发送的数据和总线上的电平不一致【仲裁段及ACK段属于特例】
    位填充错误:连续检测到6个同极性电平
    CRC错误: 当接收方接收到的数据计算出的CRC值与接收到的CRC不一致
    格式错误: 接收到的帧和规定的帧格式不一致
    ACK错误: ACK slot 场为隐性电平

错误界定及处理机制:

        错误界定并非是依据错误的类型去界定CAN节点的错误状态,而是依据错误计数器【TEC/REC】的值来界定CAN节点的错误状态;           错误状态分为三种:主动错误状态、被动错误状态和总线关闭态;这样分类的目的又是什么呢?可以理解成是依据当前节点的错误累积程度区分不同的错误等级,不同错误等级对应不同的动作,从而保证CAN总线上其他节点的正常交互。即:“量变引起质变的过程”;当该节点检测到错误后,内部REC/TEC计数器会相应的增加,基于REC/TEC的值判定节点状态;

网络上很多资料针对 “主动与被动” 关键字眼对主动错误状态与被动错误状态进行区分,看了许久未曾想通,反而越发迷茫;个人感觉不需过分纠结主动及被动字眼,理解成不同的错误等级即可,重点关注的是这几种状态下CAN总线允许该节点做哪些动作以及如何去动作;

主动错误状态:【REC<127 且TEC<127】

初步可判定该节点相对稳定可靠,该错误计数很可能是由于X节点异常导致的,那么其他节点很可能也会触发该错误,那么允许该节点破坏CAN总线的异常报文并告知其他节点;

    如果该节点是发送节点,相当于报文发送时自检出错误,将发送错误帧“6个连续显性位”至CAN总线,破坏总线异常数据,并告知其他节点请勿接收;
    如果该节点是接收节点,相当于报文接收时校验出错误,该错误很可能是由于发送节点异常导致的,其他节点接收时很可能也会校验出错误,那么允许该接收节点发送错误帧“6个连续显性位”至CAN总线,破坏总线异常数据,并告知其他节点;

被动错误状态:【REC>128 或TEC>128】

初步可判定该节点相对不可靠,该错误计数很可能是由于自身节点问题导致,即该错误很可能仅有该节点才有,对于其他节点而言是可以正常交互的,总线不信任该节点提供的错误标识,将不允许破坏总线数据,那么允许该节点发送错误帧“6个连续隐性位”至CAN总线,仅告知其他节点异常;

    如果该节点是接收节点,该错误很可能是由于自身节点问题导致,其他节点可以正常接收,不存在此类错误,即仅允许该异常节点发送6个连续隐性位告知错误,但不影响总线电平以及其他节点的正常接收;
    如果该节点是发送节点,检测到错误后会立即发送“6个连续隐性位”告知其他接收节点请勿接收该报文;由于该发送节点处于被动错误状态,那么将在下一帧发送之前传送一个间歇场【3个隐性位】和挂起传送场【8个隐性位】,使总线处于总线空性态,将该被动错误状态节点挂起,总线控制权交由其它待发送节点;

总线关闭状态:【TEC>255】

    当发送错误计数TEC>255时才会触发该状态,使该节点处于总线关闭态;
    复位或者等待传送128次11位隐性电平的时间后,重新加入活动,并且TEC/REC清零;

 

CAN总线-错误处理机制分析

在工作中提及CAN错误大家首先会想到的是Busoff故障,但是大家考虑过CAN总线是如何诊断出Busoff故障?总线上那种状态属于故障状态?总线故障后立即触发Busoff吗?总线故障后如何恢复?那么下面将带着这些问题对CAN总线的错误处理机制进行分析。

CAN总线错误处理机制:

    错误检测
    错误界定
    错误处理

错误检测机制:

CAN总线的回读机制、循环冗余检查、位填充和报文格式检查保证了CAN总线数据交互的准确性,当然也为此提供了5种CAN错误类型【位错误,位填充错误,CRC错误,格式错误,ACK错误】;如果总线上检测到此类错误,那么必定会触发相应CAN节点的动作,但是是否触发Busoff并非取决于CAN错误类型而是取决于CAN节点的错误状态;

    位错误 : 发送的数据和总线上的电平不一致【仲裁段及ACK段属于特例】
    位填充错误:连续检测到6个同极性电平
    CRC错误: 当接收方接收到的数据计算出的CRC值与接收到的CRC不一致
    格式错误: 接收到的帧和规定的帧格式不一致
    ACK错误: ACK slot 场为隐性电平

错误界定及处理机制:

        错误界定并非是依据错误的类型去界定CAN节点的错误状态,而是依据错误计数器【TEC/REC】的值来界定CAN节点的错误状态;           错误状态分为三种:主动错误状态、被动错误状态和总线关闭态;这样分类的目的又是什么呢?可以理解成是依据当前节点的错误累积程度区分不同的错误等级,不同错误等级对应不同的动作,从而保证CAN总线上其他节点的正常交互。即:“量变引起质变的过程”;当该节点检测到错误后,内部REC/TEC计数器会相应的增加,基于REC/TEC的值判定节点状态;

网络上很多资料针对 “主动与被动” 关键字眼对主动错误状态与被动错误状态进行区分,看了许久未曾想通,反而越发迷茫;个人感觉不需过分纠结主动及被动字眼,理解成不同的错误等级即可,重点关注的是这几种状态下CAN总线允许该节点做哪些动作以及如何去动作;

主动错误状态:【REC<127 且TEC<127】

初步可判定该节点相对稳定可靠,该错误计数很可能是由于X节点异常导致的,那么其他节点很可能也会触发该错误,那么允许该节点破坏CAN总线的异常报文并告知其他节点;

    如果该节点是发送节点,相当于报文发送时自检出错误,将发送错误帧“6个连续显性位”至CAN总线,破坏总线异常数据,并告知其他节点请勿接收;
    如果该节点是接收节点,相当于报文接收时校验出错误,该错误很可能是由于发送节点异常导致的,其他节点接收时很可能也会校验出错误,那么允许该接收节点发送错误帧“6个连续显性位”至CAN总线,破坏总线异常数据,并告知其他节点;

被动错误状态:【REC>128 或TEC>128】

初步可判定该节点相对不可靠,该错误计数很可能是由于自身节点问题导致,即该错误很可能仅有该节点才有,对于其他节点而言是可以正常交互的,总线不信任该节点提供的错误标识,将不允许破坏总线数据,那么允许该节点发送错误帧“6个连续隐性位”至CAN总线,仅告知其他节点异常;

    如果该节点是接收节点,该错误很可能是由于自身节点问题导致,其他节点可以正常接收,不存在此类错误,即仅允许该异常节点发送6个连续隐性位告知错误,但不影响总线电平以及其他节点的正常接收;
    如果该节点是发送节点,检测到错误后会立即发送“6个连续隐性位”告知其他接收节点请勿接收该报文;由于该发送节点处于被动错误状态,那么将在下一帧发送之前传送一个间歇场【3个隐性位】和挂起传送场【8个隐性位】,使总线处于总线空性态,将该被动错误状态节点挂起,总线控制权交由其它待发送节点;

总线关闭状态:【TEC>255】

    当发送错误计数TEC>255时才会触发该状态,使该节点处于总线关闭态;
    复位或者等待传送128次11位隐性电平的时间后,重新加入活动,并且TEC/REC清零;

 

 
————————————————
版权声明:本文为CSDN博主「Royal Air」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37280790/article/details/88082681

 

一、五种CAN总线可能发生的错误

1、CRC错误:

接收节点计算出的CRC校验值,与发送节点计算的结果不一致;

2、格式错误:

传输的数据帧格式,与任何一种帧格式都不符;

3、应答错误:

ACK段,发送节点没有收到接收节点发出的应答(显性位);

单节点的CAN设备发送数据帧时为发生应答错误;

4、位发送错误:

发送过程中,发送节点发送的同时监听总线电平,如果总线电平和发送的不一致;

在仲裁域发现不同不报错,因为就是要仲裁掉优先级低的报文;

发送被动错误标志、主动错误标志期间检测总线电平有6个相同位时;

5、位填充错误:

帧起始到CRC之间,接收节点检测到有6个连续相同的位电平时,也就是违反5位相同位插入1位相反位的“位填充”原则;

因为ACK域和帧结束域电平固定,也无需填充;

 

二、三种错误状态

主动错误标识——6个显性位、由主动错误节点发出

被动错误标识——6个隐性位、由被动错误标志发出

错误界定符——8个隐性位

1、主动错误

因为主动错误标识由6个显性位组成,可以理解为破坏“位填充”原则,一个节点发现通信错误时,它会主动将帧彻底破坏掉,让其他节点知道它接收出错了;

CAN总线的特点是“广播”,也就是总线上一个节点发出,其余所有节点均能正确接收,如果有一个或多个节点由于某种原因出现接收错误,那么这个节点会主动站出来,通过发送不符合“位填充”规则的帧错误帧,来彻底把这一帧破坏掉,以通知其他节点“这一帧我接收错了,不算数,重来”,其他节点也许没有错,但是也会在收到主动错误标识后发出一个主动错误标识;发送节点在发送的同时也会监听总线数据,当发现数据被其他节点“破坏”后,会主动进行数据重发。

由CAN控制器自动完成。

错误不多,不是我导致的,我主动发送错误标识,通知其他节点放弃这一帧,我正常收发;

2、被动错误

错误比较多,很可能错误是由我导致的,我通知其他节点有错但是不干扰他们正常收发数据,也不要求重发,同时我不能连续发送了,得再插入8位隐性位的“延迟传送”段;这样是为了让其他正常节点(处于主动错误)优先使用总线;

被动错误的节点很可能存在硬件故障,不能让它拖累整个网络;

3、总线关闭

   错误太多,是我的问题,我停止收发并脱离总线;

   总线上数据的收发都被禁止;
————————————————
版权声明:本文为CSDN博主「Elsa Duan」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_22433397/article/details/78320970

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CAN总线-ACK应答机制分析 的相关文章

  • 解决AndroidStudio控制台输出乱码

    方法一 xff1a Help gt Edit Custom VM Options 在最后一行换行加上 xff1a xff08 不要漏掉符号 加好之后重启AndroidStudio xff09 Dfile encoding 61 UTF 8
  • c++--UDP发送接收

    UDP发送接收 头文件 include lt Winsock2 h gt 库 pragma comment lib Ws2 32 lib 连接Sockets相关库 初始化Windows SOCKET WSADATA wsaData if W
  • Airsim Setting up PX4 Hardware-in-Loop 环境搭建教程(windows)

    Airsim Setting up PX4 Hardware in Loop 环境搭建教程 xff08 windows xff09 经过本教程 xff0c 能够通过PX4连接遥控器 xff0c 继而能够控制airsim UE4中四轴模型 目
  • 在PX4 v1.9.2替换姿态控制算法方法

    在PX4 v1 9 2替换姿态控制算法方法 目的是在model中写一个与mc att control类似的model加入自己的姿态控制算法并替换之 目录 姿态控制算法simlink搭建生成并简单说明 PX4 v1 9 2姿态控制接口简单介绍
  • 不必通宵挂机,飞速克隆PX4源码的方法

    不必通宵挂机 xff0c 飞速克隆PX4源码的方法 项目地址 国内github网速 xff0c 那是慢的没法说 xff0c 克隆个PX4源码要半天 xff0c 然后更新子模块 xff0c 那不得需要一夜的时间 xff0c 有时早上一来 xf
  • Simlink与PX4硬件在环仿真(HIL)实现

    Simlink与PX4硬件在环仿真 HIL 实现 介于涉及的知识比较多 xff0c 这里只是简单的介绍一下 xff0c 硬件在环HIL介绍 simlink与PX4通信实现 硬件在环HIL介绍 为来贯彻万物都可以用数学公式表示 xff0c 我
  • MSP430如何给板子下载程序?(IAR MSPFET CCS)

    MSP430如何给板子下载程序 xff1f 这个问题其实很简单 xff0c 但就在前几天的我就吃了很大的亏 xff0c 搞了一天都没搞懂 这篇文章来谈一谈我走过的坑吧 xff0c 希望对你有所帮助 一 下载IAR开发IDE 43 串口下载工
  • ROS中ENU坐标系与无人机中NED坐标系的转换关系理解

    ROS中ENU坐标系与无人机中NED坐标系的转换关系理解 项目地址 无人机中NED坐标理解ENU与NED转换 无人机中NED坐标理解 机体坐标系 xff1a 机体坐标系固连飞机 xff0c 其原点 取在多旋翼的重心位置上 x轴在多旋翼对称平
  • PX4无人机ROS下仿真开发

    PX4无人机ROS下仿真开发 Overview Simulation Px4 control Slam Map Image process Planning Volans 项目地址volans 注 xff1a 有任何疑问都可在issues提
  • FlightPlot安装使用方法

    FlightPlot安装使用方法 下载flightPlot源码下载切换openjdk 版本重启安装flightPlot 下载flightPlot源码 git clone recursive https github com PX4 Flig
  • 基于Ubuntu+Eclipse+GDB+OpenOCD+STlink搭建STM32开发环境

    基于Ubuntu 43 Eclipse 43 GDB 43 OpenOCD 43 STlink搭建STM32开发环境 准备工作 xff1a 一台能够上网的配置还不错的电脑 xff0c stm32开发板 xff0c stlink下载器 本人的
  • APM直升机调试记录

    Author xff1a Bingo Time xff1a 20190601 xff0c V1 0 直升机调试记录 十字盘机械配平上位机调十字盘水平调整直升机在Stabilize模式下悬停调整直升机在AltHold模式下悬停调整直升机在Po
  • 3.3 创建一个 ROS 功能包

    本节主要介绍如何用 catkin 来创建一个新的功能包 xff0c 并且使用前面介绍的 rospack 命令去查看功能包的依赖 3 3 1 catkin 功能包的构成 一个完整的 catkin 功能包需要具备以下几个条件 xff1a 包含一
  • 树莓派安装MAVROS的一些坑

    一 基于原生系统安装ROS 详见文章https blog csdn net qq 33662995 article details 98645837 xff0c 写的很详细了 二 源码安装MAVROS 由于树莓派环境下不能直接从二进制安装
  • 树莓派3 ubuntu Mate 16.04 安装ROS环境

    以下仅为回忆使用 设备 xff1a 树莓派3 系统 xff1a Ubuntu mate 16 04 日期 xff1a 2018 7 20 目前支持树莓派3b 43 官方的Ubuntu mate系统还没出 xff0c 強行使用會出現彩虹屏 x
  • SSH远程连接服务器登录时出现如下错误Disconnected:No supported authentication methods available

    当使用 SSH 登录云服务器 ECS xff08 Elastic Compute Server xff09 Linux 服务器时 xff0c 即便正确输入了密码 xff0c 也会出现类似如下错误信息 xff1a span class tok
  • 内存分配方式详解(堆、栈、自由存储区、全局/静态存储区和常量存储区)

    原文地址 xff1a https blog csdn net u013007900 article details 79338653 参考文章 xff1a http www cnblogs com hanyonglu archive 201
  • Jenkins, docker-compose动态修改镜像版本升级部署

    docker compose镜像版本动态控制 提取 env文件进行配置通用环境变量 当前机器用户的home路径 HOST HOME 61 home guimu 上传文件临时路径 TMP DATA PATH 61 HOST HOME temp
  • k8s集群容器外部与容器内部服务互相访问

    一 容器外部访问容器内部服务 1 hostNetwork 参数 容器内部服务与宿主机同一网段 特点 当 Pod 调度到哪个节点就使用哪个节点的 IP 地址 xff0c 客户端使用 IP 地址访问容器里面的服务 一个 node 只能启动一个
  • Github库名命名规范

    Github库名命名规范 一 必要性说明 由于迁移到Github上的项目越来越多 xff0c 对项目的管理越来越困难 由于各项目命名具有随意性 xff0c 用之代表git仓库名后就很难快速回忆起这个项目的相关细节 xff0c 通常需要不断打

随机推荐

  • 斜线/、反斜线\、双斜线//、双反斜线\\——详解

    读法 xff1a 三个符号 xff0c 中为正 xff0c 左为斜线 xff0c 右为反斜 xff1b 八字 xff0c 先撇为斜 xff0c 后捺为反斜 用法介绍 xff1a 1 双斜线 xff1a 协议和主机名之间的分隔符 xff0c
  • 类成员变量为什么加“m_”前缀

    防止调用构造函数初始化时 xff0c 传递的变量名相同
  • 【类型转换】C++中char、char*、int、string相互转换函数及string转不同进制数函数

    1 char转int与int转char 1 1 char转int xff1a span class token keyword char span a span class token operator 61 span span class
  • C++获取、打印当前时间:time、localtime

    总结 xff1a 1 函数1为基本的获取time t格式时间函数 xff1b 2 函数3 4为转换为tm格式时间函数 xff1b 3 函数2 5 6为输出可读格式时间函数 4 其中函数2 5不符合使用习惯 xff0c 因此不长使用 xff0
  • ubuntu16.04安装完docker后无法上网,没有eth0或eno1只有docker0

    ubuntu16 04安装完docker后无法上网 xff0c 没有eth0或eno1只有docker0 vim etc NetworkManager NetworkManager conf 把里面的 dns 61 dnsmasq用 注释掉
  • OpenCV—PnP单目测距

    OpenCV PnP单目测距 使用单目相机结合OpenCV的pnp解算实现单目测距 xff08 需要知道物体的长宽 xff09 开始用的opencv 自带的标定api 标定相机 xff0c 但是标定结果和matlab的结果有出入 xff0c
  • 【具体实现过程】百度地图POI区域的边界经纬度坐标数据采集

    最近有个项目需要拿到百度地图中XXX市中所有学校的边界坐标 经过一下午的努力 xff0c 终于成功拿到了坐标 xff0c 对坐标数据还原和验证 特此记录一下具体实现过程和爬取思路 前言 xff1a 什么是POI xff1f Point of
  • Gazebo仿真平台模型搭建与修改

    ROS进阶教程 xff08 一 xff09 Gazebo仿真平台模型搭建与修改 文件讲解Models 文件World文件Launch文件 模型编辑可视化操作配置文件编辑 仿真操作流程完成model建模world文件和launch文件修改 其
  • XShell过期需要采购解决办法

    有天Xshell更新完再打开 xff0c 提示我去采购 xff0c 当然采购得花钱 xff0c 所以下面方法是解决这一问题 1 跳到官网 https www netsarang com download free license html
  • 【SMT32CubeMx安装详解】

    SMT32CubeMx安装详解 文章目录 SMT32CubeMx安装详解 前言一 准备工作二 CubeMax安装三 工程参数配置总结 前言 记录CubeMax软件安装和相关工程配置的简单操作 一 准备工作 在我们进行软件安装之前首先将我们需
  • AirSim无人机仿真平台(windows)

    1 环境 xff1a UE4 26 43 AirSim 43 VS2019 2 安装步骤 xff1a 1 xff09 先下载Epic Games安装启动器 xff0c 然后再安装UE4 26 xff1b 2 xff09 安装VS2019社区
  • ubuntu18在docker下运行kalibr

    一些命令 docker images sudo docker run it kalibr latest sudo docker run it v local path docker path respository bin bash sud
  • 机器人避障规划算法之VFH系列算法研究现状

    机器人路径规划算法可以分为全局路径规划与局部路径规划 xff0c 全局规划算法一般需要地图信息作为先验知识 xff0c 而局部规划算法利用传感器探测环境信息避开障碍物 常用的全局算法算法有可视图法 xff0c 栅格地图法 xff0c 智能算
  • Windows配置ArUco

    windows10 vs2019 opencv3 4 6 注意 xff0c 一定要选择与opencv版本一样的opencv contrib 进行编译 xff0c 否则将会出现错误 xff0c 有很多的工程不能编译通过 xff0c 不能产生相
  • ArUco估计位姿原理

    ArUco使用 PnP OpenCV aruco 校准相机 Camera Calibration Demo 使用opencv的aruco库进行位姿估计 include lt opencv2 core core hpp gt include
  • 传递函数极点与微分方程的解

    如何解微分方程 setting y 61 e rx xff0c 点睛之笔
  • MPC控制

    基于状态空间模型的控制 模型预测控制 xff08 MPC xff09 简介 对基于状态空间模型的控制理解得很到位 在这里我重点讲解一下状态空间 模型 那么什么是状态 xff1f 输出是不是也是状态的一种 xff1f 对的 xff0c 输出也
  • @卡尔曼滤波理解

    Kalman Filter For Dummies 翻译 如何用卡尔曼滤波算法求解电池SOC xff08 基础篇 xff09 转载留存 卡尔曼滤波算法详细推导 这一篇对预备知识的介绍还是很好的 xff0c 过程与原理讲解也很到位 xff0c
  • 全景避障、VIO

    VINS Mono代码分析与总结 完整版 单目与IMU的融合可以有效解决单目尺度不可观测的问题 鱼眼摄像头SLAM xff1a PAN SLAM 全景相机SLAM 原论文 xff1a Panoramic SLAM from a multip
  • CAN总线-ACK应答机制分析

    1 xff1a 应答场定义 应答场长度为 2 个位 xff0c 包含应答间隙 xff08 ACK SLOT xff09 和应答界定符 xff08 ACK DELIMITER xff09 在应答场里 xff0c 发送站发送两个 隐性 位 当接