STM32使用NRF2401进行数据传送
NRF2401是一款由Nordic Semiconductor公司生产的单片射频收发芯片,以下是关于它的详细介绍:

一、主要特点
- 工作频段:NRF2401工作于2.4~2.5GHz的ISM(工业、科学和医疗)频段,该频段无需申请即可使用,广泛应用于各种无线通信设备。
- 内置功能模块:芯片内置了频率合成器、功率放大器、晶体振荡器和调制器等功能模块,使得其能够独立完成射频信号的收发处理。
- 低功耗设计:NRF2401具有极低的能耗,在-5dBm的功率发射时,工作电流仅为10.5mA;在接收模式下,工作电流为18mA。此外,它还支持多种低功率工作模式,进一步延长了电池使用寿命。
- 多通道通信:NRF2401支持多达125个数据通道,通道切换时间小于200微秒,满足多点通讯和调频需求。
- 高速数据传输:数据传输速率可达250Kbps或1Mbps(某些版本可能支持更高的速率,如2Mbps),适用于需要快速数据传输的应用场景。
- 自动重传和CRC校验:NRF2401支持自动检测和重发丢失的数据包,以及硬件CRC校验功能,提高了数据传输的可靠性和稳定性。
二、工作模式
NRF2401具有多种工作模式,包括收发模式、配置模式、空闲模式和关机模式。这些模式由PWR_UP、CE和CS三个引脚控制。

三、数据控制协议

四、代码参考
完整代码下载链接:https://download.csdn.net/download/qq_26043945/90412833
uint8_t SPI_RW(uint8_t byte){ // 用于存储接收到的数据uint8_t receivedData;// 发送缓冲区,指向要发送的数据const uint8_t *txBuf = &byte; // 接收缓冲区,指向用于存储接收数据的变量uint8_t *rxBuf = &receivedData; // 使用HAL库函数进行SPI通信,发送和接收数据HAL_StatusTypeDef status = HAL_SPI_TransmitReceive(&hspi2, txBuf, rxBuf, 1, 100);// 检查通信状态,这里简单处理为不检查(实际应用中应该检查)// if (status != HAL_OK) {// // 处理错误情况// }// 返回接收到的数据return receivedData;}/********************************************************
函数功能:NRF2401引脚初始化
入口参数:无
返回 值:无
*********************************************************/
void NRF2401_Init(void)
{//将CE(Chip Enable)引脚置低电平,禁用NRF2401芯片NRF_CE_0;//将CSN(Chip Select Not)引脚置高电平,禁用SPI通信NRF_CS_1;//将IRQ(Interrupt Request)引脚置高电平,准备接收中断信号NRF_IRQ_1;
}/********************************************************
函数功能:写寄存器的值(单字节)
入口参数:reg:寄存器映射地址(格式:WRITE__REG|reg)value:寄存器的值
返回 值:状态寄存器的值
*********************************************************/
uint8_t NRF2401_Write_Reg(uint8_t reg, uint8_t value)
{uint8_t status;//将CSN(Chip Select Not)引脚置低电平,启用SPI通信NRF_CS_0;status = SPI_RW(reg); SPI_RW(value);//将CSN(Chip Select Not)引脚置高电平,禁用SPI通信NRF_CS_1;return(status);
}/********************************************************
函数功能:写寄存器的值(多字节)
入口参数:reg:寄存器映射地址(格式:WRITE__REG|reg)pBuf:写数据首地址bytes:写数据字节数
返回 值:状态寄存器的值
*********************************************************/
uint8_t NRF2401_Write_Buf(uint8_t reg, const uint8_t *pBuf, uint8_t bytes)
{uint8_t status,byte_ctr;//将CSN(Chip Select Not)引脚置低电平,启用SPI通信NRF_CS_0;status = SPI_RW(reg); for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) SPI_RW(*pBuf++); //将CSN(Chip Select Not)引脚置高电平,禁用SPI通信NRF_CS_1;return(status);
} /********************************************************
函数功能:读取寄存器的值(单字节)
入口参数:reg:寄存器映射地址(格式:READ_REG|reg)
返回 值:寄存器值
*********************************************************/
uint8_t NRF2401_Read_Reg(uint8_t reg)
{uint8_t value;//将CSN(Chip Select Not)引脚置低电平,启用SPI通信NRF_CS_0;SPI_RW(reg); value = SPI_RW(0);//将CSN(Chip Select Not)引脚置高电平,禁用SPI通信NRF_CS_1;return(value);
}/********************************************************
函数功能:读取寄存器的值(多字节)
入口参数:reg:寄存器映射地址(READ_REG|reg)pBuf:接收缓冲区的首地址bytes:读取字节数
返回 值:状态寄存器的值
*********************************************************/
uint8_t NRF2401_Read_Buf(uint8_t reg, uint8_t *pBuf, uint8_t bytes)
{uint8_t status,byte_ctr;//将CSN(Chip Select Not)引脚置低电平,启用SPI通信NRF_CS_0;status = SPI_RW(reg); for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)pBuf[byte_ctr] = SPI_RW(0); //读取数据,低字节在前//将CSN(Chip Select Not)引脚置高电平,禁用SPI通信NRF_CS_1;return(status);
}/********************************************************
函数功能:NRF2401接收模式初始化
入口参数:无
返回 值:无
*********************************************************/
void NRF2401_RX_Mode(void)
{NRF_CE_0;NRF2401_Write_Buf(WRITE__REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址NRF2401_Write_Reg(WRITE__REG + EN_AA, 0x01); // 使能接收通道0自动应答NRF2401_Write_Reg(WRITE__REG + EN_RXADDR, 0x01); // 使能接收通道0NRF2401_Write_Reg(WRITE__REG + RF_CH, 40); // 选择射频通道0x40NRF2401_Write_Reg(WRITE__REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度NRF2401_Write_Reg(WRITE__REG + RF_SETUP, 0x0f); // 数据传输率2Mbps,发射功率7dBmNRF2401_Write_Reg(WRITE__REG + CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式NRF2401_Write_Reg(WRITE__REG + STATUS, 0xff); //清除所有的中断标志位NRF_CE_1; // 拉高CE启动接收设备
} /********************************************************
函数功能:NRF2401发送模式初始化
入口参数:无
返回 值:无
*********************************************************/
void NRF2401_TX_Mode(void)
{NRF_CE_0;NRF2401_Write_Buf(WRITE__REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址NRF2401_Write_Buf(WRITE__REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同NRF2401_Write_Reg(WRITE__REG + EN_AA, 0x01); // 使能接收通道0自动应答NRF2401_Write_Reg(WRITE__REG + EN_RXADDR, 0x01); // 使能接收通道0NRF2401_Write_Reg(WRITE__REG + SETUP_RETR, 0x0a); // 自动重发延时等待250us+86us,自动重发10次NRF2401_Write_Reg(WRITE__REG + RF_CH, 40); // 选择射频通道0x40NRF2401_Write_Reg(WRITE__REG + RF_SETUP, 0x0f); // 数据传输率2Mbps,发射功率7dBmNRF2401_Write_Reg(WRITE__REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电NRF_CE_1;
}
五、应用领域
NRF2401适用于多种无线通信的场合,如无线数据传输系统、无线鼠标、遥控开锁、遥控玩具等。其低功耗、高数据速率和多频道通信的特点使其成为物联网、智能家居和穿戴式设备等领域中备受推崇的无线解决方案之一。
相关文章:
STM32使用NRF2401进行数据传送
NRF2401是一款由Nordic Semiconductor公司生产的单片射频收发芯片,以下是关于它的详细介绍: 一、主要特点 工作频段:NRF2401工作于2.4~2.5GHz的ISM(工业、科学和医疗)频段,该频段无需申请即可使用…...
Fetch API 与 XMLHttpRequest:深入剖析异步请求的利器
Hi,我是布兰妮甜 !在现代 Web 开发中,异步通信是实现动态和交互式用户体验的基石。XMLHttpRequest (XHR) 作为老牌劲旅,曾一度统治着这一领域。然而,随着 Fetch API 的横空出世,开发者们迎来了一个更现代、…...
如何生成traceid以及可视化展示
根据你的需求,以下是一些可以生成唯一 traceId 并用于分布式链路追踪的工具和项目,这些项目支持生成唯一的 traceId,并将其用于日志记录和分布式追踪: 1. OpenTelemetry OpenTelemetry 是一个开源的观测框架,支持生成…...
【LeetCode541】反转字符串
题目描述 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前…...
DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由
为了让大家实现 DeepSeek 使用自由,今天分享 10 个畅用 DeepSeek 的平台。 一、官方满血版:DeepSeek官网与APP 首推,肯定是 DeepSeek 的官网和 APP,可以使用满血版 R1 和 V3 模型,以及联网功能。 网址: htt…...
C++:pthread线程分离和线程属性
在 C 的多线程编程中,pthread 库提供了强大的功能来管理线程。其中,线程分离和线程属性是两个重要的概念,它们对于优化线程的行为和资源管理有着关键作用。 线程分离 1.1 什么是线程分离 在 pthread 库中,线程有两种状态&#…...
Orange 开源项目 - 集成阿里云大模型
1 阿里云的大模型服务平台百炼 阿里云的大模型服务平台百炼是一站式的大模型开发及应用构建平台。不论是开发者还是业务人员,都能深入参与大模型应用的设计和构建。您可以通过简单的界面操作,在5分钟内开发出一款大模型应用,或在几小时内训练…...
Docker 搭建 MySQL 数据库
Docker 搭建 MySQL 数据库 前言一、准备工作二、设置 MySQL 容器的目录结构三、配置 MySQL 容器四、自定义 MySQL 配置五、端口配置:Host 网络模式 vs Port 映射模式六、检查 MySQL 容器状态七、连接到 MySQL 容器八、备份与恢复总结 前言 在本篇文章中,…...
使用 Docker 部署 Flask 应用
使用 Docker 部署 Flask 应用 一、引言 在现代软件开发中,应用的部署和环境管理是至关重要的环节。传统的部署方式常常会遇到 “在我机器上能运行,在你机器上不行” 的问题,而 Docker 的出现很好地解决了这个痛点。Docker 是一个用于开发、部署和运行应用程序的开放平台,…...
公开整理-最新中国城市统计NJExcel+PDF版本(1985-2024年)
数据简介:《中国城市统计NJ》从1985年开始,本NJ内容共分四个部分:第一部分是全国城市行政区划,列有不同区域、不同级别的城市分布情况;第二、三部分分别是地级以上城市统计资料和县级城市统计资料,具体包括人口、劳动力及土地资源、综合经济、工业、交通…...
python绘图之swarmplot分布散点图
swarmplot 是 Seaborn 提供的一种用于展示分类数据分布的散点图。它的主要作用是将数据点按照分类变量(通常是离散变量)进行分组,并在每个分类中以一种非重叠的方式展示数据点的位置。这种可视化方式可以帮助我们直观地理解数据在不同分类下的…...
KubeSphere平台安装
KubeSphere简介 KubeSphere 是一款功能强大的容器管理平台,以下是其简介: 1)基本信息 开源项目:基于 Apache-2.0 授权协议开源,由 Google Go、Groovy、HTML/CSS 和 Shell 等多种编程语言开发。基础架构:…...
Claude 3.7 Sonnet 泄露,Anthropic 最先进 AI 模型即将在 AWS Bedrock 上首次亮相
(图片:AWS) Anthropic 旗下先进的 AI 模型 Claude 3.7 Sonnet 似乎即将发布。业界预计,亚马逊可能会在2025年2月26日的活动中公布相关消息。泄露的信息表明,该模型将托管于 AWS Bedrock 平台,该平台以提供尖端 AI 模型访问而闻名…...
ONNX转RKNN的环境搭建和部署流程
将ONNX模型转换为RKNN模型的过程记录 工具准备 rknn-toolkit:https://github.com/rockchip-linux/rknn-toolkit rknn-toolkit2:https://github.com/airockchip/rknn-toolkit2 rknn_model_zoo:https://github.com/airockchip/rknn_model_zoo ultralytics_yolov8:https://github…...
解决鼠标唤醒关屏状态下的笔记本
以下是通过计划任务和PowerShell实现鼠标唤醒控制的全网独家解决方案,基于Windows事件触发机制,结合设备管理API实现精准控制,最终实现仅需通过win+l锁定屏幕,再关闭屏幕,既不会出现唤醒笔记问的问题: 一、技术原理深度解析 1. 事件触发机制 Windows安全子系统在锁屏/…...
MongoDB 复制(副本集)
MongoDB 复制(副本集) 引言 MongoDB是一个高性能、可扩展、易于使用的文档存储系统。它以JSON-like的文档存储结构,支持灵活的数据模型。在分布式系统中,为了提高数据可用性和系统稳定性,常常需要实现数据的备份和冗余。MongoDB提供了副本集…...
聊聊 FocusSearch/focus_mcp_sql:Text2SQL 的新玩法
聊聊 FocusSearch/focus_mcp_sql:Text2SQL 的新玩法 最近在 GitHub 上逛的时候,发现了一个挺有意思的项目——FocusSearch/focus_mcp_sql。作为一个对 Text2SQL 有点小研究的前端码农,我忍不住想和大家聊聊这个工具。它不像那些常见的基于大…...
Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机
Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机 前言一、使用命令行(nmcli 命令)配置网络,配置主机名第一步第二步修改主机名称 二、使用图形化界面(nmtui 命令)配…...
C#开发——ConcurrentDictionary集合
ConcurrentDictionary<TKey, TValue> 是 C# 中一个专为多线程场景设计的线程安全字典集合,位于 System.Collections.Concurrent 命名空间中。它允许多个线程同时对字典进行读写操作,而无需额外的同步措施。 一、集合特征 此集合有如下特征…...
深入浅出ES6:现代JavaScript的基石
ES6(ECMAScript 2015)是JavaScript语言的一次重大更新,引入了许多新特性,使JavaScript更加强大、优雅和易于维护。这些特性已经成为现代JavaScript开发的基石,掌握它们对于任何JavaScript开发者都至关重要。本文将深入…...
小型字符级语言模型的改进方向和策略
小型字符级语言模型的改进方向和策略 一、回顾小型字符级语言模型的处理流程 前文我们已经从零开始构建了一个小型字符级语言模型,那么如何改进和完善我们的模型呢?有哪些改进的方向?我们先回顾一下模型的流程: 图1 小型字符级语言模型的处理流程 (1)核心模块交互过程:…...
一周学会Flask3 Python Web开发-Jinja2模板访问对象
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 如果渲染模板传的是对象,如果如何来访问呢? 我们看下下面示例: 定义一个Student类 cla…...
vue 3D 翻页效果
<template><view class"swipe-container" touchstart"onTouchStart" touchmove"onTouchMove" touchend"onTouchEnd"><view class"page">初始页</view></view> </template><script&g…...
JSONL 是什么格式
JSONL(JSON Lines)格式是一种简洁的文件格式,它将每一行作为一个独立的JSON对象,每个对象之间通过换行符分隔。JSONL常用于处理大规模数据,特别是在日志文件、机器学习数据集或数据流应用中。 示例 假设我们有以下3条…...
npm : 无法加载文件 E:\ProgramFiles\Nodejs\npm.ps1,因为在此系统上禁止运行脚本。
这个错误是因为 Windows 系统的 PowerShell 执行策略 限制了脚本的运行。默认情况下,PowerShell 的执行策略是 Restricted,即禁止运行任何脚本。以下是解决该问题的步骤: 1. 检查当前执行策略 打开 PowerShell(管理员权限&#x…...
pycharm 调试 debug 进入 remote_sources
解决办法1: pycharm函数跳转到remote_sources中的文件中_pycharm修改remotesource包存放地址-CSDN博客 file->settings->project structure将项目文件夹设为"Sources"(此时文件夹会变为蓝色)。 解决方法2 Debug:使用Pychar…...
测试面试题:以一个登录窗口为例,设计一下登录界面测试的思路和方法
在测试登录窗口时,可以从 表单测试、 逻辑判断和 业务流程三个方面设计测试思路和方法。以下是一个详细的测试方案: 1. 表单测试 表单测试主要关注输入框、按钮等UI元素的正确性和用户体验。 测试点: 输入框测试 用户名和密码输入框是否正常显示。输入框是否支持预期的字符类…...
[特殊字符] 蓝桥杯 Java B 组 之最小生成树(Prim、Kruskal) 并查集应用
Day 3:最小生成树(Prim、Kruskal) & 并查集应用 📖 一、最小生成树(MST)简介 最小生成树(Minimum Spanning Tree, MST) 是一个 无向连通图 的 最小代价子图,它包含 …...
【蓝桥杯】1.k倍区间
前缀和 #include <iostream> using namespace std; const int N100010; long long a[N]; int cnt[N]; int main(){int n, m;cnt[0] 1;cin >> n >> m;long long res 0;for(int i 1; i < n; i){scanf("%d", &a[i]);a[i] a[i-1];res cnt…...
机器人部分专业课
华东理工 人工智能与机器人导论 Introduction of Artificial Intelligence and Robots 必修 考查 0.5 8 8 0 1 16477012 程序设计基础 The Fundamentals of Programming 必修 考试 3 64 32 32 1 47450012 算法与数据结构 Algorithm and Data Structure 必修 考试 3 56 40 …...
