Enhanced ShockBurst (ESB)原文翻译
自我学习为主,同时也为所需要的提供一份资料
官方地址
增强型ShockBurst(ESB)是一种支持双向数据包通信的基本协议,包括数据包缓冲、数据包确认和丢失数据包的自动重传。ESB以低功耗提供无线通信,并且实现的代码量小且易于使用。
ESB协议嵌入了传统nRF24L系列的硬件中。增强型ShockBurst模块使nRF5系列设备能够使用ESB协议与nRF5或nRF24L系列设备通信。
ESB具有自动数据包事务处理功能,可轻松实现可靠的双向数据链路。事务是两个收发机之间的分组交换,其中一个收发机充当主接收机(PRX),另一个收发机作为主发射机(PTX)。
特点:
- 支持星形网络拓扑,通常具有一个主接收机(PRX)和最多8个主发射机(PTX)
- 传统模式下的1到32字节动态有效负载长度
- nRF5系列设备之间的1至252字节静态有效负载长度
- 每个PTX和PRX之间的双向数据传输
- 数据包确认和自动数据包重传功能
- 每个管道拥有单独TX和RX FIFO
- 向后兼容传统nRF24Lxx增强型ShockBurst
- 支持外部前端模块
资源
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…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...

2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】
1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...