NRF52832 NRF52840 私有2.4G无线ESB协议控制是否ACK操作

news2024/10/23 17:02:44

如题,使用NRF52832或者NRF52840的私有2.4G协议时,可以控制发送的数据是否启用自动ack,有两个关键变量,一个是初始化时的配置,另一个是发送数据时数据包中的配置。分别如下

bool                    selective_auto_ack;     //!< Enable or disable selective auto acknowledgement.xxxxxxxxxx2 1nrf_esb_config.selective_auto_ack     bool                    selective_auto_ack;     //!< Enable or disable selective auto acknowledgement.2
typedef struct
{
    uint8_t length;                                 //!< Length of the packet (maximum value is @ref NRF_ESB_MAX_PAYLOAD_LENGTH).
    uint8_t pipe;                                   //!< Pipe used for this payload.
    int8_t  rssi;                                   //!< RSSI for the received packet.
    uint8_t noack;                                  //!< Flag indicating that this packet will not be acknowledgement.
    uint8_t pid;                                    //!< PID assigned during communication.
    uint8_t data[NRF_ESB_MAX_PAYLOAD_LENGTH];       //!< The payload data.
} nrf_esb_payload_t;

查看源代码,开始发送函数start_tx_transaction内部对于是否ack发送的操作是不一样的,区分两者操作是通过一个ack变量来确定

static void start_tx_transaction()
{
    bool ack;

    m_last_tx_attempts = 1;
    // Prepare the payload
    mp_current_payload = m_tx_fifo.p_payload[m_tx_fifo.exit_point];


    switch (m_config_local.protocol)
    {
        case NRF_ESB_PROTOCOL_ESB:
            update_rf_payload_format(mp_current_payload->length);
            m_tx_payload_buffer[0] = mp_current_payload->pid;
            m_tx_payload_buffer[1] = 0;
            memcpy(&m_tx_payload_buffer[2], mp_current_payload->data, mp_current_payload->length);

            NRF_RADIO->SHORTS   = m_radio_shorts_common | RADIO_SHORTS_DISABLED_RXEN_Msk;
            NRF_RADIO->INTENSET = RADIO_INTENSET_DISABLED_Msk | RADIO_INTENSET_READY_Msk;

            // Configure the retransmit counter
            m_retransmits_remaining = m_config_local.retransmit_count;
            on_radio_disabled = on_radio_disabled_tx;
            m_nrf_esb_mainstate = NRF_ESB_STATE_PTX_TX_ACK;
            break;

        case NRF_ESB_PROTOCOL_ESB_DPL:
            ack = !mp_current_payload->noack || !m_config_local.selective_auto_ack;
            m_tx_payload_buffer[0] = mp_current_payload->length;
            m_tx_payload_buffer[1] = mp_current_payload->pid << 1;
            m_tx_payload_buffer[1] |= mp_current_payload->noack ? 0x00 : 0x01;
            memcpy(&m_tx_payload_buffer[2], mp_current_payload->data, mp_current_payload->length);

            // Handling ack if noack is set to false or if selective auto ack is turned off
            if (ack)
            {
                NRF_RADIO->SHORTS   = m_radio_shorts_common | RADIO_SHORTS_DISABLED_RXEN_Msk;
                NRF_RADIO->INTENSET = RADIO_INTENSET_DISABLED_Msk | RADIO_INTENSET_READY_Msk;

                // Configure the retransmit counter
                m_retransmits_remaining = m_config_local.retransmit_count;
                on_radio_disabled = on_radio_disabled_tx;
                m_nrf_esb_mainstate = NRF_ESB_STATE_PTX_TX_ACK;
            }
            else
            {
                NRF_RADIO->SHORTS   = m_radio_shorts_common;
                NRF_RADIO->INTENSET = RADIO_INTENSET_DISABLED_Msk;
                on_radio_disabled   = on_radio_disabled_tx_noack;
                m_nrf_esb_mainstate = NRF_ESB_STATE_PTX_TX;
            }
            break;

        default:
            // Should not be reached
            break;
    }

    NRF_RADIO->TXADDRESS    = mp_current_payload->pipe;
    NRF_RADIO->RXADDRESSES  = 1 << mp_current_payload->pipe;

    NRF_RADIO->FREQUENCY    = m_esb_addr.rf_channel;
    NRF_RADIO->PACKETPTR    = (uint32_t)m_tx_payload_buffer;

    NVIC_ClearPendingIRQ(RADIO_IRQn);
    NVIC_EnableIRQ(RADIO_IRQn);

    NRF_RADIO->EVENTS_ADDRESS = 0;
    NRF_RADIO->EVENTS_PAYLOAD = 0;
    NRF_RADIO->EVENTS_DISABLED = 0;

    DEBUG_PIN_SET(DEBUGPIN4);
    NRF_RADIO->TASKS_TXEN  = 1;
}

注意 第28行 ack变量的取值

  ack = !mp_current_payload->noack || !m_config_local.selective_auto_ack;

当初始化2.4G时,设置selective_auto_acktrue时,整个表达式会根据发数据数据包中的noack变量取值改变而改变,当selective_auto_ackfalse时,ack都为truenoack无效,

selective_auto_acknoackack
truetruefalse
truefalsetrue
falsextrue

也就是说只有selective_auto_ack为true,才可以设置数据包是否启用自动ack,noack为true时,不启用,noack为false时,启用

另外设置pipe个数为是通过下列函数指定的,第二个参数确定开启几个pipe

  err_code = nrf_esb_set_prefixes(addr_prefix, NRF_ESB_PIPE_COUNT);

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

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

相关文章

java线程的几种状态

线程的所有状态 NEW: 安排了工作, 还未开始行动RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作. BLOCKED: 这几个都表示排队等着其他事情 WAITING: 这几个都表示排队等着其他事情TIMED_WAITING: 这几个都表示排队等着其他事情TERMINATED: 工作完成了. 线程状态和状…

《黑神话悟空》各章节boss顺序汇总

第一章BOSS顺序&#xff1a; 1、牯护院&#xff1a;犀牛精&#xff0c;位于苍狼岭娟&#xff0c;击败后能获得定身术。 2、广智&#xff1a;火刀狼&#xff0c; 位于观音禅院&#xff0c;击败后获得广智变身&#xff0c;记得敲钟。 3、蓝皮幽魂&#xff1a;蓝皮大头&#xff0…

大模型入门到精通!大模型应用开发极简入门(含PDF)

大模型的出现正悄然改变人们的生活与工作方式&#xff0c;比如ChatGPT-4、文心一言、通义千问等语言大模型。它们已帮助很多办公室“白领”们在解决日常工作问题&#xff0c;如制定计划、撰写实施方案&#xff0c;甚至制作美化PPT等&#xff08;笔者及身边的同事在工作中还经常…

Star Tower:智能合约的安全基石与未来引领者

在区块链技术的快速发展中&#xff0c;智能合约作为新兴的应用形式&#xff0c;正逐渐成为区块链领域的重要组成部分。然而&#xff0c;智能合约的可靠性问题一直是用户最为关心的焦点之一。为此&#xff0c;Star Tower以其强大的技术实力和全面的安全保障措施&#xff0c;为智…

pytest中@pytest.fixture常用顺序function

ytest中pytest.fixture用法讲解 1、测试函数开始之前2、执行测试函数&#xff1a;3、测试函数结束后&#xff1a; 备注&#xff1a;内容来自chatGPT 在 pytest 中&#xff0c;pytest.fixture 是一个非常强大的功能&#xff0c;用于设置测试所需的环境和状态。它可以通过 scope…

听泉鉴宝在三个月前已布局商标注册!

近日“听泉鉴宝”以幽默的风格和节目效果迅速涨粉至2500多万&#xff0c;连线出现“馆藏文物”和“盗墓现场”等内容&#xff0c;听泉鉴宝早在几个月前已布局商标注册。 据普推知产商标老杨在商标局网站检索发现&#xff0c;“听泉鉴宝”的主人丁某所持股的江苏灵匠申请了三十…

R语言统计分析——置换检验2

参考资料&#xff1a;R语言实战【第2版】 独立两样本和K样本检验 # 安装coin包 install.packages(c("coin")) # 加载coin包 library(coin) # 创建检验数据集 score<-c(40,57,45,55,58,57,64,55,62,65) treatment<-factor(c(rep("A",5),rep("B…

51单片机应用——直流电机PWM调速

目标实现功能 单片机引脚输出PWM波形控制直流电机以不同转速工作。 1.PWM简介 PWM技术 PWM的中文全称是脉宽调制&#xff0c;常用于电动机控制、开关电源、音频放大器等。利用PWM技术可以达到微处理器&#xff08;如单片机&#xff09;的数字输出对模拟电路控制的效果。 P…

膜结构首次应用于国内游轮项目—轻空间

轻空间&#xff08;江苏&#xff09;膜科技有限公司近日成功中标一项国内游轮项目&#xff0c;这一成就标志着膜结构在游轮船舶行业的首次应用&#xff0c;开启了新的市场探索之旅。 作为行业先锋&#xff0c;轻空间始终致力于将创新技术融入多元化场景。本次游轮项目的成功中标…

Opensearch集群部署【docker、服务器、Helm多种部署方式】

操作系统兼容性 我们建议在 Red Hat Enterprise Linux (RHEL) 或使用systemd的基于 Debian 的 Linux 发行版上安装 OpenSearch &#xff0c;例如 CentOS、Amazon Linux 2 和 Ubuntu Long-Term Support (LTS)。OpenSearch 应该适用于大多数 Linux 发行版&#xff0c;但我们只测…

2023年五一杯数学建模C题双碳目标下低碳建筑研究求解全过程论文及程序

2023年五一杯数学建模 C题 双碳目标下低碳建筑研究 原题再现&#xff1a; “双碳”即碳达峰与碳中和的简称&#xff0c;我国力争2030年前实现碳达峰&#xff0c;2060年前实现碳中和。“双碳”战略倡导绿色、环保、低碳的生活方式。我国加快降低碳排放步伐&#xff0c;大力推进…

工业一体机为软件开发商提供稳定可靠的硬件平台

在当今数字化、智能化的工业时代&#xff0c;软件在工业生产和管理中的作用日益凸显。而软件的高效运行离不开稳定可靠的硬件平台&#xff0c;工业一体机正是这样一个为软件开发商提供坚实支撑的关键设备。 工业一体机的铝合金工艺和无风扇设计为软件运行创造了良好的散热环境。…

Apache Hive 帮助文档

Apache Hive 帮助文档 由于教学需要&#xff0c;本文主要介绍 hive 的 基础 和 哪里可以看帮助文档的介绍&#xff0c; 是一篇对帮助文档整理的文章 官方网站 文章目录 Apache Hive 帮助文档什么是 Hive&#xff1f;Hive 下载Hive帮助文档 什么是 Hive&#xff1f; Apache Hi…

ComfyUI 即将发布桌面版,更新内容前瞻

就在昨天&#xff0c;ComfyUI 宣布即将发布桌面版&#xff0c;一下是官方的介绍 官网发布页&#xff1a;https://blog.comfy.org/comfyui-v1-release/ 完全打包的桌面版本 在过去的两个月里&#xff0c;我们一直在努力为 ComfyUI 提供无缝的桌面体验。我们的目标是确保非技术…

Python教程:制作贪吃蛇游戏存以exe文件运行

Python&#xff0c;作为一种解释型、面向对象、动态数据类型的高级程序设计语言&#xff0c;其简洁易懂的语法和丰富的库使得它成为开发小游戏的理想选择。 下面&#xff0c;我们就来一步步教大家如何用Python制作一个贪食蛇小游戏&#xff0c;并将其打包成exe程序&#xff0c…

活体人脸识别技术总结及实践

文章目录 1、背景2、人脸反伪装技术2.1 活体人脸识别常见模式2.2 学术上反伪装研究 3、工程实现3.1 Silent-Face3.2 Silent-Face模型转rknn3.3 Silent-Face模型的限制 1、背景 1.1 什么是活体检测&#xff1f; 在人脸识别之前&#xff0c;先判断一下屏幕前摄像头捕捉到的人脸是…

【Golang】Gin框架中如何定义路由

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

计算机网络:数据链路层 —— 无线局域网 WLAN

文章目录 局域网无线局域网 WLAN802.11 无线局域网802.11无线局域网的组成WLAN 的组成有固定基础设施的802.11无线局域网漫游服务 无固定基础设施的802.11无线局域网 802.11无线局域网的物理层802.11无线局域网的数据链路层不使用碰撞检测 CD 的原因CSMA/CA 协议CSMA/CA 协议的…

新探索研究生英语读写教程pdf答案(基础级)

《新探索研究生英语读写教程》的设计和编写充分考虑国内研究生人才培养目标和研究生公共英语的教学需求&#xff0c; 教学内容符合研究生认知水平&#xff0c; 学术特征突出&#xff1b;教学设计紧密围绕学术阅读、学术写作和学术研究能力培养&#xff1b;教学资源立体多元&…

阀井燃气监控仪-燃气阀门井数据远程监测设备-旭华智能

在城市的地下&#xff0c;有无数条看不见的生命线——那是为千家万户输送温暖与光明的燃气管线。然而&#xff0c;在这复杂的网络之下&#xff0c;隐藏着不可预知的风险。为了保障每一位市民的安全&#xff0c;我们推出了一款革命性的产品——“智安卫士”可燃气体监测终端。 随…