嵌入式开发—CAN通信协议详解与应用(中)

news2024/9/20 7:14:50

书接上回:嵌入式开发—CAN通信协议详解与应用(上)

文章目录

    • CAN通讯中的位时间和位同步
      • 位时间的构成
        • 采样点
      • 位时间的计算公式
      • 时间量子(Time Quantum, TQ)
      • 位时间的阶段示意图
      • 位同步机制
    • CAN通信中的仲裁规则
      • 仲裁规则的基本原理
      • 仲裁过程的具体步骤
      • 仲裁示例
      • 仲裁特点
    • CAN通信中错误状态和错误检测机制
      • 1. CAN中的错误类型
      • 2. 错误状态
      • 3. CAN中的错误检测机制
      • 4. 错误处理流程

CAN通讯中的位时间和位同步

在CAN通信中,**位时间(Bit Time)**是指总线上传输一个位所需的时间,是CAN总线通信速率(即波特率)的倒数。CAN通信通过在位时间内对信号进行采样和同步来确保数据的可靠传输。

位时间被划分为多个阶段,每个阶段都有特定的功能,用于保持CAN总线的时钟同步和信号准确传输。

位时间的构成

位时间由以下四个阶段组成:

  1. 同步段(Sync Segment)

    • 该段是位时间的第一个部分,具有固定长度,始终为1个时间量子(Time Quantum, TQ)
    • 用于检测CAN总线上的边沿(电平变化),即从显性位(Dominant,逻辑0)到隐性位(Recessive,逻辑1),或反之。
    • 通过检测位边沿,CAN节点能够与总线保持同步。
  2. 传播段(Propagation Segment)

    • 该段用于补偿信号从一个节点传播到另一个节点的物理延迟。延迟由线路长度、信号传播速度等物理因素决定。
    • 其长度可以配置,通常是0到8个时间量子
  3. 相位缓冲段1(Phase Segment 1, PHASE_SEG1)

    • 该段允许根据接收到的信号对时钟进行提前调整(位同步)。如果采样点稍微偏移,可以通过调整这个段来重新同步。
    • 其长度可以配置,通常是1到8个时间量子
  4. 相位缓冲段2(Phase Segment 2, PHASE_SEG2)

    • 该段用于在采样之后对时钟进行延迟调整。如果检测到总线上的信号变化,可以通过此段进行同步恢复。
    • 其长度可以配置,通常是1到8个时间量子
采样点
  • 采样点是在位时间内对总线电平进行检测的时刻,通常位于位时间的末尾。
  • 位时间划分为不同的段,而采样点通常放置在相位缓冲段1的末尾,以便对信号进行最佳采样。
  • 采样点位置的选择对CAN通信的稳定性和错误率有很大影响。理想的采样点位置一般设置在位时间的**75%到87.5%**之间。

位时间的计算公式

**位时间(Bit Time, t_BIT)**的长短取决于CAN总线的波特率。位时间是波特率的倒数,公式为:

t _ B I T = 1 波特率 t\_BIT = \frac{1}{波特率} t_BIT=波特率1
例如,若波特率为500 kbps(500,000位/秒),则位时间为:

t _ B I T = 1 500 , 000 = 2   μ s t\_BIT = \frac{1}{500,000} = 2 \, \mu s t_BIT=500,0001=2μs

时间量子(Time Quantum, TQ)

位时间由多个**时间量子(TQ)**组成,TQ是CAN控制器的基本时间单位。一个位时间通常包含8到25个时间量子,TQ的长短由CAN控制器的时钟频率和波特率预分频器决定。

每个时间量子TQ由CAN控制器根据其内部时钟频率和分频系数来计算。公式如下:

T Q = 1 f _ C A N × ( B R P + 1 ) TQ = \frac{1}{f\_CAN \times (BRP + 1)} TQ=f_CAN×(BRP+1)1
其中:

  • f_CAN:CAN控制器的输入时钟频率。
  • BRP(Baud Rate Prescaler):波特率预分频器,它可以通过寄存器配置。

位时间的阶段示意图

位时间可以按照四个阶段来理解,每个阶段包含一定数量的时间量子(TQ):

在这里插入图片描述

位同步机制

由于CAN总线是多节点通信网络,每个节点的时钟可能略有不同,因此必须通过位同步机制保持同步。同步机制基于以下几种方式:

  1. 硬同步(Hard Synchronization)

    • 当总线处于空闲状态(隐性位)时,检测到第一个显性位(SOF帧起始位)时,所有节点都会立即进行硬同步,将时间重新调整到该显性位的边沿。
  2. 重同步(Re-Synchronization)

    • 在数据帧传输过程中,若某节点检测到位边沿的偏移,它可以通过调整相位缓冲段1和相位缓冲段2来进行重新同步,确保下一位的采样点位置准确。

CAN通信中的仲裁规则

CAN(Controller Area Network)通信的仲裁规则决定了在多节点共享同一总线时,哪个节点能够获得总线的控制权进行数据传输。由于CAN总线是一个多主架构(Multi-master),多个节点可以同时尝试发送数据。仲裁过程确保不会发生冲突,并且优先级高的消息能够优先传输。

仲裁规则的基本原理

CAN总线采用一种称为非破坏性位仲裁的机制,基于**消息标识符(ID)**的优先级。消息ID数值越小,优先级越高。

仲裁过程的基本原理如下:

  1. 当多个节点同时开始发送帧时,它们会根据每个帧的**标识符(ID)**进行位级别的仲裁。
  2. CAN总线是**线与(wired-AND)**结构,在CAN总线上有两种电平:显性电平(Dominant,逻辑0)和隐性电平(Recessive,逻辑1)。显性电平优先级高于隐性电平。
  3. 每个节点在发送时会监听总线。如果一个节点在发送隐性位时检测到总线上的电平为显性位,它会知道自己被另一个节点仲裁失败并立即停止发送。
  4. 仲裁的过程是逐位进行的,直到最终剩下优先级最高的节点继续发送,而其他节点退出竞争,等待下一次总线空闲时再尝试传输。

仲裁过程的具体步骤

  1. 发送开始

    • 各个节点同时开始发送数据帧,每个帧的开头是SOF(Start of Frame),之后是标识符
  2. 逐位仲裁

    • 从标识符的最高有效位(MSB)开始,每个节点发送自己标识符中的位。
    • 所有节点都会同时监听总线电平。当某个节点在发送隐性位(逻辑1)时,发现总线电平为显性位(逻辑0),它就知道有更高优先级的消息正在发送,立即停止发送。
  3. 仲裁结束

    • 最终,仲裁过程中只有优先级最高的节点留在总线上,其他节点则等待总线空闲后再尝试发送。

仲裁示例

假设有三个节点,它们同时尝试发送具有不同标识符的帧:

  • 节点A的标识符:1001010
  • 节点B的标识符:1000110
  • 节点C的标识符:1001110

仲裁过程如下:

  • 三个节点开始发送SOF之后,开始发送标识符。
  • 所有节点的第一个位是1(显性),所以都继续发送。
  • 第二个位也是0,所有节点继续发送。
  • 第三位是0,继续发送。
  • 到了第四位时,节点A发送1(隐性),节点B和C发送0(显性)。由于显性优先于隐性,节点A检测到总线上的显性电平,知道自己仲裁失败,于是停止发送。
  • 接下来,节点B和节点C继续仲裁,第五位,节点B发送1(隐性),节点C发送1(隐性),两个都继续。
  • 第六位,节点B发送0(显性),节点C发送1(隐性),节点C检测到显性电平,因此仲裁失败,停止发送。

最终,节点B成功仲裁,继续发送其数据,而节点A和节点C在总线空闲后再尝试发送。

仲裁特点

  1. 非破坏性仲裁:即使多个节点同时发送,也不会破坏总线上的数据,因为仲裁失败的节点会主动停止发送,而优先级高的节点可以继续发送其帧,保证了数据传输的完整性和无碰撞。

  2. 优先级决定传输顺序:消息标识符决定了优先级,数值越小(即更多显性位),优先级越高,优先级高的节点总是可以优先发送。

  3. 实时性保障:通过仲裁机制,紧急消息(优先级高)可以在总线被占用时打断其他非紧急消息的传输,保证高优先级数据的实时传输。

CAN通信中的仲裁规则基于非破坏性位级仲裁,确保优先级最高的节点可以成功获得总线的控制权,而其他节点则会在检测到总线优先权丧失时自动停止发送。通过这一机制,CAN总线可以在多节点竞争下避免冲突,确保数据的可靠传输和实时性保障。

CAN通信中错误状态和错误检测机制

CAN通信中的错误状态错误检测机制是确保总线数据传输可靠性和安全性的关键部分。由于CAN是一种实时通信协议,多节点共享同一总线,因此具备完善的错误检测和处理机制,以避免数据传输错误对系统造成影响。

1. CAN中的错误类型

CAN协议中定义了几种错误类型,主要包括:

(1)位错误(Bit Error)

  • 当某个节点发送的数据位与实际总线上的电平不符时,产生位错误。
  • 如果节点在发送显性位(逻辑0)时,检测到总线为隐性位(逻辑1),或在发送隐性位(逻辑1)时,检测到总线为显性位(逻辑0),就会触发位错误。
  • 注意:在仲裁期间,节点可能会检测到不同的位,但不会视为错误,因为这是仲裁机制的一部分。

(2)填充错误(Stuff Error)

  • CAN协议要求,在数据传输中,每发送连续5个相同的位,必须插入一个相反的位作为填充位,以确保总线上的同步性。
  • 如果节点在接收过程中,发现连续6个相同的位(即没有插入填充位),则产生填充错误。

(3)CRC错误(Cyclic Redundancy Check Error)

  • CRC字段用于验证帧中的数据是否正确传输。
  • 发送节点会计算一个CRC校验值,并附加在帧中。接收节点根据接收的帧重新计算CRC,如果计算结果与帧中的CRC值不匹配,则触发CRC错误。

(4)帧格式错误(Form Error)

  • CAN帧的每个部分都有严格的格式要求,包括帧的起始位、控制字段、数据字段、CRC字段、确认字段(ACK)、结束位等。
  • 如果帧中的某一部分不符合规定的格式(例如,SOF、EOF或ACK字段中出现非法的电平),则会产生帧格式错误。

(5)确认错误(ACK Error)

  • CAN帧传输完数据后,接收节点需要在**确认字段(ACK Field)**中发送显性位表示接收到数据。
  • 如果发送节点在ACK槽位(ACK slot)中未检测到显性位(即没有其他节点确认接收到数据),则产生确认错误。

2. 错误状态

CAN协议使用错误计数器来跟踪错误的发生情况,从而确定节点的错误状态。错误计数器有两个:

  • 发送错误计数器(Transmit Error Counter, TEC):用于记录发送错误的次数。
  • 接收错误计数器(Receive Error Counter, REC):用于记录接收错误的次数。

根据错误计数器的值,节点可以进入不同的错误状态:

(1)错误主动状态(Error Active)

  • 初始状态下,所有节点都处于错误主动状态。
  • 当节点处于这个状态时,它可以发送主动错误帧,通知其他节点出现错误。主动错误帧是由6个连续的显性位组成的。

(2)错误被动状态(Error Passive)

  • 当发送错误计数器或接收错误计数器超过127时,节点进入错误被动状态。
  • 在错误被动状态下,节点只能发送被动错误帧,该帧是由6个隐性位组成的,且不会影响总线仲裁。
  • 处于错误被动状态的节点不会主动干扰总线,避免影响其他节点的通信。

(3)总线关闭状态(Bus Off)

  • 如果发送错误计数器(TEC)超过255,节点进入总线关闭状态,停止参与总线通信。
  • 进入总线关闭状态的节点无法发送和接收任何消息,但内部逻辑仍然运行。该状态的目的是防止有故障的节点继续影响总线上的其他节点。
  • 总线关闭状态的节点需要通过软件或硬件复位才能重新恢复正常通信。

3. CAN中的错误检测机制

CAN协议中采用了多种错误检测机制,确保数据传输的准确性和可靠性。以下是CAN的主要错误检测机制:

(1)位监控(Bit Monitoring)

  • 发送节点在发送每一位时,会实时监听总线上的电平。如果检测到发送的位和实际总线电平不一致,则触发位错误。
  • 位监控机制可以有效检测单个位传输中的错误。

(2)填充位检测(Bit Stuffing Detection)

  • CAN协议要求,在传输过程中每连续发送5个相同的位后,插入一个相反的位。接收节点会检查是否遵循了这个规则。
  • 如果未按要求插入填充位,则触发填充错误。

(3)帧校验(Frame Check)

  • 接收节点会对CAN帧的固定字段(如SOF、EOF、ACK等)进行格式检查,如果格式不符合协议要求,则触发帧格式错误。

(4)CRC校验(CRC Check)

  • CAN帧的CRC字段用于检测数据传输的错误。接收节点计算数据的CRC值,并与帧中的CRC值进行比对,若不匹配则触发CRC错误。

(5)确认校验(ACK Check)

  • 当接收节点成功接收数据时,会在ACK字段中发送显性位。发送节点检查该字段,如果未收到显性位,则触发确认错误。

4. 错误处理流程

  1. 错误检测

    • 当节点检测到错误时,它立即停止当前帧的传输,并通过发送**错误帧(Error Frame)**通知其他节点发生错误。
  2. 错误帧的发送

    • 错误帧由两个部分组成:主动错误标志(Error Flag)错误界定段(Error Delimiter)
      • 主动错误帧:由连续6个显性位组成,表示严重错误。
      • 被动错误帧:由连续6个隐性位组成,表示节点处于错误被动状态。
    • 错误帧通过总线上的显性电平强制打断当前传输的帧,通知所有节点重启传输过程。
  3. 错误计数器更新

    • 节点在发送或接收错误帧后,会根据错误类型更新其发送或接收错误计数器。当错误计数器超过一定阈值时,节点的状态会从错误主动变为错误被动,严重时会进入总线关闭状态。

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

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

相关文章

03-Mac系统PyCharm主题设置

目录 1. 打开PyCharm窗口 2. Mac左上角点击PyCharm,点击Settings 3. 点击第一项Appearance& Behavior 4. 点击Appearance 5. 找到Theme进行设置 1. 打开PyCharm窗口 2. Mac左上角点击PyCharm,点击Settings 3. 点击第一项Appearance& Behavi…

【例题】lanqiao4425 咖啡馆订单系统

样例输入 3 2 2 1 3 1 2样例输出 3 2样例说明 输入的数组为:【3,1,2】 增量序列为:【2,1】 当增量 h2:对于每一个索引 i,我们会将数组元素 arr[i] 与 arr[i−h] 进行比较,并进行可…

Stable Diffusion绘画 | ControlNet应用-IP-Adapter:堪比 Midjourney 垫图

IP-Adapter 是腾讯AI实验室研发的控制器,属于 ControlNet 最强控制器前三之一。 如果想参照图片的风格,生成各种各样类似效果的图片,就可以用到 IP-Adapter。 在 ControlNet 单元中上传一张图片: 不输入任何提示词,出图…

MySQL数据库:掌握备份与恢复的艺术,确保数据安全无忧

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 目录 前言&#…

波导阵列天线学习笔记 馈电网络1 使用X型全公共波导馈网的毫米波大规模天线阵列的带宽提升

摘要: 全公共波导馈网的一次反射等效模型被研究用于提出一种毫米波大规模天线阵列带宽提升的新方法。理论分析显示由馈电网络拓扑造成的指定频率的多级小反射的同相叠加现象是影响大规模阵列的可实现带宽的重要因素,除了包含阵列的独立功分器和反射器的带…

【Hot100】LeetCode—295. 数据流的中位数

目录 1- 思路题目识别堆实现 2- 实现⭐4. 寻找两个正序数组的中位数——题解思路 3- ACM 实现 原题链接:295. 数据流的中位数 1- 思路 题目识别 识别1 :实现一个数据结构,求中位数 堆实现 思路 利用优先队列,小根堆放较小的元…

专科医院内外网数据摆渡,什么方法最“对症下药”?

专科医院是专门从事某一个或少数几个医学分科的医院。这些医院在特定的医学领域内具有较高的专业性和技术水平,通常致力于某一类疾病的预防、诊断和治疗。如传染病医院、口腔医院、肿瘤医院等。 根据相关法律法规和行业标准,涉及医疗数据的网络必须采取必…

影刀RPA实战:网页爬虫之携程酒店数据

1.实战目标 大家对于携程并不陌生,我们出行定机票,住酒店,去旅游胜地游玩,都离不开这样一个综合性的网站为我们提供信息,同时,如果你也是做旅游的公司,那携程就是一个业界竞争对手,…

Zookeeper 3.8.4 安装和参数解析

安装 zookeeper 之前必须先安装 JDK,有关Linux环境JDK可以参考我以前写的博文 1、关于Linux服务器配置java环境遇到的问题 2、Linux环境安装openJDK 3、Centos7.3云服务器上安装Nginx、MySQL、JDK、Tomcat环境 文章目录 1. zookeeper 安装2. 参数解析 1. zookeeper …

计算机视觉—3d点云数据基础

点云数据 3d点云数据由来 3d点云 3D Point Cloud是一种用于表示三维空间中对象或场景的数据结构。在最基础的形式中,它是一个包含多个三维坐标点(X, Y, Z)的集合。这些点是通过对实际物体或场景表面进行离散采样而获得的,因此&a…

使用高版本nodej报错:node: /lib64/libm.so.6: version `GLIBC_2.27‘ not found

如果要更新GLIBC_2.27会很繁琐,且耗时较长,所以建议下载带glibc的版本的nodejs 解决方案:下载带glibc的版本安装,如果是使用nvm则解压到对应的版本控制路径 我使用的版本是v20.16.0:Index of /download/release/v20.1…

基于GEE的Landsat 7ETM+条带填补

项目简介 该项目使用Google Earth Engine (GEE)平台,对Landsat 5和Landsat 7卫星影像进行预处理与影像填补操作。主要功能包括影像的选取、波段处理、缺失影像的填补以及最终影像的导出。代码中的核心功能是通过空间回归方法对Landsat 7和Landsat 5影像进行时序配准…

Oracle 19c异常恢复—ORA-01209/ORA-65088---惜分飞

由于raid卡bug故障,导致文件系统异常,从而使得数据库无法正常启动,客户找到我之前已经让多人分析,均未恢复成功,查看alert日志,发现他们恢复的时候尝试resetlogs库,然后报ORA-600 kcbzib_kcrsds_1错误 2024-09-15T17:07:32.55321508:00 alter database open resetlogs 2024-09-…

YOLOv9改进策略【损失函数篇】| Shape-IoU:考虑边界框形状和尺度的更精确度量

一、本文介绍 本文记录的是改进YOLOv9的损失函数,将其替换成Shape-IoU。现有边界框回归方法通常考虑GT(Ground Truth)框与预测框之间的几何关系,通过边界框的相对位置和形状计算损失,但忽略了边界框本身的形状和尺度等…

复习:指针

目录 指针变量 指针变量的内容 引入 指针变量的值 间接访问操作符 概念 运算 基本运算 指针/-整数 指针-指针 引入 算术运算和间接访问操作 自增自减运算符 前置 后置 应用 指针数组 语法 指针数组 数组指针 多级指针 引入 语法 章节问题 指针变量 指针…

Java数据结构(十一)——归并排序、计数排序

文章目录 归并排序算法介绍代码实现非递归实现复杂度和稳定性 计数排序算法介绍代码实现复杂度和稳定性 归并排序 算法介绍 归并排序是一种分而治之的排序算法。基本思想是: 将一个数组分成两半,对每半部分递归地应用归并排序先进行分解,然…

数据权限的设计与实现系列9——前端筛选器组件Everright-filter集成框架开发2

功能实现 ‍ 规则转换为 SQL 片段‍ 规则解析 首先我们来构造一个典型的规则,包括两个条件组,每个组由两个条件组成,由且与或两种逻辑关系,如下图: 然后看看生成的规则,如下: {"filt…

spring中对于servlet API的封装---springWeb

目录 一.springweb概述 二.springweb的特点 三.springweb的运行流程 四.springweb组件 五.springweb的搭建 1.导包 2.配置 DispatcherServlet 3.开启 springweb 注解 4.处理器的搭建 六.springweb注解 七.springweb拦截器 1.拦截器概述 2.拦截器的实现 (1)添加 servelt api 依赖…

开源 AI 智能名片链动 2+1 模式 O2O 商城小程序在社群活动中的应用与时机选择

摘要:本文探讨了开源 AI 智能名片链动 21 模式 O2O 商城小程序在社群经济中的重要性,着重分析了如何借助该小程序适时举办大型活动以维持和引爆社群活跃度。通过对活动时机选择的研究,强调了针对社群用户量身定制活动时机的必要性&#xff0c…

基于python+django+vue的外卖管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的外…