CAN总线位同步的使用以及总线仲裁规则详解

目录

1.  位同步

1.1  位时序

1.2  硬同步

1.3  再同步

1.4  波特率计算

2.  仲裁

2.1  先占先得

2.2  非破坏性仲裁


1.  位同步

        CAN总线没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长,发送方以约定的位时长每隔固定时间输出一个数据位接收方以约定的位时长每隔固定时间采样总线的电平,输入一个数据位,理想状态下,接收方能依次采样到发送方发出的每个数据位,且采样点位于数据位中心附近。接收方数据采样需要注意的是:

        问题一:接收方以约定的位时长进行采样,但是采样点没有对齐数据位中心附近如绿色所示部分,假如刚好对应跳变沿,可能就无法区分此时信号是“0”还是“1”,解决方法也很简单,首先这个问题的关键,就是采样点的初始位置没对齐,如果我们以第一次跳变沿位信号,延迟半个数据位左右的时间,进行第一次的数据采样,这样后续就会正常,这样的解决方法也叫“硬同步”(下面会有详细介绍):

        问题二:接收方刚开始采样正确,但是时钟有误差,随着误差积累,采样点逐渐偏离。开始的采样点正常,但是二者的时钟有偏差,这样将会导致开始的时候数据还能正常采集,但是随着时间的累计,偏差越来越大,这将会导致采样点严重偏离预定位置,解决方法,我们可以看到如果数据偏离太过严重,这一次的采样时间,距离数据跳变过于久了,那么我们可以根据这缩短采样时间,同理要是采样时间过快造成的偏差,我们也可以延长采样时间(再同步):

1.1  位时序

        为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线对每一个数据位的时长进行了更细的划分,分为:同步段(SS)

                                                      传播时间段(PTS)

                                                      相位缓冲段1(PBS1)

                                                      相位缓冲段2(PBS2)

        每个段又由若干个最小时间单位(Tq)构成。

段名称段的作用Tq数
同步段(SS: Synchronization Segment)多个连接在总线上的单元通过此段实现时序调整,同步进行接收和发送的工作。由隐性电平到显性电平的边沿或由显性电平到隐性电平边沿最好出现在此段中。1Tq8~25Tq
传播时间段(PTS: Propagation Time Segment)

用于吸收网络上的物理延迟的段。

所谓的网络的物理延迟指发送单元的输出延迟、总线上信号的传播延迟、接收单元的输入延迟。
这个段的时间为以上各延迟时间的和的两倍。

1~8Tq
相位缓冲段 1 (PBS1: Phase Buffer Segment 1)当信号边沿不能被包含于 SS 段中时,可在此段进行补偿。
由于各单元以各自独立的时钟工作,细微的时钟误差会累积起来,PBS 段可用于吸收此误差。
通过对相位缓冲段加减 SJW 吸收误差。SJW 加大后允许误差加大,但通信速度下降。
1~8Tq
相位缓冲段 2 (PBS2: Phase Buffer Segment 2)2~8Tq
再同步补偿宽度(SJW: reSynchronization Jump Width)因时钟频率偏差、传送延迟等,各单元有同步误差。SJW 为补偿此误差的最大值。1~4Tq

采样点:所谓采样点是读取总线电平,并将读到的电平作为位值的点。位置在 PBS1 结束处。

1.2  硬同步

        每个设备都有一个位时序计时周期,当某个设备(发送方)率先发送报文,其他所有设备(接收方)收到SOF的下降沿时,接收方会将自己的位时序计时周期拨到SS段的位置,与发送方的位时序计时周期保持同步,硬同步只在帧的第一个下降沿(SOF下降沿)有效,经过硬同步后,若发送方和接收方的时钟没有误差,则后续所有数据位的采样点必然都会对齐数据位中心附近。

        这个可以理解为谍战剧中,进行秘密行动前的对表工作,无论发送方还是接收方都有一个秒表(时钟),开始行动了发送方和接收方进行校时,如上图,接收方发现发送方说出(SS)时,自己不是,自己马上将秒表纠正,当发送方说开始行动(SS位置)跳变数据开始新的一位(新的动作),接收方在自己秒表转到PBS1和PBS2之间进行采样数据: 

        不过再好的表,也会出现随着时间的推移,不准的情况,这就需要进行再次校准(再同步)。

1.3  再同步

        若发送方或接收方的时钟有误差,随着误差积累,数据位边沿逐渐偏离SS段,则此时接收方根据再同步补偿宽度值(SJW)通过加长PBS1段,或缩短PBS2段,以调整同步,再同步可以发生在第一个下降沿之后的每个数据位跳变边沿

        这里需要注意的是,如下图,SJW=2所代表的不是每次出现误差都需要补偿2Tq,这里的2代表补偿的最大值:

        实际补偿大小是误差大小和SJW共同决定的。如上图,SJW=2Tq,刚好误差也是2Tq,因此刚好补偿2Tq;如果这里误差只有1Tq,且SJW=2Tq,这时实际上只会补偿1Tq;若是误差3Tq,且SJW=2Tq,那么也只会补偿2Tq(只会补偿SJW指定的Tq数)。

1.4  波特率计算

波特率 = 1 / 一个数据位的时长 = 1 / (TSS + TPTS + TPBS1 + TPBS2)

例如:     SS = 1Tq,PTS = 3Tq,PBS1 = 3Tq,PBS2 = 3Tq     Tq = 0.5us     

波特率 = 1 / (0.5us + 1.5us + 1.5us + 1.5us) = 200kbps

2.  仲裁

        CAN总线只有一对差分信号线,同一时间只能有一个设备操作总线发送数据,若多个设备同时有发送需求,该如何分配总线资源?

        解决问题的思路:制定资源分配规则,依次满足多个设备的发送需求,确保同一时间只有一个设备操作总线。

        对于多设备发送也有不同的表现形式,首先若是一个数据先发送,已经发送一半了,突然又又一个发送方想要发送数据,要如何解决这个问题呢?

2.1  先占先得

        我们可以规定先占先得,若当前已经有设备正在操作总线发送数据帧/遥控帧,则其他任何设备不能再同时发送数据帧/遥控帧(不过这里需要注意的是,根据错误帧/过载帧的特性,别的发送方也是可以发送错误帧/过载帧破坏当前数据)。

CAN总线数据帧格式详细介绍-CSDN博客

        任何设备检测到连续11个隐性电平,即认为总线空闲,只有在总线空闲时,设备才能发送数据帧/遥控帧。一旦有设备正在发送数据帧/遥控帧,总线就会变为活跃状态,必然不会出现连续11个隐性电平,其他设备自然也不会破坏当前发送。(根据位填充的作用,总线在正常状态下,根本不可能出现11连续的隐性电平,可以看上面链接有关位填充的介绍)

        若总线活跃状态其他设备有发送需求,则需要等待总线变为空闲,才能执行发送需求。

        这只是错位多个设备发送,若是多个设备同时发送又应当如何解决呢?

2.2  非破坏性仲裁

        若多个设备的发送需求同时到来或因等待而同时到来,则CAN总线协议会根据ID号(仲裁段)进行非破坏性仲裁,ID号小的(优先级高)取到总线控制权,ID号大的(优先级低)仲裁失利后将转入接收状态,等待下一次总线空闲时再尝试发送。

实现非破坏性仲裁需要两个要求:

线与特性:总线上任何一个设备发送显性电平0时,总线就会呈现显性电平0状态,只有当所有设备都发送隐性电平1时,总线才呈现隐性电平1状态,即:0 & X & X = 0,1 & 1 & 1 = 1

回读机制:每个设备发出一个数据位后,都会读回总线当前的电平状态,以确认自己发出的电平是否被真实地发送出去了,根据线与特性,发出0读回必然是0,发出1读回不一定是1

         在总线空闲态,最先开始发送消息的单元获得发送权。

        多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平(逻辑0)最多的单元可继续发送。

数据帧和遥控帧的优先级:具有相同 ID 的数据帧和遥控帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权,可继续发送。

标准格式和扩展格式的优先级:标准格式 ID 与具有相同 ID 的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式的 RTR 位为显性位的具有优先权,可继续发送。

CAN总线数据帧格式详细介绍-CSDN博客

CAN总线_时光の尘的博客-CSDN博客

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

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

相关文章

Python爬虫开发中的分析与方案制定

网站分析作为获取数据的重要手段,其重要性不言而喻。Python作为一种强大的编程语言,因其简洁的语法和强大的库支持,成为开发爬虫的首选工具。本文将深入探讨Python爬虫开发中的分析与方案制定,并在代码中加入代理信息,…

深入理解接口测试:实用指南与最佳实践5.0(一)

✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…

基于Matlab 火焰识别技术

课题介绍 森林承担着为人类提供氧气以及回收二氧化碳等废弃气体的作用,森林保护显得尤其重要。但是每年由于火灾引起的事故不计其数,造成重大的损失。如果有一款监测软件,从硬件处获得的图像中监测是否有火焰,从而报警&#xff0…

Python酷库之旅-第三方库Pandas(209)

目录 一、用法精讲 976、pandas.MultiIndex.set_codes方法 976-1、语法 976-2、参数 976-3、功能 976-4、返回值 976-5、说明 976-6、用法 976-6-1、数据准备 976-6-2、代码示例 976-6-3、结果输出 977、pandas.MultiIndex.to_frame方法 977-1、语法 977-2、参数…

SQL 窗口函数

窗口函数用于在不改变查询结果集行数的情况下,对每一行执行聚合计算或其他复杂的计算,可以跨行计算。 随着窗口函数的出现,无须再使用关联子查询。窗口函数的可读性很好,代码也很简洁。 1 实践 1.1 营业额年度变化 需求&#…

36.Redis核心设计原理

本文针对前面的讲解做一次总结 1.Redis基本特性 1.非关系型的键值对数据库,可以根据键以O(1)的时间复杂度取出或插入关联值 2.Redis的数据是存在内存中的 3.键值对中键的类型可以是字符串,整型,浮点型等,且键是唯一的 4.键值对中…

《人工智能网络安全现状(2024)》深度解读:机遇、挑战与应对策略

在当今数字化浪潮汹涌澎湃的时代,人工智能(AI)与网络安全已然深度交融,二者相互作用所塑造的发展态势正深刻重塑着我们的信息安全格局。《人工智能网络安全现状(2024)》这份报告恰似一盏明灯,为…

光控资本 :股票支撑位是什么?股票支撑位怎么找?

股票支撑位是指在股票价格的前史K线走势有两次或者两次以上,出现下跌到某一方位,股票就出现反弹的走势,则投资者可以把这个方位称为支撑位,支撑位阐明下方托单较多,个股无法持续下跌,在托单的影响下&#x…

网站小程序app怎么查有没有备案?

网站小程序app怎么查有没有备案?只需要官方一个网址就可以,工信部备案查询官网地址有且只有一个,百度搜索 "ICP备案查询" 找到官方gov.cn网站即可查询! 注:网站小程序app备案查询,可通过输入单位…

STM32+AI语音识别智能家居系统

基于 STM32 和 AI 语音识别的智能家居系统的详细硬件和软件设计,包括各个模块的详细描述和代码示例。 一、硬件设计 1. 微控制器(STM32): 选择 STM32F7 系列或更高性能的芯片,如 STM32F767ZIT6,以满足处理…

【初阶一】初识c语言

【初阶一】初识c语言 一、为什么学C语言?二、学习前的准备1.搭建编译环境以及使用2.代码库GitHub/Gitee创建以及使用3.写博客的作用以及教学 三、个人感悟 一、为什么学C语言? C语言是一门经久不衰的计算机编程语言,有句话叫:万物…

Linux DRM 那些事 - HDMI 接口 DTS 配置

本文基于RockPI 4A单板Debian系统 Linux 4.4 内核介绍DRM框架HDMI接口DTS配置。 在DTS中主要实现:HDMI的使能、VOP绑定、IOMUX引脚配置和HDMI控制器配置。 一、HDMI 配置 文件:arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi #include "rk3…

QT仿QQ聊天项目,第三节,实现聊天界面

一,界面控件示意图 界面主要由按钮QPushButton,标签QLabel,列表QListWidget 要注意的是QListWidget既是实现好友列表的控件,也是实现聊天气泡的控件 二,控件样式 QPushButton#btn_name {border:none;}QPushButton#btn_close {border:1px;bac…

前端学习八股资料CSS(二)

更多详情:爱米的前端小笔记,更多前端内容,等你来看!这些都是利用下班时间整理的,整理不易,大家多多👍💛➕🤔哦!你们的支持才是我不断更新的动力!找…

项目笔记:在stm32f103c8上用DMA控制串口收发

一、传统串口收发与引入DMA控制的区别 传统串口收发每一步都经过CPU处理和控制,当总线数据量大且频繁时CPU要反复地进入中断中处理,而引入DMA的差异就在于DMA会自动处理这个过程,并不需要占用CPU。 二、在不同芯片上所包含的DMA数量不同 对于…

基于SpringBoot的“原创歌曲分享平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“原创歌曲分享平台”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 平台功能结构图 平台首页界面图 用户注册界面…

CLion配置QT开发环境

一、将qmake工程转为cmake工程(方法一:用工具转换并做适当修改) 1、工具链接:链接:https://pan.baidu.com/s/1grW2QY3sW8X2JaHWM_ePPw 提取码:7at4 工具源码:https://github.com/milahu/qmake2cmake 2、执行…

【动手学电机驱动】 STM32-FOC(7)基于 MCSDK6.0 控制与调试速度环

STM32-FOC(1)STM32 电机控制的软件开发环境 STM32-FOC(2)STM32 导入和创建项目 STM32-FOC(3)STM32 三路互补 PWM 输出 STM32-FOC(4)IHM03 电机控制套件介绍 STM32-FOC(5&…

力扣 LeetCode 142. 环形链表II(Day2:链表)

解题思路&#xff1a; 使用set判断是否重复添加&#xff0c;如果set加入不进去证明之前到达过该节点&#xff0c;有环 public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();ListNode cur head;while (cur …

基于Ubuntu2410脚本搭建OpenStack-D版

openstack 初始化环境安装数据库、memcahe、rabbitmq等服务安装keystone服务安装glance服务安装placement服务安装nova服务安装neutron服务安装horizon服务启动云主机 本次实验使用单节点搭建&#xff0c;Ubuntu2410系统&#xff1a;搭建openstack-D版&#xff0c;采用ovs网络组…