【STM32+cubemx】0026 HAL库开发:NRF24L01无线2.4G通信模块的应用

2023-05-16

NRF24L01是NORDIC公司生产的一款无线通信通信芯片,可以工作在免费开放的2.4GHz频段;通信速率可以达到最高2Mbps;MUC可以使用SPI接口与它交互。

本节我们就来使用stm32驱动NRF24L01实现无线通信,先实现简单的一对一通信,然后讲解一对多通信,最后实现在ack中返回数据的应用。

1)NRF24L01模块硬件介绍

直接使用nrf24L01芯片搭建电路需要比较高的射频功底,一般情况下推荐使用现成的电路模块,本文使用的是下图这种:

类似的nrf24L01模块的对外引脚,除了VCC和GND,还有下面6个:

CSN:芯片的片选线,低电平芯片工作;

SCK:芯片控制的时钟线(SPI的时钟);

MISO:芯片控制数据线(SPI的MISO);

MOSI:芯片控制数据线(SPI的MOSI);

IRQ:中断信号,NRF24L01芯片收到数据、或者发送完数据等等一些情况会产生下降沿中断;

CE:芯片的模式控制线,决定了芯片的工作状态。

本文中的硬件连接上,VCC和GND连接到3.3v供电;

CSN连接到PB5引脚;CE连接到PB6引脚;IRQ连接到PB4引脚(本文实际没有用到中断);

SPI的三根线,连接到PB13~15。

2)配置cubemx工程

SPI接口连接在PB13~15,使用SPI2,nrf24L01要求时钟速率设置为8M以下:

GPIO如下设置,IRQ设置为上拉输入,CSN和CE都设置为推挽输出:

设置好后,生成keil工程。

3)基本通信功能的代码实现

首先是硬件初始化函数,由于cubemx生成的工程中,spi接口,GPIO口都已经帮我们设置好了,我们只需要设置于nrf24L01相关的硬件即可:

所有,初始化其实就是设置CSN和CE的初始电平:

相关的宏定义如下:

接下来,封装SPI的读写函数。

由于HAL库提供了几个spi的读写函数,我们可以直接拿来封装一下,就可以使用了。

一个字节SPI读写函数,调用了HAL库函数HAL_SPI_TransmitReceive函数来实现:

读写寄存器函数,先写寄存器地址,然后读/写数据:

读写多个字节,调用了HAL库函数HAL_SPI_Transmit和HAL_SPI_Receive来实现,实际上,使用已封装好的函数nRF24_SPI_Send_Byte多次循环调用也是可以的:

到这里SPI的读写函数就已经封装完了,接下来,可以利用它们来配置和读取nrf24L01的寄存器。

检查nrf24L01是否通信正常,主要思想是,往TX_ADDR地址寄存器中写入了5个数,然后再读出来,对比是否一样,一样则认为通信成功:

在实现基础的无线通信时,我们使用一个节点作为发送方,一个节点作为接收方;发送方和接收方的配置、程序都不同。

先实现发送方,在配置发送状态时,一般需要配置以下几个寄存器:

a)设置tx地址;寄存器TX_ADDR

b)设置rx地址;RX_ADDR_P0,这个地址用于收ack

c)使能自动应答;EN_AA

d)使能通道0的接收地址;EN_RXADDR

e)配置自动重发次数;SETUP_RETR

f)设置通信频率;RF_CH

g)设置通信速率、增益等;RF_SETUP

h)设置通道0有效数据宽度;Rx_Pw_P0

i)设置为tx状态;CONFIG

其中b、c、d、e、h几个步骤的寄存器和自动应答相关,如果不需要,可以不设置,那么接收方就不会自动回复ack。

而如果设置了,接收方收到数据会回复一个ack,如果发送方未收到ack则会重复发送数据包,直到设置的最大次数。

这里我们给出的代码是设置自动应答的,具体实现如下,有详细注释:

其中要注意的是,如果需要自动应答,则发送方的接收地址0(RX_ADDR_P0)需要设置为与发送地址一致,因为发送方是从地址0来接收ack的,如果不一致会收不到ack。(代码中都设置为INIT_ADDR0)

发送数据的函数实现如下。

向WR_TX_PLOAD寄存器写入要发送的数据,最大32个,然后,拉高CE,130us后就可以启动发送了;如果设置了自动回复,可以回读状态,查看是否发送成功:

再实现接收方:

在配置接收状态时,一般需要配置以下几个寄存器:

a)设置rx地址;RX_ADDR_P0,必须与发送方的发送地址一致,否则收不到

b)使能自动应答;EN_AA

c)使能通道0的接收地址;EN_RXADDR

d)设置通信频率;RF_CH,必须与发送方的一致

e)设置通道0的有效数据宽度;Rx_Pw_P0,最大32

h)配置速率、增益等;RF_SETUP,速率等信息必须与发送方的一致

i)设置为rx状态;CONFIG

接收数据的函数实现如下,就是查询是否有接收中断标志,如果有,则读取接收的数据:

实现完上述函数,nrf24L01的配置就都完成了。接下来可以编写两个测试程序进行测试。

4)基本通信功能的测试

我们在发送端,编写如下发送函数:

先初始化,然后设置为发送模式,再在主循环中每隔1s发送一帧数据。每1s,tmp_buf[31]计数标志加1以查看数据变化;每次收到ack回复,则tmp_buf[30]加1:

在接收端,我们如下实现:

不断查询是否接收到数据,如果接收到,则打印接收到的数据:

测试时,将两个程序分别下载到接收端和发送端,使接收端先上电、发送方后上电,可以看到接收方打印的数据如下:

可以看到第31个数也在自增,说明发送方每次发送数据后,接收方都有成功回复ack。

5)一对多通信

上面的例子中,发送端和接收端是通过把地址0设置为相同的一个地址,实现发送和接收的,而实际上,nrf24L01有6个通道,可以设置不同的地址,依据地址的不同,可以实现1对多的通信。

如下编写程序:

发送端修改发送和接收ack的地址为INIT_ADDR2

接收端设置通道2的地址为INIT_ADDR2,同时修改设置通道2的自动应答、接收地址、宽度:

这里注意,通道2~5只能有1字节与通道1不同。设置通道2~5的地址时,要先设置通道1,之后再设置不同的那1个字节。

这样,发送端修改地址为INIT_ADDR2,该地址与接收端的通道2地址匹配,那么,接收端就会从通道2中收到数据。

仍然使用上一节的测试程序,也可以测试成功。

需要实现一对多通信时,6个接收端可以把自己的6个通道设为不同地址,发送端修改不同地址向各接收端发送即可实现。

6)通过自动应答ack回复数据

nrf24L01的扩展型号nrf24L01+具备ack中带数据回复的功能,即在接收方自动回复ack时,可以同时携带一包数据返回给发送方,利用这个特性,可以实现高效的通信。

设置自动回复ack带数据包时,必须使用动态数据长度的功能(动态载荷)。

发送方如下设置:

与基础通信不同的主要是设置了动态载荷。

接收方如下设置:

也是需要设置动态载荷,另外使用哪个通道,则需要把该通道的自动应答、接收地址等都设为使能:

发送方要发数据时,与基本的发送方式不同之处在于:我们需要接收ack返回的数据,所以要先将接收fifo清空,误将以前的数据认为是本次收到的;在发送完成后,可以查询状态并接收数据;这个数据就是接收方通过ack返回的。

发送数据的核心部分代码如下:(完整的代码可以关注文末公众号获取)

接收方要接收数据时,与基本通信方式一样,都是查询状态,有数据则回读;当接收方有数据要通过ack返回给发送方时,需要在接收到数据130us之内将数据写入到WR_ACK_PAYLOAD(地址0xA8)中,这样在ack返回时就会将数据字段发给发送方。

可以按如下方式,向WR_ACK_PAYLOAD寄存器中写入要返回的数据:

注意ch通道,要和接收到数据的通道号一样。

测试时,在接收端,我们接收数据后,就调用此nRF24L01_Rx_AckPayload函数填充数据;

在发送端,先清空接收fifo,发送完数据后,我们可以查询是否有数据接收到,接收到的数据即是通过ack返回的数据。

7)调试经验

在调试无线模块的时候,由于无线信道本身会有干扰、信号质量差等因素,会比一般的模块更加困难;可以先确保寄存器的读写正常,再调试单一地址通信,再调试多个不同地址的通信。

2.4G频段是免费的频段,可能有其他的设备干扰,在调试时,可以短时间设置到2.5G的频段来进行测试,在极小的功率下调试应该不会对别人的付费频段产生影响。

市面上的无线模块质量良莠不齐,可以看到文章开始的图中,模块上有两个芯片,这是带了射频功放的,通信质量好一些;还有不带射频功放的模块,通信质量较差,丢包较多;另外有一些带外置天线的,通信质量更好一些;试验时建议至少选择有射频功放的。

好了,关于nrf24L01的相关内容就讲到这里了。

欢迎关注我的公众号,可留言“资料”获取所有源码和参考资料:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32+cubemx】0026 HAL库开发:NRF24L01无线2.4G通信模块的应用 的相关文章

  • UPDATE OPENDATASOURCE('SQLOLEDB','')的正确语法格式

    自己补充一下 update naika set xyhkr 61 dateadd Month 1 xyhkr syl 61 a syl b pssl b heti ywjyf 61 a ywjyf 43 39 43 39 43 b psyf
  • 教你玩转Linux—用户账号的管理

    导读用户账号的管理工作主要涉及到用户账号的添加 修改和删除 添加用户账号就是在系统中创建一个新账号 xff0c 然后为新账号分配用户号 用户组 主目录和登录Shell等资源 刚添加的账号是被锁定的 xff0c 无法使用 1 添加新的用户账号
  • 【CMAKE系列】cmake中CMakeLists.txt脚本的常用语法

    在不同的平台编译的时候 xff0c 会用到一些系统内置的变量 xff0c 比如操作系统名称 xff0c 版本号之类 xff1a CMAKE SYSTEM xff1a 系統全名 xff0c 如 Linux 2 4 22 xff0c FreeB
  • linux usb usbip驱动详解(一)

    在分析usbip驱动前 xff0c 我们先来学习一下usb总线在linux系统下的表示 我们知道在linux中 xff0c proc和 sys这个两个文件系统包含了很多有用的信息 xff0c 所以usb的信息自然也少不了利用它们来展示 1
  • linux usb usbip驱动详解(二)

    终于来到usbip驱动代码分析了 xff01 我们在做产品时 xff0c 通常是先讨论方案 制定协议 编码和测试 usbip的方案是行得通的 xff0c 它是从URB对象获取信息 xff0c 然后从tcp发送出去的 xff0c URB是li
  • linux usb usbip驱动详解(四)

    我们先讲解vhci hcd驱动 xff08 linux 4 20 14的usbip驱动 xff09 usb主机控制器驱动hcd学习心得 xff1a 可以阅读某款SOC的主机控制器驱动代码 xff0c 譬如TI的am3358芯片 xff0c
  • docker 启动 centos-7 xrpd server

    docker 启动 centos 7 xrpd server 效果预览 docker 启动 centos 7 xrpd server 连接容器 docker run dit name 61 xrdp p 10022 22 p 13389 3
  • 常见数据结构和算法 的图形界面可视化实现

    解压后 xff0c 运行里面的index html xff0c 推荐火狐浏览器下 针对某一数据结构 或 算法的实现 xff0c 有动态的界面演示 xff0c 并且有相应的代码 xff0c 对学习有很好的参考作用 http pan baidu
  • 再见,2012,你好,2013.

    其实这篇日志过年前 xff0c 已经写得差不多 xff0c 但是忘记发了 xff0c 现在补上 xff0c 现在应该还不是太晚吧 ps xff1a 想了一个很俗的标题 61 61 2012年 xff0c 是对我意义最不平凡的一年 这一年 x
  • 无人机—加速度计与光流数据融合

    加速度计与光流数据融合 无人机的定点定高飞行时实现目标识别追踪 xff0c 航点规划 xff0c 循迹巡线等下一个任务的基础 xff0c 稳定的定高定点飞行才能执行其他高级算法 在室内没有GPS的情况下 xff0c 要想实现这个目标 xff
  • 【转】C语言中 -> 是什么意思?

    gt 是一个整体 xff0c 它是用于指向结构体 C 43 43 中的class等含有子数据的指针用来取子数据 换种说法 xff0c 如果我们在C语言中定义了一个结构体 xff0c 然后申明一个指针指向这个结构体 xff0c 那么我们要用指
  • GIS开发学习推荐书目

    书名 作者 出版社 版次 GIS 基础 地理信息系统导论 US Kang tsung Chang xff1b 陈健飞 译 电子工业出版社 第七版 ArcGIS地理信息系统空间分析实验教程 汤国安 杨昕 科学出版社 第二版 编程 基础 C语言
  • SINS/GNSS组合导航:组合导航设计(卡尔曼滤波)

    SINS GNSS组合导航将SINS输出信息与GNSS信息进行组合 xff0c 状态量为 卡尔曼滤波原理参照卡尔曼滤波 xff08 KF xff09 与扩展卡尔曼滤波 xff08 EKF xff09 讲解与推导 xff0c 核心就是五个递推
  • VSLAM学习(一) 三维运动、相机模型、SLAM模型

    目录 VSLAM学习 一 三维运动 相机模型 SLAM模型 VSLAM学习 二 非线性优化 VSLAM学习 三 单目相机位姿估计 VSLAM学习 四 Bundle Adjustment 一 三维空间刚体运动 1 1 旋转矩阵 同一向量在不同
  • ssh远程提示“找不到匹配的keyexchange算法”解决方案

    20230216更新 xff1a xshell官网地址 xff1a https www xshell com zh free for home school 新的知识 xff1a 是因为openssh版本比自己的ssh工具如xshell4版
  • JAVA中的类和对象之this的详解

    系列文章目录 第一章 JAVA中的类和对象之this的详解 目录 前言 一 为什么要有this引用 二 this的三种用法 1 this 成员变量 2 this 成员方法 3 this 调用其它的构造方法 三 this的引用特性 前言 JA
  • 这么学,好玩,有趣,逗死了!(2017年系统规划与管理师上午综合知识试题试题解析(六))

    IT服务风险管理中 xff0c 对风险的识别是很重要的一项工作 识别方法中 xff0c 通常采用文档审查 信息收集技术 检查表 分析假设和图解技术 下面 xff08 xff09 选项不属于信息采集技术 xff08 51 xff09 A 德尔
  • 松滋历史(1)--松滋县建县历史考证

    刘鲋鮈总共4个儿子 xff1a 刘建德 刘梁 刘延年 刘度 长沙顷王刘鲋鮈的儿子刘梁 汉昭帝始元六年 xff08 公元前81年 xff09 xff0c 六月乙未封高城节侯 汉宣帝元康元年 xff08 公元前65年 xff09 xff0c 正
  • 松滋历史(2)--高成县为什么这么高光?

    东汉开国皇帝刘秀 xff0c 是长沙定王刘发第5代世孙 也就是说 xff0c 东汉开国皇帝刘秀爷爷的爷爷与高城侯刘梁 xff08 高城县 xff08 松滋县前身 xff09 创始人 xff09 的爷爷是亲兄弟 在哪个特别讲血统的年代 xff
  • 为什么要报考系统架构设计师考试

    为什么要报考系统架构师考试 最近一年多 xff0c 很多朋友来信 xff0c 问我什么要报考系统架构设计师考试 为什么参加这个考试 xff0c 这个考试有用吗 xff1f 对自己的职业会带来什么好处 xff1f 我想有以下几个方面 xff1

随机推荐

  • Unity中使用暴风魔镜进行VR游戏开发

    64 VR简介 虚拟现实VR Virtual Reality 和增强现实AR Argument Reality 的概念其实在很多年前就已经出现 xff0c 2015年下半年开始变得火热 xff0c 在各大媒体圈子中频繁出现 xff0c 而今
  • 我的2013

    我的 2013 一 工作 分为 2 个阶段 1 上半年 岗位 xff1a 系统架构师 心得体会 xff1a 1 多跟领导 团队 公司其他部门 客户 协助第三方多沟通 xff1b 2 快速理顺业务逻辑关系 xff0c 弄清楚业务流程 xff0
  • 2014年24段魔尺变三叶花视频教程

    2014年24段魔尺变三叶花视频教程 xff08 升级版 xff09 偶是真心喜欢24段魔尺制作的三叶花 xff0c 那是相当漂亮 xff0c 体现了几何美 xff0c 对称美 xff0c 空间美 xff0c 色彩美 xff0c 见下图 三
  • 24段魔尺,可以折出哪些精美图案

    24段魔尺 xff0c 可以折出哪些精美图案 24段魔尺 xff0c 究竟可以叠成哪些精美图案 xff1f 球 小乌龟 十字架 三叶花 三角形 牛魔王 音符是大家比较熟悉的 偶对这个问题 xff0c 比较感兴趣 先将网络上流传的24段魔尺折
  • 软考证到底有多大个鸟用?

    软考证到底有多大个鸟用 xff1f 小虎以信息系统项目管理师高级证书为例 xff0c 来说说这个证 xff0c 到底有什么用 xff1f 1 求职简历上 xff0c 可以浓彩重抹一笔 xff0c 好好吹嘘下自己 xff0c 是IT高级人才
  • 明朝开国第一重臣李善长长子李祺之长子李芳后裔在松滋

    明朝开国第一重臣李善长长子李祺之长子李芳后裔在松滋 李善长 xff0c 何许人也 肩比汉代丞相萧何 xff1b 功臣里排位第一 xff0c 比刘伯温 徐达 汤和 常遇春 蓝玉 李文忠地位高 xff1b 太师 xff0c 左丞相 xff0c
  • 程序员很少上《非诚勿扰》电视节目相亲之分析

    程序员很少上 非诚勿扰 电视节目相亲之分析 偶观看有线电视32 频道的江苏卫视 非诚勿扰 电视相亲节目 xff0c 半年有余 问题 为什么程序员很少上 非诚勿扰 节目进行相亲呢 xff1f 难道是程序员当中 xff0c 很少有大龄的剩男剩女
  • 2018年CSDN博客排名第一名,花落谁家?

    截止2018年10月9日 https blog csdn net stpeace 小虎问题 xff1a 通过搜索引擎例如 xff1a 百度 搜狗 Bing等 如何快速搜索 xff0c 定位谁是CSDN博客的第几名 xff1f 想知道谁CSD
  • 客家刘开七、刘广传刘氏七律族诗赏析V2.0

    七律 刘氏族诗 南宋 刘广传 骏马骑行各出疆 xff0c 任从随地立纲常 年深外境皆吾境 xff0c 日久他乡即故乡 早晚勿忘亲命语 xff0c 晨昏须顾祖炉香 苍天佑我卯金氏 xff0c 八七男儿共炽昌 一 平仄性赏析 除了 卯 字 xf
  • 无限制递归

    1006 无限制检查上层数目 无限制检查上层法则 最后跳出循环 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 1115 问题的解决在于把规模条理化 然后选取较小的规模 xf
  • 【模电】0009 方波和三角波产生电路(RC和比较器实现)

    本节我们来分析几个波形产生电路 xff0c 包括方波 三角波等波形产生电路 这类电路一般由比较器 电阻 电容等组成 我们先来看看比较器的特性 1 xff09 比较器的特性 比较器的原理图符号如下 xff1a 与运放的画法是一样的 xff0c
  • Ubuntu系统安装、配置与美化(Ubuntu20.04)

    阅读指南 目的 本文的写作目的在于帮助完全零基础的小白不理解原理而可以无脑安装Linux系统 xff0c 同时也是为自己进行的一个整理 xff0c 相较于网上大多数的教程 xff0c 本教程将一些内容进行了整合与整理 xff0c 加之本人在
  • 【模电】0010 正弦波产生电路(RC正弦波振荡电路)

    上一节我们分析了使用比较器产生方波和正弦波的电路 xff0c 其本质上是在电容充放电的一段延时后 xff0c 利用比较器产生电平翻转 而本节分析的正弦波产生电路 xff0c 产生的原理不同 1 xff09 振荡产生的原理 正弦波产生电路 x
  • 一种锂电池充放电及外部供电自动切换的电路

    介绍一种单节锂电池充放电一体的电路 该电路在外接电源时 xff0c 使用外接电源供电 xff0c 并且为锂电池充电 xff1b 在无外接电源时 xff0c 系统自动切换为锂电池供电 电路的原理如下图 xff1a 1 xff09 图中VBUS
  • 【STM32+cubemx】0008 HAL库开发:ADC的四种用法:轮询、中断、DMA、定时器触发

    ADC即模数转换器 xff0c 能把模拟量 xff08 电压 xff09 转换为数字量 这一节我们讲讲stm32的ADC用法 xff0c stm32自带的ADC有四种用法 xff1a 轮询 中断 DMA 定时器触发 1 xff09 ADC轮
  • 【STM32+cubemx】0011 HAL库开发:I2C总线访问加速度传感器ADXL345

    本节我们介绍I2C总线 xff0c 并使用stm32的I2C总线来访问加速度传感器ADXL345 1 xff09 I2C基础知识 I2C总线通信比较适合设备内部各芯片间的通信 xff0c 它只需要两根信号线 I2C可以挂载多个主机和从机 x
  • 【STM32+cubemx】0013 HAL库开发:SPI总线访问气压计BMP280/BME280

    本节我们介绍stm32的SPI总线接口 xff0c 并使用SPI接口来访问气压计BMP280 1 xff09 SPI基础知识 SPI xff08 Serial Peripheral Interface xff09 串行外围设备接口 xff0
  • 【STM32+cubemx】0017 HAL库开发:usb HID鼠标设备实现

    Cubemx可以生成多种usb设备的初始化代码 xff0c 本节我们就使用它来生成一个usb HID鼠标的工程 xff0c 在开发板上运行以后 xff0c 可以模拟usb鼠标的功能 1 xff09 生成USB HID工程 仍然使用串口工程
  • 【STM32+cubemx】0018 HAL库开发:自定义usb HID设备实现

    前面几节我们使用Cubemx生成了usb的两个使用例子 xff08 虚拟串口 HID鼠标 xff09 xff0c 本节我们进一步学习 xff0c 如何用生成自定义的HID设备 本节的例子在开发板上运行以后 xff0c 可以通过usb HID
  • 【STM32+cubemx】0026 HAL库开发:NRF24L01无线2.4G通信模块的应用

    NRF24L01是NORDIC公司生产的一款无线通信通信芯片 xff0c 可以工作在免费开放的2 4GHz频段 xff1b 通信速率可以达到最高2Mbps xff1b MUC可以使用SPI接口与它交互 本节我们就来使用stm32驱动NRF2