无线收发模块——NRF24L01

2023-05-16

1、什么是nRF24L01

nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。有着极低的电流消耗。

nRF24L01与5V单片机的连接通过SPI接口进行通讯,输出功率频道选择和协议的设置可以通过SPI 接口进行设置,几乎可以连接到各种单片机芯片,并完成无线数据传送工作。

在这里插入图片描述

2、接口电路

在这里插入图片描述
引脚说明

通过以下六个引脚,便可实现模块的所有功能:
(1)MOSI:主器件数据输出,从器件数据输入
(2)MISO:主器件数据输入,从器件数据输出
(3)SCLK:时钟信号,由主器件产生
(4) CSN :从器件使能信号(片选线)
(5)CE:芯片使能,使能器件的发送模式或者接收模式。高电平有效,在发送和接收过程中都要将这个引脚拉高,
(6)IRQ:中断信号线,中断输出。低电平有效,中断时变为低电平,在以下三种情况变低:Tx FIFO 发完并且收到ACK(使能ACK情况下)、Rx FIFO收到数据、达到最大重发次数。
(7)VCC:电压范围1.9V~3.6V,超过3.6V将会烧毁模块。一般电压3.3V左右。除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口直接相连,无需电平转换。

通过 SPI 接口,可激活在数据寄存器 FIFO 中的数据,或者通过 SPI 命令访问寄存器。
在待机或掉电模式下,单片机通过 SPI 接口配置模块;
在发射或接收模式下,单片机通过 SPI 接口接收或发射数据。

3、工作模式:

工作模式由 CE 和 PWR_UP (CONFIG寄存器第1位)、 PRIM_RX(CONFIG寄存器第0位) 两寄存器共同操纵:
在这里插入图片描述
也可以理解为NRF2401有工作模式有四种:
收发模式,配置模式,空闲模式,关机模式

收发模式(三种)
Enhanced ShockBurstTM收发模式
ShockBurstTM收发模式
直接收发模式
(只有Enhanced ShockBurstTM收发模式支持自动ACK和自动重发)

Enhanced ShockBurstTM收发模式(常用)
NRF24L01自动处理字头和CRC校验码。在接收数据时,自动把字头和CRC校验码移去。在发送数据时,自动加上字头和CRC校验码。
ShockBurstTM收发模式
发送方要求终端设备在接收到数据后有应答信号,以便发送方检测有无数据丢失,一旦丢失则重发数据。
直接收发模式
和传统的射频器件一样。数据必须是在传输频率为1Mbps、250kbps 或者低频状态进行设定,以保证接收机能探测到信号。


在接收模式下,最多可以接收6路不同的数据。每一个数据通道使用不同的地址,但是共用相同的频道。也就是说6 个不同的NRF24L01设置为发送模式后可以与同一个设置为接收模式的NRF24L01 进行通讯,而设置为接收模式的NRF24L01可以对这6个发射端进行识别。

数据通道0是唯一的一个可以配置为40位自身地址的数据通道;而数据通道1~5 都为8位自身地址和32位公用地址(由通道1设置)。所有的数据通道都可以设置为Enhanced ShockBurst 模式。

在接收端,确认收到数据后记录地址,并以此地址为目标地址发送应答信号。在发送端,通道0被用作接收应答信号,因此通道0的接收地址要与发送地址端地址相等,以确保接收到正确的应答信号。


配置模式 15 字节的配置字会在配置模式时下载到nRF2401 中,CE为0才能配置。
空闲模式(睡眠/待机模式):用来减小平均电流的损耗,在该模式下,晶体振荡器处于部分工作状态,电流损耗由晶体振荡器频率决定。在待机模式期间,寄存器配置字内容保持不变。
掉电模式:nRF20L01 各功能关闭,保持电流消耗最小。该模式下,nRF24L01 停止工作,当设备达不到最小的电流损耗或最大电量枯竭时,设备就会进入掉电模式。

4、发送

Enhanced ShockBurstTM发送流程
1.把地址和要发送的数据按时序送入NRF24L01;
2.配置CONFIG寄存器,使之进入发送模式;
3.微控制器把CE置高(至少10us),激发Enhanced ShockBurstTM发射;
4. 发射完成,NRF24L01进入空闲状态。

初始化NRF24L01到TX模式
1) CE置低
2) 写Tx节点的地址
3) 写Rx节点的地址,使能自动应答
4) 使能通道x的自动应答
5) 使能通道x的接收地址
6) 设置自动重发间隔时间和最大自动重发次数
7) 设置RF通道
8) 配置TX发射参数(低噪放大器增益、发射功率、无线速率)
9) 配置基本工作模式的参数
10)CE拉高,进入发送模式,注意CE要拉高一段时间才进入发送模式

/**
  * @brief  配置发送模式
  * @param  无
  * @retval 无
  */
void NRF_TX_Mode(void)
{  
	NRF_CE_LOW();		

   SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);    //写TX节点地址 

   SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //设置RX节点地址,主要为了使能ACK   

   SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答    

   SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址  

   SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次

   SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);       //设置RF通道为CHANAL

   SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x07);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
	
   SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发射模式,开启所有中断

/*CE拉高,进入发送模式*/	
  NRF_CE_HIGH();
    Delay(0xffff); //CE要拉高一段时间才进入发送模式
}

5、接收

Enhanced ShockBurstTM接收流程
1.配置接收地址和要接收的数据包大小;
2.配置CONFIG寄存器,使之进入接收模式,把CE置高;
3. 130us后,NRF24LO1进入监视状态,等待数据包的到来;
4.当接收到正确的数据包(正确的地址和CRC校验码),NRF2401自动把字头、地址和CRC校验位移去;
5.NRF24LO1通过把STATUS寄存器的RX_DR置位(STATUS一般引起微控制器中断)通知微控制器;
6.微控制器把数据从FIFO读出(0X61指令);
7.所有数据读取完毕后,可以清除STATUS寄存器。进入四种主要的模式之—。

初始化NRF24L01到RX模式
1) CE置低
2)写RX节点地址
3)使能通道x的自动应答
4)使能通道0的接收地址
5)设置RF通信频率
6)选择通道x的有效数据宽度
7)设置TX发射参数
8)配置基本工作模式的参数
9)CE拉高,进入接收模式

/**
  * @brief  配置并进入接收模式
  * @param  无
  * @retval 无
  */
void NRF_RX_Mode(void)

{
	NRF_CE_LOW();	

   SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址

   SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);    //使能通道0的自动应答    

   SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址    

   SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);      //设置RF通信频率    

   SPI_NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度      

   SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x07); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   

   SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG, 0x0f);  //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 

/*CE拉高,进入接收模式*/	
  NRF_CE_HIGH();

}

此外,还应有系统的初始化,主要有GPIO初始化,SPI初始化,NRF24L01中断初始化。
在GPIO初始化中,需要注意各引脚的工作模式:
SPI时钟,设置为复用推挽输出
SPI输出引脚(SOMI),设置为复用推挽输出
SPI输入引脚(SOMO),设置为悬浮输入
CS、CE引脚,使用软件控制,所以直接设置成推挽输出


SPI指令
所有的 SPI 指令均在当 CSN 由低到高开始跳变时执行;从 MOSI 写命令的同时, MISO实时返回 24L01 的状态值; SPI 指令由命令字节和数据字节两部分组成。
在这里插入图片描述
在这里插入图片描述

寄存器内容及说明
在写寄存器之前,一定要进入待机模式或掉电模式。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

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

无线收发模块——NRF24L01 的相关文章

  • Dropout 丢弃函数的使用

    Class span class token class name USeDropout span span class token punctuation span nn span class token punctuation span
  • libtorch-resnet18

    与大家分享一下自己在学习使用libtorch搭建神经网络时学到的一些心得和例子 xff0c 记录下来供大家参考 首先我们要参考着pytorch版的resnet来搭建 xff0c 这样我们可以省去不必要的麻烦 xff0c 上代码 xff1a
  • Yolov5 -libtorch部署

    将python训练好的网络模型转为可以再libtorch上走的pth模型 xff0c 转换代码如下 xff1a 可以直接赋值粘贴 import argparse import sys import time sys span class t
  • c++ 关于error LINK2005: XXXX已经在 .obj 中定义“的问题

    代码很多的时候出现这个问题很棘手 xff0c 小号大量时间来排查问题 xff0c 所以一边学习一边记录学习中出现的问题 原因 xff1a 是因为编程习惯的问题 xff0c 直接在头文件 h中直接定义了变量或者函数 xff0c 然后A cpp
  • 使用vs2019将libtorch或者网络打包成dll

    最近在搞一个程序 xff0c 需要把libtorch打包成dll xff0c 让别人使用 xff0c 在网上找了好久都没只有找到合适的答案 xff0c 最后在一个博主大哥那里找到了 xff0c 很是感激这位大哥与我们分享自己的经验 xff0
  • 【无标题】 libtorch C++ vs2017 debug模式可以正确加载模型,release模式错误

    转发 xff1a libtorch C 43 43 vs2017 debug模式可以正确加载模型 xff0c release模式错误 https blog csdn net weixin 43862688 article details 1
  • targetcli

    Linux IO LIO Target is an open source implementation of the SCSI target thathas become the standard one included in the
  • libtorch-加载预训练模型出现No such serialized submodule: ‘xxx‘

    今天在用libtorch训练得时候 xff0c 想用预训练模型加速训练 xff0c 居然报错 xff0c 以为是模型得问题 xff0c 然后重新训练了一个模型 xff0c 作为预训练模型 xff0c 还是报错 xff0c 一时找不到原因 x

随机推荐

  • QT学习之路-记事本

    1 在创建记事本之前先明白有哪些功能 xff1a 先创建一个菜单栏 xff0c 菜单栏是用来装各种功能的一个地方如上图所示 xff0c 文件 编辑所在的地方为菜单栏 xff0c span class token comment 创建菜单栏
  • yolov5-pytorch导出模型问题

    在官网提供的代码中 xff0c 很方便的可以把pytorch的模型转为libtorch的模型 xff0c 但是在转换前要明白自己转换后的模型是仅仅为了推理部署 xff0c 还是说用转换后的模型作为libtorch的预训练模型继续使用呢 xf
  • libtorch与pytorch索引张量值操作([:]与index)

    由于我最近在学习libtorch相关的东西 xff0c 所以就记录一下使用libtorch与pytorch一样对张量操作的语法 下面是我转载的一位大佬的文章 xff0c 这里只做技术探讨 xff0c 不做其他用途 想要学习的可以参考一下大佬
  • QT 报 QMetaObject::connectSlotsByName: No matching signal for on_btn_clicked()

    在QT中 xff0c 自己编写命名信号和槽的时候 xff0c 在用connect的时候报出以下错误 xff1a QMetaObject span class token double colon punctuation span conne
  • CRNN-模型转换问题Missing Errorin loading state_dict for CRNN

    在将CRNN pytorch模型转为libtorch模型的时候出现报错情况 xff0c Missing Errorin loading state dict span class token keyword for span CRNN 96
  • CRNN-libtorch模型推理的时候报错std:runtime_error

    使用libtorch模型推理的时候出现报错std runtime error 这里报错的情况一般是数据不同步的问题 xff0c 也就是说我们的模型是在gpu上 xff0c 而数据是在cpu上 xff0c 那么要做的一件事就是检查forwar
  • 数据集txt格式划分为多个txt文件夹

    简单记录一下数据标签txt格式划分为多个文件 xff0c 通常我们标注号的标签 xff0c 都是在一个txt文件夹中 xff0c 我们训练的时候需要把txt中的标签按照一定的比例划分为多个文件 xff0c 这里贴出划分为三个文件的代码 xf
  • 租用终端训练网络遇到的一些坑

    最近由于电脑配置和经济的问题 xff0c 想训练模型 xff0c 无奈只能选择在平台上训练了 xff0c 我使用的是AutoDL这个平台 xff0c 感觉还行 xff0c 还是挺划算 感兴趣或者需要的老铁可以点击蓝色字体进去尝试一下 接下来
  • CRNN-pytorch模型转libtorch模型踩坑记录

    这段时间一直在做CRNN文字识别的问题 xff0c 从pytorch中训练好的模型然后转到libtorch中去 xff0c 但是CRNN提供的代码没有转libtorch模型的部分 xff0c 于是就在网上到处乱找 xff0c 其中找到了这篇
  • 如何升级gcc版本

    下面将整个过程更新的过程写下来 xff0c 希望对有需要的人提供一些帮助 首先需要准备需要材料 xff1a gcc4 4 2版需要安装gmp4 2 0 43 和mpfr2 3 0 43 xff0c 到GMP的网站 xff08 http gm
  • 召回率与精确率的理解

    写在前面 识别精度主要由召回率 xff08 recall xff09 和精确率 xff08 precision xff09 两个指标决定 xff0c 在训练结束时可以通过re pre曲线来表示模型的准确度 xff0c 也可以根据二者之间的关
  • vs常见的错误集锦-error C4996: ‘wcstombs‘: This function or variable may be unsafe

    问题所在 xff1a 缺少宏定义 在使用wcstombs这个函数时遇到了题目所说的这个情况 xff0c 查找得知是缺少宏定义 xff0c 按照网上查找的问题 xff0c 在vs的配置中添加宏定义就行了 xff1b 在以下的位置 xff1a
  • Keil左侧Function列表无法显示(已解决)

    左侧的Functions框框会显示所有的库函数 xff0c 方便查找 查找的来源是工程所在的目录 如果把目录放得太深 xff0c 就会导致扫描不出来 在工程文件里面并列新建一个LIB文件夹用来存放 xff0c 把Inc和Src放进去 打开F
  • Linux服务器配置ulimit的常用参数介绍

    最近在小鸟云配置了一个Linux服务器 xff0c 实例是debian 7 5 系统 xff0c 在进行系统优化的过程中遇到一些有关Ulimit的事项 xff0c 整理了相关的参数介绍和配置介绍 xff0c 有需要可以简单看看 Ulimit
  • 【视觉检测C++接口实现】vs2019使用动态链接库yolo_cpp_dll调用yolov3

    目录 0 前言 1 准备工作 1 1 yolo cpp dll dll和yolo cpp dll lib的获取 1 2 pthreadGC2 dll和pthreadVC2 dll的获取 1 3 yolo v2 class hpp的获取 1
  • 【jetson nano】在ubuntu18.04下,c++调用链接库实现yolov3

    目录 0 前言 1 下载安装opencv 3 4 0 1 1 配置相应的以来库 1 2 下载opencv 3 4 0 xff08 源码 xff09 1 3 编译 xff08 时间较长 xff09 1 4 安装 1 5 配置opencv路径
  • 51单片机寄存器篇

    以下依次为IE IP TMOD TCON SCON寄存器结构 xff1a B7B6B5B4B3B2B1B0EA ET2ESET1EX1ET0EX0 B7B6B5B4B3B2B1B0 PT2PSPT1PX1PT0PX0 B7B6B5B4B3B
  • 单片机蓝桥杯——串口通信

    1 什么是串行 并行 单工 全双工 半双工 同步 异步 通讯的方式分类 xff1a 并行通信 串行通信 并行通信 xff1a 数据的各位同时在多根数据线上发送或接收 串行通信 xff1a 数据的各位在同一根数据线上逐位发送和接收7 并行通信
  • 串口、UART、USART、COM、USB、TTL、RS232、RS485、RS422简介

    串口 COM口 USB口是指的物理接口形式 xff08 硬件 xff09 xff1b TTL RS 232 RS 485 USB电平是指的电平标准 xff08 电信号 xff09 串口 UART口 USART口 COM口 USB口 xff0
  • 无线收发模块——NRF24L01

    1 什么是nRF24L01 nRF24L01是由NORDIC生产的工作在2 4GHz 2 5GHz的ISM 频段的单片无线收发器芯片 有着极低的电流消耗 nRF24L01与5V单片机的连接通过SPI接口进行通讯 xff0c 输出功率频道选择