Enhanced ShockBurst (ESB)原文翻译

news2024/11/17 20:34:56

自我学习为主,同时也为所需要的提供一份资料
官方地址
增强型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语句中的所有代码块。

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

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

相关文章

数据集市与数据仓库的区别

数据仓库是企业级的,能为整个企业各个部门的运作提供决策支持;而数据集市则是部门级的,一般只能为某个局部范围内的管理人员服务,因此也称之为部门级数据仓库。 1、两种数据集市结构 数据集市按数据的来源分为以下两种 &#x…

MATLAB算法实战应用案例精讲-【数模应用】多元线性回归(MLR)(附Java、python和matlab代码实现)

前言 在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。因此多元线性回归比一元线性回归的实用意义更大。 知识…

Chatgpt 编程 工作实战使用 (国内 镜像)

又到周末,时间像是乘着光阴的箭, 一去不返 , 时间的流逝 似乎没有直觉 ,就像哪一座座大山,斗转星移 之间 便拔地而起了, 日复一日年复一年, 的工作使人麻木 ,今天不写技术文,写一些有…

Leetcode.1247 交换字符使得字符串相同

题目链接 Leetcode.1247 交换字符使得字符串相同 Rating : 1597 题目描述 有两个长度相同的字符串 s1和 s2,且它们其中 只含有 字符 "x"和 "y",你需要通过「交换字符」的方式使这两个字符串相同。 每次「交换字符」的时…

C++设计模式(21)——中介者模式

亦称: 调解人、控制器、Intermediary、Controller、Mediator 意图 中介者模式是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。 问题 假如你有一个创建…

蓄水池抽样算法

蓄水池抽样,也称水塘抽样,是随机抽样算法的一种。基本抽样问题有一批数据(假设为一个数组,可以逐个读取),要从中随机抽取一个数字,求抽得的数字下标。常规的抽样方法是,先读取所有的…

Spring IoC 和 Spring AOP

Spring IoC Ioc(Inversion of control:即控制反转)是一种设计思想,而不是一种具体的技术实现。IoC的思想就是将原本在程序中手动创建对象的控制权交给Spring框架来管理。 不过, IoC 并非 Spring 特有,在其…

蓝桥杯C/C++VIP试题每日一练之龟兔赛跑预测

💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客…

python的类如何使用?兔c同学一篇关于python类的博文概述

本章内容如目录 所示: 文章目录1. 创建和使用类1.1 创建第一个python 类1.2 版本差异1.3 根据类创建实例1. 访问属性2. 调用方法3. 创建多个实例2. 使用类和实例2.1 给属性指定默认值2.2 修改属性的值3. 继承3.1 子类的 __init __()3.2 给子类定义属性和方法3.3 重写…

《如何有效阅读》藤原和博 读书笔记

感想 1、整本书内容零散: 主旨是如何有效阅读,但是阅读方法不成系统,更像是零散的想法,或者说是作者想到什么就写什么。第一遍读完以后,大脑里没有什么整体思路,觉得作者说的有道理,但是没有实…

Django 模型层及ORM介绍二

数据库迁移文件混乱的解决方法 数据库中django_migrations表记录了migrate的‘全过程’,项目各应用中的migrate文件与之对应,否则migrate会报错解决方案: 1、删除所有migrations里所有的000?_xxxx.py(__init__.py除外&#xff09…

【模拟集成电路】环路滤波器(LPF)设计

环路滤波器 LPF 设计 前言环路滤波器设计仿真结果各部分链接链接:前言 本文主要内容是对环路滤波器 模块设计设计进行阐述,LPF在电荷泵频率综合器中,主要作用是进行滤波,消除毛刺,因此一个简单的RC就可以起到很好的效果…

软件设计的“SOLID”五大原则

一、单一职责 1、定义 单一职责原则(single Responsibility Principle,SRP)规定,每一个软件单元,其中包括组件、类和函数,应该只有一个单一且明确定义的职责。 2、特点 一个类应该仅有一个引起它变化的原因&#x…

JavaScript HTML DOM 改变 HTML

文章目录JavaScript HTML DOM 改变 HTML改变 HTML 输出流改变 HTML 内容改变 HTML 属性JavaScript HTML DOM 改变 HTML HTML DOM 允许 JavaScript 改变 HTML 元素的内容。 改变 HTML 输出流 JavaScript 能够创建动态的 HTML 内容: 今天的日期是: Thu …

JDBC-API详解、SQL注入演示、连接池

文章目录JDBC1,JDBC概述1.1 JDBC概念1.2 JDBC本质1.3 JDBC好处2,JDBC快速入门2.1 编写代码步骤2.2 具体操作3,JDBC API详解3.1 DriverManager3.2 Connection (事务归我管)3.2.1 获取执行对象3.2.2 事务管理3.3 Stateme…

SQL语句 -非空约束 - 唯一约束 - 主键约束 - 默认约束 -外键约束

文章目录约束约束介绍和分类非空约束唯一约束主键约束默认约束案例练习外键约束约束 约束介绍和分类 约束的概念: 约束是作用于表中列上的规则,用于限制加入表的数据 约束的存在保证了数据库中数据的正确性、有效性和完整性 约束的分类如下: 约束名称描述关键字非…

代码随想录【Day25】| 216. 组合总和 III、17. 电话号码的字母组合

216. 组合总和 III 题目链接 题目描述: 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 说明: 所有数字都是正整数。 解集不能包含重复的组合。 示例 1: 输入: k 3, n 7 输…

从中国文化看面试挑人标准

文章目录标准一、面相1. 1 四白眼1.2 浓眉二、讲话2.1 言多与气虚总结本文结合中国面相,是个概率性问题,对于个体无效。 标准 正直,三观正,沟通好,技术。从概率上讲: 正直且三观正的人----有恒心&#x…

Python带你制作一个属于自己的多功能音乐播放器

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 就是用Python做一个简易的音乐播放器,废话不多说,咱们直接开干 当然,今天做这个肯定不是最简单的,最简单的音乐播放器,9行代码足以 完整源码等直接在文末名片领…

剑指 Offer 08. 二叉树的下一个结点

摘要 二叉树的下一个结点_牛客题霸_牛客网 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节…