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

Enhanced ShockBurst (ESB)原文翻译

自我学习为主,同时也为所需要的提供一份资料
官方地址
增强型ShockBurst(ESB)是一种支持双向数据包通信的基本协议,包括数据包缓冲、数据包确认和丢失数据包的自动重传。ESB以低功耗提供无线通信,并且实现的代码量小且易于使用。
ESB协议嵌入了传统nRF24L系列的硬件中。增强型ShockBurst模块使nRF5系列设备能够使用ESB协议与nRF5或nRF24L系列设备通信。
ESB具有自动数据包事务处理功能,可轻松实现可靠的双向数据链路。事务是两个收发机之间的分组交换,其中一个收发机充当主接收机(PRX),另一个收发机作为主发射机(PTX)。
拓扑结构
特点:

  1. 支持星形网络拓扑,通常具有一个主接收机(PRX)和最多8个主发射机(PTX)
  2. 传统模式下的1到32字节动态有效负载长度
  3. nRF5系列设备之间的1至252字节静态有效负载长度
  4. 每个PTX和PRX之间的双向数据传输
  5. 数据包确认和自动数据包重传功能
  6. 每个管道拥有单独TX和RX FIFO
  7. 向后兼容传统nRF24Lxx增强型ShockBurst
  8. 支持外部前端模块

资源
ESB要求独占访问增强型ShockBurst库的所有固定和配置资源,以确保正确操作
所需资源描述

注意没有MPU强制执行这种独占访问,因此操纵这些资源会产生未定义的行为。
无线电和定时器中断处理程序以优先级0(最高级别)运行,ESB回调函数以优先级1运行。应用程序使用的其他中断必须使用优先级级别2或更低(级别2到7)以确保正确操作。
ESB需要MPSL库来支持前端模块。该库始终链接到构建中,但是,默认情况下,它不会被初始化,以便为应用程序和ESB协议提供对所有硬件资源的访问。有关详细信息,请参阅Direct support。

向后兼容性
增强型ShockBurst库与传统的nRFgo SDK兼容。要确保使用nRFConnect SDK构建的应用程序可以与运行使用nRFgo SDK构建的程序的nRF24设备通信,请使用配置ESB_LEGACY_CONFIG。
但是,请注意,两个SDK中提供的示例并不对应,因此您不能将一个SDK中的发送器示例与另一个SDK的接收器示例一起使用

数据包事务
增强型ShockBurst包事务由来自PTX的包传输发起,并在PTX从PRX接收到确认包(ACK包)时成功完成。
为了启用双向数据链路,允许PRX将数据有效载荷附加到ACK分组。为此,PRX向其TX FIFO添加一个分组,该分组作为下一个ACK分组中的有效载荷发送。
数据包发送与应答过程
如果PTX在初始发送的分组之后没有接收到ACK,则它尝试重新发送分组,直到最终接收到ACK。允许的最大重传尝试次数和每次尝试之间的延迟由最近一次调用esb_init()(其中esb_config结构中esb_config.retransmission_count和esb_config_retransmission_delay的值分别指定重传尝试的次数和它们之间的延迟)或函数esb_set_rest_count()和esb_set_rest_delay()。重传延迟被定义为每次传输尝试开始之间的持续时间。注意,这与传统的nRF24L系列硬件实现不同,后者将延迟定义为从数据包传输结束到重传开始的持续时间。
如果从PRX发送到PTX的ACK分组丢失,但初始分组和随后的重传尝试都被PRX成功接收,则重复的分组将被PRX丢弃。这防止了PRX应用程序接收重复的数据包。然而,重复的数据包将始终被PRX确认,即使它们被丢弃。
重传过程
PTX可以选择发送到PRX的各个分组不需要从PRX返回ACK。当应用程序使用传递给esb_write_bayload()函数的esb_paiload参数的esb_pyload.noack字段将数据包上载到TX FIFO时,会做出此决定。
当PRX接收到不需要ACK的分组时,它不向PTX发送ACK分组,因此PTX将继续重传该分组,直到达到允许的最大重传尝试次数。

设置ESB应用程序
执行以下步骤设置应用程序以发送和接收数据包:

  • 使用ESB_init()初始化ESB。您可以使用ESB_default_CONFIG中的默认参数作为p_CONFIG参数的起点,并在需要时重新配置它们。

  • 如有必要,请使用以下任一函数更新地址、地址前缀、信道和比特率:
    esb_set_base_address_0()
    esb_set_base_address_1()
    esb_set_prefixes()
    esb_set_rf_channel()
    esb_set_bitrate()

  • 确保高频时钟正在运行:

NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
NRF_CLOCK->TASKS_HFCLKSTART = 1;
while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0);
  • 开始发送或接收数据包:
    -如果节点是PTX:
    通过调用esb_write_bayload()将数据包添加到TX FIFO。
    根据最近一次调用esb_init()时使用的esb_config.tx_mode的值,您可能需要 调用esb_start_tx()来启动传输。
    无线电收到确认或超时后,处理ESB_EVENT_TX_SUCCESS、ESB_EVENT_TX_FAILED和ESB_EVERT_RX_RECEIVE事件。

  • 如果节点是PRX:

  • 当数据包传入时,处理ESB_EVENT_RX_RECEIVED事件。每个事件之间可能有多个数据包到达RX FIFO。

  • 为了将有效载荷附加到确认数据包(即ACK包),请使用esb_write_bayload()将它们先添加到TX FIFO。在接收数据包之前,必须对payload进行排队。当在队的payload被发送并收到确认后,此时就假设它已经到达了另一个设备。因此,ESB_EVENT_TX_SUCCESS事件被触发进入事件等待队列。
    要停止ESB模块,请调用ESB_disable()。但是,请注意,如果在禁用模块时事务正在进行,则事务不会完成。因此,在禁用模块之前,您可能需要检查模块是否空闲。

频率选择
ESB可以使用nRF5芯片可以使用的任何通道发送或接收数据包。通过调用esb_set_rf_channel()函数来选择通道。
注意:PTX和PRX必须配置为使用相同的频率来交换数据包。

管道和寻址
节点上的每个逻辑地址都称为管道。每个管道映射到发送或接收数据包时使用的一个广播地址。
广播地址由前缀地址和基地址组成,基地址为2-4字节,前缀地址为1字节。注意,nRF5无线电使用0和1的交替序列作为分组的前导码。因此,为了正确接收数据包,基址的最高有效字节不能是0和1的交替序列,也就是说,它不能是0x55或0xAA。
管道0具有自己的唯一基址(基址0),而管道1-7使用相同的基址(基址1)。8个管道中的每一个都有一个唯一的一字节长的前缀地址。
广播时,首先传输每个地址字节的最高有效位。2-4字节长的基地址的最高有效字节是第一个发送的地址字节,而前缀字节是最后一个发送的。
地址不能由0x00前缀和格式为0x00XXXXXX(长度4)/0x0000XXXX(长度5)的地址组成。这样的零地址将导致返回错误代码NRF_error_INVALID_PARAM。
注意,ESB和nRF5无线电外围设备中的字节顺序不同,因为地址字节在ESB中被重新排列以匹配nRF24L无线电。
地址组成示意图
数据包标识
从PTX发送到PRX的任何分组由分组报头中的两位分组ID字段(PID)以及分组的循环冗余校验(CRC)字段唯一标识。如果新分组具有相同的有效载荷,则该分组ID用于区分新分组与前一分组。
在PRX,重传的分组被丢弃,并且不添加到RX FIFO。并且ESB_EVENT_RX_RECEIVED事件不会被调用。
除了PID之外,还使用CRC来识别唯一的分组。这降低了当发生多次连续失败的分组传输尝试时,分组被错误地识别为重传尝试并被PRX丢弃的可能性。此功能非常有用,因为PID只有两位。

FIFOs
在每个节点上,RX和TX都有一个FIFO队列。FIFO由所有管道共享,esb_paiload.pipe表示数据包的管道。对于接收的数据包,此字段指定数据包来自哪个管道。对于传输的数据包,它指定数据包将通过哪个管道发送。
当多个数据包排队时,它们以FIFO方式处理,忽略管道。
PTX FIFO处理
当ESB在PTX模式下启用时,上传到TX FIFO的任何数据包都将在下一次机会传输。
当从PRX成功接收到ACK时,PTX假设payload已成功接收并添加到PRX的RX FIFO。成功传输的数据包j将从PTX的TX FIFO中删除,以便可以传输FIFO中的下一个数据包。
如果PTX接收到的ACK包含了payload,则将该payload添加到PTX的RX FIFO。
PRX FIFO处理
当ESB在PRX模式下启用时,所有启用的管道(地址)都会同时监视传入的数据包。
如果接收到先前未添加到PRX的RX FIFO的新数据包,且RX FIFO具有用于该数据包的可用空间,则就将该数据包添加到RX FIFO,并将ACK发送回PTX。如果PRX的TX FIFO包含任何数据包,则TX FIFO中的下一个可用数据包将作为payload附加到ACK包。注意,在接收到PTX的数据包之前,此可用数据包必须已上载到TX FIFO。

事件处理
当无线电上出现事件时,增强型ShockBurst模块会分析其原因,并在必要时将事件排入应用程序队列。这些事件包括成功操作、失败操作或RX FIFO中有可用的新数据。
在第一次触发软件中断时,事件会以标志的形式进行排队。因此,实际发送到应用程序的每个事件之间可能存在多个无线电中断。单个ESB_EVENT_TX_SUCCESS或ESB_EVENT_TX_FAILED事件分别指示一个或多个成功或失败的操作。ESB_EVENT_RX_RECEIVED事件指示RX FIFO中至少有一个新数据包。事件处理程序应确保在适当时完全清空RX FIFO。

前端模块支架
ESB协议支持外部前端模块。有关详细信息,请参阅使用RF前端模块。

勘误表解决方案和nRF52832芯片修订
nRF52832设备上的模块实现包括一组硬件错误的解决方案。这些错误需要几百字节的代码空间来确定运行时哪些解决方案适用于运行固件的设备。这是为了确保基于较新SDK的固件在较旧和较新版本芯片上都能正常工作。如果您知道您的固件只能在某些设备上运行,则可以通过删除解决方法来节省数百字节的代码空间。如果您确定不需要支持修订版1芯片,则可以删除格式If((NRF_FICR->INFO.VARIANT&0x0000FF00)==0x00004200)中If语句中的所有代码块。如果您确定不需要支持修订版2芯片,则可以删除格式If((NRF_FICR->INFO.VARIANT&0x0000FF00)==0x00004500)中If语句中的所有代码块。

相关文章:

Enhanced ShockBurst (ESB)原文翻译

自我学习为主,同时也为所需要的提供一份资料 官方地址 增强型ShockBurst(ESB)是一种支持双向数据包通信的基本协议,包括数据包缓冲、数据包确认和丢失数据包的自动重传。ESB以低功耗提供无线通信,并且实现的代码量小且…...

软件测试之兼容性测试

对于基于计算机平台的软件,在测试过程中必须考虑软、硬件的兼容性,在设计测试用例的过程中必须考虑数据转换或转移的问题,应该尽力发现其可能带来的错误。不仅是基于计算机平台的软件,对于嵌入式软件也一样,在软件升级…...

笔记(一)——容器

容器分类:序列式容器:每个元素都有固定位置,取决于插入的时机和地点,和元素无关,如vector、deque、list、stack、queue。关联式容器:元素位置取决于特定的排序准则,和插入顺序无关,如…...

C++入门:命名空间

假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等。同样的情况也出现在 C 应用程序中。例…...

操作系统(复试准备)

操作系统(复试准备) 第一章知识点 操作系统概述 操作系统的概念 负责协调软硬件等计算机资源的工作 为上层用户,应用程序提供简单易用的接口 是一种系统软件 操作系统的功能与目标 资源的管理者 处理机管理,存储器管理&#x…...

2023年CDGA考试模拟题库(501-600)

2023年CDGA考试模拟题库(501-600) 501.希望从数据中获取价值的组织认识到,高质量数据比低质量数据更有价值。使用劣质数据充满风险,会损害组织的声誉,导致罚款、收入损失、客户流失和负面的媒体曝光等组织基于各种业务驱动因素而着手进行数据质量管理活动,下列哪项不属于上述驱…...

NCNN+Int8+yolov5部署和量化

【GiantPandaCV引言】 还记得我在两个月前写的文章吗,关于yolov4-tiny+ncnn+int8量化的详细教程:NCNN+INT8+YOLOV4量化模型和实时推理 后来准备写yolov5+ncnn+int8量化的教程,却在yolov5的量化上遇到了麻烦,一方面是量化后速度更慢了,另一方面是精度下降严重,出现满屏都…...

springboot+vue.js协同过滤算法之智能旅游推荐系统java

目 录 第一章 绪论 3 1.1课题背景 3 1.2课题研究的目的和意义 3 1.3 研究现状 4 1.4论文所做的主要工作 4 第二章 技术介绍 5 2.1B/S结构 5 2.2MySQL 介绍 5 2.3MySQL环境配置 6 第三章 系统分析与设计 8 3.1系统说明 8 3.2系统可行性分析…...

Google Brain新提出的优化器“Lion”,效果要比Adam(W)更好

Google Brain新提出的优化器“Lion”,效果要比Adam(W)更好 论文地址:https://arxiv.org/abs/2302.06675代码地址:https://github.com/google/automl/blob/master/lion/lion_pytorch.py 1 简单、内存高效、运行速度更快 与 AdamW 和各种自适…...

慢雾:Discord 私信钓鱼手法分析

事件背景 5 月 16 日凌晨,当我在寻找家人的时候,从项目官网的邀请链接加入了官方的 Discord 服务器。在我加入服务器后立刻就有一个"机器人"(Captcha.bot)发来私信要我进行人机验证。这一切看起来相当的合理。我也点击了这个验证链接进行查看…...

2023-2-25 刷题情况

交换字符使得字符串相同 题目描述 有两个长度相同的字符串 s1 和 s2,且它们其中 只含有 字符 “x” 和 “y”,你需要通过「交换字符」的方式使这两个字符串相同。 每次「交换字符」的时候,你都可以在两个字符串中各选一个字符进行交换。 …...

【数据结构】双向链表的接口实现(附图解和源码)

双向链表的接口实现(附图解和源码) 文章目录双向链表的接口实现(附图解和源码)前言一、定义结构体二、接口实现(附图解源码)1.初始化双向链表2.开辟新空间3.尾插数据4.尾删数据5.打印双向链表中数据6.头插数…...

数据结构与算法之[把数字翻译成字符串]动态规划

前言:最近在刷动态规划的算法题目,感觉这一类题目还是有一点难度的,但是不放弃也还是能学好的,今天给大家分享的是牛客网中的编程题目[把数字翻译成字符串],这是一道经典的面试题目,快手,字节跳…...

java 面向对象三大特性之多态 万字详解(超详细)

目录 前言 : 一、为什么需要多态 : 1.白璧微瑕 : 2.举栗(请甘雨,刻晴,钟离吃饭): 3.代码 : 4.问题 : 二、什么是多态 : 1.定义 : 2.多态的实现步骤(重要) : 三、多态的使用 : 1.多态中成员方法的使用(重要…...

git push origin master 情况

📢📢📢📣📣📣哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝一位上进心十足的【Java ToB端大厂领…...

ElasticSearch查询优化routing

如果一个索引分片多达一百,再加上每个分片数据量大的情况下ES查询速度会慢,这种情况可以根据业务情况考虑使用_routing优化。 _routing 路由 当索引一个文档的时候,文档会被存储在一个主分片上。在存储时一般都会有多个主分片。Elasticsearch 如何知道一个文档应该放置在哪…...

【HashMap 1.7和1.8】

Java中的HashMap是一种常用的数据结构,用于存储键值对。在Java 1.7和1.8中,HashMap的实现有一些不同。 Java 1.7中的HashMap实现是基于“拉链法”的哈希表。每个哈希桶(bucket)是一个链表,存储了散列值相同的键值对。当键值对数量过多时&…...

【Zabbix实战之故障处理篇】Zabbix监控中文乱码问题解决方法

【Zabbix实战之故障处理篇】Zabbix监控中文乱码问题解决方法 一、问题展现1.查看Zabbix仪表盘2.问题分析二、检查Zabbix环境1.检查Zabbix监控主机2.检查Zabbix各组件状态三、在宿主机安装中文字体库1.安装中文字体2.查看字体文件四、安装中文字库1.查看Zabbix所有组件容器2.拷贝…...

学习(mianshi)必备-ClickHouse高性能查询/写入和常见注意事项(五)

目录 一、ClickHouse高性能查询原因-稀疏索引 二、ClickHouse高性能写入-LSM-Tree存储结构 什么是LSM-Tree 三、ClickHouse的常见注意事项和异常问题排查 一、ClickHouse高性能查询原因-稀疏索引 密集索引: 在密集索引中,数据库中的每个键值都有一个索引记录&…...

在Kotlin中探索 Activity Results API 极简的解决方案

Activity Results APIActivity Result API提供了用于注册结果、启动结果以及在系统分派结果后对其进行处理的组件。—Google官方文档https://developer.android.google.cn/training/basics/intents/result?hlzh-cn一句话解释:官方Jetpack组件用于代替startActivity…...

样式冲突太多,记一次前端CSS升级

目前平台前端使用的是原生CSSBEM命名,在多人协作的模式下,容易出现样式冲突。为了减少这一类的问题,提升研效,我调研了业界上主流的7种CSS解决方案,并将最终升级方案落地到了工程中。 样式冲突的原因 目前遇到的样式…...

如何解决报考PMP的那些问题?

关于PMP的报考条件,报考PMP都需要什么条件呢?【学历条件】:需要满足23周岁/高中毕业5年以上/大专以上学历,三个满足一个即可;【PDU条件】:报考PMP需要PDU证明(学习项目管理课程的学时证明&#…...

数据结构栈的经典OJ题【leetcode最小栈问题大剖析】【leetcode有效的括号问题大剖析】

目录 0.前言 1.最小栈 1.1 原题展示 1.2 思路分析 1.2.1 场景引入 1.2.2 思路 1.3 代码实现 1.3.1 最小栈的删除 1.3.2 最小栈的插入 1.3.3 获取栈顶元素 1.3.4 获取当前栈的最小值 2. 有效的括号 0.前言 本篇博客已经把两个关于栈的OJ题分块,可以根据目…...

数据结构与算法之打家劫舍(一)动态规划思想

动态规划里面一部题目打家劫舍是一类经典的算法题目之一,他有各种各样的变式,这一篇文章和大家分享一下打家劫舍最基础的一道题目,掌握这一道题目,为下一道题目打下基础。我们直接进入正题。一.题目大家如果刚接触这样的题目&…...

无人驾驶路径规划论文简要

A Review of Motion Planning Techniques for Automated Vehicles综述和分类0Motion Planning for Autonomous Driving with a Conformal Spatiotemporal Lattice从unstructured环境向structured环境的拓展,同时还从state lattice拓展到了spatiotemporal lattice从而…...

C++ sort()函数和priority_queue容器中比较函数的区别

普通的queue是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。priority_queue中元素被赋予优先级。在创建的时候根据优先级进行了按照从大到小或者从小到大进行了自动排列(大顶堆or小顶堆)。可以以O(log n) 的效率查找…...

STM32开发(14)----CubeMX配置ADC

CubeMX配置ADC前言一、什么是ADC?二、实验过程1.单通道ADC采集STM32CubeMX配置代码实现2.多通道ADC采样(非DMA)STM32CubeMX配置代码实现3.多通道ADC采样(DMA)STM32CubeMX配置代码实现总结前言 本章介绍使用STM32CubeMX对ADC进行配置的方法&a…...

Simple RNN、LSTM、GRU序列模型原理

一。循环神经网络RNN 用于处理序列数据的神经网络就叫循环神经网络。序列数据说直白点就是随时间变化的数据,循环神经网络它能够根据这种数据推出下文结果。RNN是通过嵌含前一时刻的状态信息实行训练的。 RNN神经网络有3个变种,分别为Simple RNN、LSTM、…...

【原创】java+swing+mysql生肖星座查询系统设计与实现

今天我们来开发一个比较有趣的系统,根据生日查询生肖星座,输入生日,系统根据这个日期自动计算出生肖和星座信息反馈到界面。我们还是使用javaswingmysql去实现这样的一个系统。 功能分析: 生肖星座查询系统,顾名思义…...

CentOS 环境 OpneSIPS 3.1 版本安装及使用

文章目录1. OpenSIPS 源码下载2. 工具准备3. 编译安装4. opensips-cli 工具安装5. 启动 OpenSIPS 实例1. OpenSIPS 源码下载 使用以下命令即可下载 OpenSIPS 的源码,笔者下载的是比较稳定的 3.1 版本,读者有兴趣也可前往 官方传送门 sudo git clone htt…...