STM32使用NRF2401进行数据传送

news2025/5/17 22:51:07

NRF2401是一款由Nordic Semiconductor公司生产的单片射频收发芯片,以下是关于它的详细介绍:

一、主要特点

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

二、工作模式

NRF2401具有多种工作模式,包括收发模式、配置模式、空闲模式和关机模式。这些模式由PWR_UP、CE和CS三个引脚控制。

NRF24L01  芯片内部有状态机,控制着芯片在不同工作模式之间的转换。
NRF24L01 可配置为 Shutdown Standby Idle-TX TX RX 五种工作模式。

2.1、Shutdown 工作模式
        在 Shutdown 工作模式下, Si24R1 所有收发功能模块关闭,芯片停止工作,消耗电流最小,但所有内部寄存器值和 FIFO 值保持不变,仍可通过 SPI 实现对 寄存器的读写。设置 CONFIG 寄存器的 PWR_UP 位的值为 0 ,芯片立即返回到 Shutdown 工作模式。
2.2、Standby 工作模式。
        在 Standby 工作模式,只有晶体振荡器电路工作,保证了芯片在消耗较少电流的同时能够快速启动。设置 CONFIG 寄存器下的 PWR_UP 位的值为 1 ,芯片待时钟稳定后进入 Standby 模式。芯片的时钟稳定时间一般为 1.5~2ms ,与晶振的性能有关。当引脚 CE=1 时,芯片将由 Standby 模式进入到 Idle-TX RX 模式,当 CE=0 时,芯片将由 Idle-TX TX RX 模式返回到 Standby 模式。
2.3、Idle-TX 工作模式
        在 Idle-TX 工作模式下,晶体振荡器电路及时钟电路工作。相比于 Standby 模式,芯片消耗更多的电流。当发送端 TX FIFO 寄存器为空,并且引脚 CE=1 时,芯片进入到 Idle-TX 模式。在该模式下,如果有新的数据包被送到 TX FIFO 中,芯片内部的电路将立即启动,切换到 TX 模式将数据包发送。
        在 Standby Idle-TX 工作模式下,所有内部寄存器值和 FIFO 值保持不变, 仍可通过 SPI 实现对寄存器的读写。
2.4、TX 工作模式
        当需要发送数据时,需要切换到 TX 工作模式。芯片进入到 TX 工作模式的条件为:TX FIFO 中有数据, CONFIG 寄存器的 PWR_UP 位的值为 1 PRIM_RX 位的值为 0 ,同时要求引脚 CE 上有一个至少持续 10us 的高脉冲。芯片不会直接由 Standby 模式直接切换到 TX 模式,而是先立即切换到 Idle-TX 模式,再由 Idle-TX 模式自动切换到 TX 模式。 Idle-TX 模式切换到 TX 模式的时间为 120us~130us 之间,但不会超过 130us 。单包数据发送完成后,如果 CE=1, 则由 TX FIFO 的状态来决定芯片所处的工作模式,当 TX FIFO 还有数据,芯片继续保持在TX 工作模式,并发送下一包数据;当 TX FIFO 没有数据,芯片返回 Idle-TX 模式;如果 CE=0 ,立即返回 Standby 模式。数据发射完成后,芯片产生数据发 射完成中断。
2.5、RX 工作模式
        当需要接收数据时,需要切换到 RX 工作模式。芯片进入到 RX 工作模式的条件为:设置寄存器 CONFIG PWR_UP 位的值为 1 PRIM_RX 位的值为 1 并且引脚 CE=1。芯片由 Standby 模式切换到 RX 模式的时间为 120~130us。当接 收到数据包的地址与芯片的地址相同,并且 CRC 检查正确时,数据会自动存入 RX FIFO,并产生数据接收中断。芯片最多可以同时存三个有效数据包,当 FIFO 已满,接收到的数据包被自动丢掉。
        在接收模式下,可以通过 RSSI 寄存器检测接收信号功率。当接收到的信号 强度大于-60dBm 时, RSSI 寄存器的 RSSI 位的值将被设置为 1 。否则, RSSI=0
        RSSI 寄存器的更新方法有两种:当接收到有效的数据包后, RSSI 会自动更新,此外,将芯片从 RX 模式换到 Standby 模式时 RSSI 也会自动更新。 RSSI 的值会随温度的变化而变化,范围在±5dBm 以内。

三、数据控制协议

四、代码参考

完整代码下载链接: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);           						// 使能接收通道0
	NRF2401_Write_Reg(WRITE__REG + RF_CH, 40);                 						// 选择射频通道0x40
	NRF2401_Write_Reg(WRITE__REG + RX_PW_P0, TX_PLOAD_WIDTH);  						// 接收通道0选择和发送通道相同有效数据宽度
	NRF2401_Write_Reg(WRITE__REG + RF_SETUP, 0x0f);            						// 数据传输率2Mbps,发射功率7dBm
	NRF2401_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);   											// 使能接收通道0
	NRF2401_Write_Reg(WRITE__REG + SETUP_RETR, 0x0a);  											// 自动重发延时等待250us+86us,自动重发10次
	NRF2401_Write_Reg(WRITE__REG + RF_CH, 40);         											// 选择射频通道0x40
	NRF2401_Write_Reg(WRITE__REG + RF_SETUP, 0x0f);    											// 数据传输率2Mbps,发射功率7dBm
	NRF2401_Write_Reg(WRITE__REG + CONFIG, 0x0e);      											// CRC使能,16位CRC校验,上电
	NRF_CE_1;
}

五、应用领域

NRF2401适用于多种无线通信的场合,如无线数据传输系统、无线鼠标、遥控开锁、遥控玩具等。其低功耗、高数据速率和多频道通信的特点使其成为物联网、智能家居和穿戴式设备等领域中备受推崇的无线解决方案之一。

 

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

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

相关文章

DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由

为了让大家实现 DeepSeek 使用自由&#xff0c;今天分享 10 个畅用 DeepSeek 的平台。 一、官方满血版&#xff1a;DeepSeek官网与APP 首推&#xff0c;肯定是 DeepSeek 的官网和 APP&#xff0c;可以使用满血版 R1 和 V3 模型&#xff0c;以及联网功能。 网址&#xff1a; htt…

Orange 开源项目 - 集成阿里云大模型

1 阿里云的大模型服务平台百炼 阿里云的大模型服务平台百炼是一站式的大模型开发及应用构建平台。不论是开发者还是业务人员&#xff0c;都能深入参与大模型应用的设计和构建。您可以通过简单的界面操作&#xff0c;在5分钟内开发出一款大模型应用&#xff0c;或在几小时内训练…

公开整理-最新中国城市统计NJExcel+PDF版本(1985-2024年)

数据简介&#xff1a;《中国城市统计NJ》从1985年开始&#xff0c;本NJ内容共分四个部分:第一部分是全国城市行政区划,列有不同区域、不同级别的城市分布情况;第二、三部分分别是地级以上城市统计资料和县级城市统计资料,具体包括人口、劳动力及土地资源、综合经济、工业、交通…

KubeSphere平台安装

KubeSphere简介 KubeSphere 是一款功能强大的容器管理平台&#xff0c;以下是其简介&#xff1a; 1&#xff09;基本信息 开源项目&#xff1a;基于 Apache-2.0 授权协议开源&#xff0c;由 Google Go、Groovy、HTML/CSS 和 Shell 等多种编程语言开发。基础架构&#xff1a;…

Claude 3.7 Sonnet 泄露,Anthropic 最先进 AI 模型即将在 AWS Bedrock 上首次亮相

(图片&#xff1a;AWS) Anthropic 旗下先进的 AI 模型 Claude 3.7 Sonnet 似乎即将发布。业界预计&#xff0c;亚马逊可能会在2025年2月26日的活动中公布相关消息。泄露的信息表明&#xff0c;该模型将托管于 AWS Bedrock 平台&#xff0c;该平台以提供尖端 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…

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;二&#xff09;配置网络与登录本地远程Linux主机 前言一、使用命令行&#xff08;nmcli 命令&#xff09;配置网络&#xff0c;配置主机名第一步第二步修改主机名称 二、使用图形化界面&#xff08;nmtui 命令&#xff09;配…

深入浅出ES6:现代JavaScript的基石

ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的一次重大更新&#xff0c;引入了许多新特性&#xff0c;使JavaScript更加强大、优雅和易于维护。这些特性已经成为现代JavaScript开发的基石&#xff0c;掌握它们对于任何JavaScript开发者都至关重要。本文将深入…

小型字符级语言模型的改进方向和策略

小型字符级语言模型的改进方向和策略 一、回顾小型字符级语言模型的处理流程 前文我们已经从零开始构建了一个小型字符级语言模型,那么如何改进和完善我们的模型呢?有哪些改进的方向?我们先回顾一下模型的流程: 图1 小型字符级语言模型的处理流程 (1)核心模块交互过程:…

一周学会Flask3 Python Web开发-Jinja2模板访问对象

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 如果渲染模板传的是对象&#xff0c;如果如何来访问呢&#xff1f; 我们看下下面示例&#xff1a; 定义一个Student类 cla…

vue 3D 翻页效果

<template><view class"swipe-container" touchstart"onTouchStart" touchmove"onTouchMove" touchend"onTouchEnd"><view class"page">初始页</view></view> </template><script&g…

npm : 无法加载文件 E:\ProgramFiles\Nodejs\npm.ps1,因为在此系统上禁止运行脚本。

这个错误是因为 Windows 系统的 PowerShell 执行策略 限制了脚本的运行。默认情况下&#xff0c;PowerShell 的执行策略是 Restricted&#xff0c;即禁止运行任何脚本。以下是解决该问题的步骤&#xff1a; 1. 检查当前执行策略 打开 PowerShell&#xff08;管理员权限&#x…

pycharm 调试 debug 进入 remote_sources

解决办法1&#xff1a; pycharm函数跳转到remote_sources中的文件中_pycharm修改remotesource包存放地址-CSDN博客 file->settings->project structure将项目文件夹设为"Sources"&#xff08;此时文件夹会变为蓝色&#xff09;。 解决方法2 Debug:使用Pychar…

测试面试题:以一个登录窗口为例,设计一下登录界面测试的思路和方法

在测试登录窗口时,可以从 表单测试、 逻辑判断和 业务流程三个方面设计测试思路和方法。以下是一个详细的测试方案: 1. 表单测试 表单测试主要关注输入框、按钮等UI元素的正确性和用户体验。 测试点: 输入框测试 用户名和密码输入框是否正常显示。输入框是否支持预期的字符类…

【蓝桥杯】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 …

Maven——Maven开发经验总结(1)

摘要 本文总结了 Maven 开发中的多个关键经验&#xff0c;包括如何根据版本号决定推送到 releases 或 snapshots 仓库&#xff0c;如何在构建过程中跳过测试&#xff0c;父项目如何控制子项目依赖版本&#xff0c;父项目依赖是否能传递到子项目&#xff0c;如何跳过 Maven dep…

gitlab 解决双重认证无法登录remote: HTTP Basic: Access denied.

问题&#xff1a;gitlab开启了双因素认证导致无法正常使用 如进行了 OAuth configuration 在进行git操作时如下提示 remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access…

【Microsoft PowerPoint for Mac】2分钟配置-MAC一键删除PPT中的所有备注

MAC一键删除PPT中的所有备注 1.搜索自动操作2.点击快速操作3.搜索并运行AppleScript4.输入代码&#xff0c;并选择只应用于Microsoft PowerPoint for Mac【右上角】5. CRTLS保存为“清除当前文稿中的所有备注”&#xff0c;PPT中应用。 MAC没自带&#xff0c;需要自己配置 1.搜…

人工智能 阿里云算力服务器的使用

获取免费的阿里云服务器 阿里云免费使用地址&#xff1a; https://free.aliyun.com/ 选择 人工智能平台 PAI 选择交互式建模 再选建立实例。 选择对应的GPU 和镜像&#xff0c;点击确认。 注意&#xff1a;250个小时&#xff0c;用的时候开启&#xff0c;不用的时候关闭&…