当前位置: 首页 > news >正文

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

书接上回:嵌入式开发—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. 错误计数器更新

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java 线程超时时间:作用于核心线程还是最大线程?
  • libyuv之linux编译
  • 【揭秘Java】线程安全中的有序性之谜
  • 信通院发布首个《大模型媒体生产与处理》标准,阿里云智能媒体服务作为业界首家“卓越级”通过
  • 树莓派智能语音助手实现音乐播放
  • TSRPC+Cocos
  • 在react中 使用redux
  • 2024年最新软件测试学习路线图(从入门到精通)
  • 利用长度选择器优化Prompt示例选择:提升AI对话效率
  • python实现多个pdf文件合并
  • docker镜像结构
  • pikachu下
  • Redis常用操作及springboot整合redis
  • 监听html元素是否被删除,删除之后重新生成被删除的元素
  • Django_Vue3_ElementUI_Release_004_使用nginx部署
  • 345-反转字符串中的元音字母
  • Angular 响应式表单 基础例子
  • FastReport在线报表设计器工作原理
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Python socket服务器端、客户端传送信息
  • Vultr 教程目录
  • 创建一个Struts2项目maven 方式
  • 基于遗传算法的优化问题求解
  • 理解在java “”i=i++;”所发生的事情
  • 少走弯路,给Java 1~5 年程序员的建议
  • 手写一个CommonJS打包工具(一)
  • 异常机制详解
  • 翻译 | The Principles of OOD 面向对象设计原则
  • #NOIP 2014# day.1 T2 联合权值
  • #stm32整理(一)flash读写
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (2)nginx 安装、启停
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (九)One-Wire总线-DS18B20
  • (四)Linux Shell编程——输入输出重定向
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • /3GB和/USERVA开关
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @TableLogic注解说明,以及对增删改查的影响
  • @Transactional 竟也能解决分布式事务?
  • [30期] 我的学习方法
  • [BZOJ2850]巧克力王国
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [C++] C++11详解 (一)
  • [C++]: 模板进阶
  • [C++][opencv]基于opencv实现photoshop算法色阶调整
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】
  • [CISCN 2019华东南]Web11
  • [FxCop.设计规则]8. 也许参数类型应该是基类型
  • [Gamma]阶段测试报告