51驱动NRF24L01通信,NRF24L01与TTL转NRF24L01模块通信
51驱动NRF24L01通信,NRF24L01与TTL转NRF24L01模块通信
- NRF24L01
- 一、简介
- 二、引脚功能描述
- 程序设计
- 一、对 24L01 的程序编程的基本思路如下:
- 二、Tx 与 Rx 的配置过程
- 1、Tx 模式初始化过程:
- 2、Rx 模式初始化过程:
- 三、基本程序函数
- 通信测试
- 一、两个51单片机控制NRF24L01互相通信
- 一、51单片机控制NRF24L01与NRF24L01转TTL串口模块通信
- 总结
NRF24L01

一、简介
NRF24L01 是 NORDIC 公司最近生产的一款无线通信通信芯片,采用 FSK 调制,内部
集成 NORDIC 自己的 Enhanced Short Burst 协议。可以实现点对点或是 1 对 6 的无线通信。无线通信速度可以达到 2M(bps)。NORDIC 公司提供通信模块的 GERBER 文件,可以直接加工生产。嵌入式工程师或是单片机爱好者只需要为单片机系统预留 5 个 GPIO,1 个中断输入引脚,就可以很容易实现无线通信的功能,非常适合用来为 MCU 系统构建无线通信功能。
二、引脚功能描述

VCC 脚接电压范围为2.0V~3.6V 之间,不能在这个区间之外,超过 3.6V 将会烧毁模块。推荐电压 3.3V 左右。除电源 VCC 和接地端,其余脚都可以直接和普通的 5V 单片机 IO口直接相连,无需电平转换。当然对3V左右的单片机更加适用了。
程序设计
一、对 24L01 的程序编程的基本思路如下:
1) 置 CSN 为低,使能芯片,配置芯片各个参数。(过程见 3.Tx 与 Rx 的配置过程)
配置参数在 Power Down 状态中完成。
2) 如果是 Tx 模式,填充 Tx FIFO。
3) 配置完成以后,通过 CE 与 CONFIG 中的 PWR_UP 与 PRIM_RX 参数确定 24L01
要切换到的状态。
Tx Mode:PWR_UP=1; PRIM_RX=0; CE=1 (保持超过 10us 就可以);
Rx Mode: PWR_UP=1; PRIM_RX=1; CE=1;
4) IRQ 引脚会在以下三种情况变低:
Tx FIFO 发完并且收到 ACK(使能 ACK 情况下)
Rx FIFO 收到数据
达到最大重发次数
将 IRQ 接到外部中断输入引脚,通过中断程序进行处理。
二、Tx 与 Rx 的配置过程
1、Tx 模式初始化过程:
1)写 Tx 节点的地址 TX_ADDR
2)写 Rx 节点的地址(主要是为了使能 Auto Ack) RX_ADDR_P0
3)使能 AUTO ACK EN_AA
4)使能 PIPE 0 EN_RXADDR
5)配置自动重发次数 SETUP_RETR
6)选择通信频率 RF_CH
7)配置发射参数(低噪放大器增益、发射功率、无线速率) RF_SETUP
8 ) 选择通道 0 有效数据宽度 Rx_Pw_P0
9)配置 24L01 的基本参数以及切换工作模式 CONFIG。
2、Rx 模式初始化过程:
1)写 Rx 节点的地址 RX_ADDR_P0
2)使能 AUTO ACK EN_AA
3)使能 PIPE 0 EN_RXADDR
4)选择通信频率 RF_CH
5) 选择通道 0 有效数据宽度 Rx_Pw_P0
6)配置发射参数(低噪放大器增益、发射功率、无线速率) RF_SETUP
7)配置 24L01 的基本参数以及切换工作模式 CONFIG。
三、基本程序函数
下面主要介绍几个重要程序函数,其它的程序函数需要的可以留言获取
1、nRF24L01+接收模式初始化
void nRF24L01P_RX_Mode(void)
{CE = 0;nRF24L01P_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址nRF24L01P_Write_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答nRF24L01P_Write_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0nRF24L01P_Write_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40nRF24L01P_Write_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度nRF24L01P_Write_Reg(WRITE_REG + RF_SETUP, 0x0f); // 数据传输率2Mbps,发射功率0dBm,低噪声放大器增益(nRF24L01+忽略该位)nRF24L01P_Write_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式nRF24L01P_Write_Reg(WRITE_REG + STATUS, 0xff); //清除所有的中断标志位CE = 1; // 拉高CE启动接收设备
}
2、nRF24L01+发送模式初始化
void nRF24L01P_TX_Mode(void)
{CE = 0;nRF24L01P_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址nRF24L01P_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同nRF24L01P_Write_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答nRF24L01P_Write_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0nRF24L01P_Write_Reg(WRITE_REG + SETUP_RETR, 0x0a); // 自动重发延时等待250us+86us,自动重发10次nRF24L01P_Write_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40nRF24L01P_Write_Reg(WRITE_REG + RF_SETUP, 0x0f); // 数据传输率2Mbps,发射功率0dBm,低噪声放大器增益(nRF24L01+忽略该位)nRF24L01P_Write_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电//CE = 1;
}
3、
/********************************************************
函数功能:读取接收数据
入口参数:rxbuf:接收数据存放首地址
返回 值:0:接收到数据1:没有接收到数据
*********************************************************/
u8 nRF24L01P_RxPacket(u8 *rxbuf)
{u8 statstate = nRF24L01P_Read_Reg(STATUS); //读取状态寄存器的值 nRF24L01P_Write_Reg(WRITE_REG+STATUS,state); //清除RX_DS中断标志if(state & RX_DR) //接收到数据{nRF24L01P_Read_Buf(RD_RX_PLOAD,rxbuf,TX_PLOAD_WIDTH); //读取数据nRF24L01P_Write_Reg(FLUSH_RX,0xff); //清除RX FIFO寄存器return 0; } return 1; //没收到任何数据
}
4、
/********************************************************
函数功能:发送一个数据包
入口参数:txbuf:要发送的数据
返回 值:0x10:达到最大重发次数,发送失败 0x20:发送成功 0xff:发送失败
*********************************************************/
u8 nRF24L01P_TxPacket(u8 *txbuf)
{u8 state;CE=0; //CE拉低,使能24L01配置nRF24L01P_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH); //写数据到TX FIFO,32个字节CE=1; //CE置高,使能发送 while(IRQ == 1); //等待发送完成state=nRF24L01P_Read_Reg(STATUS); //读取状态寄存器的值 nRF24L01P_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志if(state&MAX_RT) //达到最大重发次数{nRF24L01P_Write_Reg(FLUSH_TX,0xff); //清除TX FIFO寄存器 return MAX_RT; }if(state&TX_DS) //发送完成{return TX_DS;}return 0XFF; //发送失败
}
通信测试
1、两个NRF24L01的目标地址和接收地址需要设置成一样的,
发送和接收程序下面这个函数里面的地址必须是一样的
u8 code TX_ADDRESS[TX_ADR_WIDTH] = {0x11,0x22,0x33,0x44,0x55}; // 定义一个静态发送地址
2、通信频率需要设置成一样的,RF_CH是选择频率寄存器,
频率计算公式是2400+“RF_CH”,单位是MHZ;接收和发射函数里面设置的RF_CH值是40,所以实际通信频率是2400+40=2.440GHZ
3、数据传输速率也需要设置成一样的,
一、两个51单片机控制NRF24L01互相通信
1、51单片机和NRF24L01接线
| STC89C52RC | NRF24L01 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| CSN | P1_5 |
| CE | P1_4 |
| MOSI | P1_3 |
| SCK | P1_2 |
| IRQ | P1_1 |
| MISO | P1_0 |
| 2、发送程序 |
u8 a = 0;int main(void)
{UART_Init();nRF24L01P_Init();while(1){u8 buf[32] = {0};buf[0] = 0xAA;nRF24L01P_TX_Mode();a = nRF24L01P_TxPacket(buf);Delay(200);UART_SendByte(a);buf[0] = 0;}
}
3、接收程序
int main(void)
{u8 buf[32] = {0};nRF24L01P_Init();UART_Init();nRF24L01P_RX_Mode();while(1){buf[0] = 0;nRF24L01P_RxPacket(buf);UartSendStr(buf);Delay(200);buf[0] = 0;}
}
实验现象

下图,右边的20是发送成功标志,左边AA是发送的数据

一、51单片机控制NRF24L01与NRF24L01转TTL串口模块通信
1、NRF24L01转TTL串口模块

接收参数和发射参数需要设置成一样的才能通讯

2、发射程序
int a = 0;int main(void)
{UART_Init();nRF24L01P_Init(); while(1){u8 buf[32] = {" NRF24L01 Test\r\n"};nRF24L01P_TX_Mode();a = nRF24L01P_TxPacket(buf);UART_SendByte(a);Delay(200);}
}
3、现象

总结
NRF24L01模块不支持热插拔,热插拔会损坏模块;代码调试的过程还有些小BUG,希望得到大佬指点,需要工程的在下方留言
相关文章:
51驱动NRF24L01通信,NRF24L01与TTL转NRF24L01模块通信
51驱动NRF24L01通信,NRF24L01与TTL转NRF24L01模块通信NRF24L01一、简介二、引脚功能描述程序设计一、对 24L01 的程序编程的基本思路如下:二、Tx 与 Rx 的配置过程1、Tx 模式初始化过程:2、Rx 模式初始化过程:三、基本程序函数通信…...
C++友元
欢迎来观看温柔了岁月.c的博客 目前 设有C学习专栏 C语言项目专栏 数据结构与算法专栏 目前主要更新C学习专栏,C语言项目专栏不定时更新 待C专栏完毕,会陆续更新C项目专栏和数据结构与算法专栏 一周主要三更,星期三,星期五&#x…...
MySQL内置函数
文章目录日期函数字符串函数数学函数其他函数日期函数 获取年月日: mysql> select current_date(); ---------------- | current_date() | ---------------- | 2023-02-01 | ---------------- 1 row in set (0.00 sec)获得时分秒: mysql> se…...
mysql数据库之innodb存储引擎架构之内存架构
一、逻辑存储结构 mysql5.5版本开始,默认使用innodb存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发中使用非常广泛。 架构图(左侧为内存架构,右侧为磁盘架构) 二、 内存架构。 1、缓冲…...
Vue:(三十五)路由vue-router
今天,我们开始学习vue中一个很关键的知识点,路由。理解vue的一个插件库,专门用来实现SPA应用单页web应用整个应用只有一个完整的页面点击页面中的导航连接不会刷新页面,只会做页面的局部更新数据需要通过ajax请求获取下来…...
Dynabook笔记本电脑无法开机怎么重装新系统?
Dynabook笔记本电脑无法开机怎么重装新系统?有用户使用Dynabook笔记本电脑出现了无法正常开机的情况。遇到这样的问题是我们的电脑系统出现了损坏,可以尝试进行系统修复。如果无法修复的话,就需要进行系统重装了。以下为大家带来Dynabook笔记…...
React Native基础知识点
1、组件 与react编写web应用不同,不是使用div、span等标签。而是使用RN官方提供的组件,如View、Text等组件来搭建页面 2、宽高 React Native 中的尺寸都是无单位的,表示的是与设备像素密度无关的逻辑像素点。默认值为auto <View style{{…...
nginx 平滑升级
背景介绍 因为一些原因,比如说 Nginx 发现漏洞、应用一些新的模块等等,想对 Nginx 的版本进行更新,最简单的做法就是停止当前的 Nginx 服务,然后开启新的 Nginx 服务。但是这样会导致在一段时间内,用户是无法访问服务…...
数据结构——链表OJ题目讲解(2)
作者:几冬雪来 时间:2023年3月10日 内容:数据结构链表OJ题目讲解 来源:牛客网和力扣 目录 前言: 刷题: 1.反转链表: 1.改变指向的解法: 2.取头结点插入到新链表: …...
GitHub上线重量级分布式事务笔记,再也不怕面试官问分布式了
分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式…...
C++语法规则1(C++面向对象 )
C面向对象 面向对象的三大特征是继承,多态和封装,C重面向对象重要的就是这些,我们下面通过一些简单的实例加以理解,从这小节开始,我们将开启新的编程旅途。与 C 语言编程的思想完全不同了,这就是 C!理解概…...
Web漏洞-CSRF漏洞
CSRF漏洞介绍:CSRF(Cross-Site Request Forgery),中文名称:跨站请求伪造,是一种劫持用户在当前已登录的Web应用程序上执行非本意操作一种攻击.原理:攻击者利用目标用户的身份,执行某…...
Python3-面向对象
Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象…...
拐点!新能源车交付均价首次「低于」燃油车,智能电动成新爆点
2023年开局,随着特斯拉打响新能源汽车市场的「价格战」首炮,除部分燃油车品牌(仍依赖自身多年的用户和品牌积累的溢价能力)没有跟进之外,几乎所有的新能源车型都在进行车型价格的下调。 而数据也在反映市场的拐点即将来…...
JavaScript String 字符串对象实例合集
文章目录JavaScript String 字符串对象实例合集返回字符串的长度为字符串添加样式返回字符串中指定文本首次出现的位置 - indexOf()方法查找字符串中特定的字符,若找到,则返回该字符 - match() 方法替换字符串中的字符 - replace()JavaScript String 字符…...
实习生培养计划
部门最近入职了实习生,为了更好的帮助实习生完成由学生向职业人的转变,并尽快融入企业稳步成长,现提出实习生培养计划,具体方案如下: 1、方案目的 1、使实习生快速转换角色与心态,适应从校园到企业的坏境…...
【服务器管理】Wordpress服务器内存占用太高(优化方案详解)
简述 在刚刚配置完服务器之后,想着试一试wordpress这个功能,结果打开服务器后台,发现本来就不多的内存被占用了一大半。 我真的服了,我还啥都没干呢,就这么多的内存占用,那之后我开始弄了还得了。因此有必…...
【ECCV 2022】76小时动捕,最大规模数字人多模态数据集开源
随着元宇宙的火爆以及数字人建模技术的商业化,AI 数字人驱动算法,作为数字人动画技术链的下一关键环节,获得了学界和工业界越来越广泛的兴趣和关注。其中谈话动作生成 (由声音等控制信号生成肢体和手部动作)由于可以降…...
联合解决方案 | 亚信科技AntDB数据库携手浪潮K1 Power赋能关键行业数字化转型,助力新基建
自2022年印发《“十四五”数字经济发展规划》以来,我国数字化发展进入快车道。数据库作为数据存储与计算的基础软件,对筑牢数字经济底座至关重要。服务器是承载数据的重要载体,在数据库性能可以通过扩容而无上限提升的情况下,数据…...
Android 单元测试问题总结(Robolectric+JUnit)
代码单元测试问题总结: 1、测试类中引用第三方jar包类报错 问题原因: 测试的库中没有包含第三方jar包。 解决办法: 在app下gradle中加入第三方jar包配置: testImplementation files(‘libs/third.jar’) 2、自定义Shadow类不生…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
MLP实战二:MLP 实现图像数字多分类
任务 实战(二):MLP 实现图像多分类 基于 mnist 数据集,建立 mlp 模型,实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入,可视化图形数字; 2、完成数据预处理:图像数据维度转换与…...
