51驱动NRF24L01通信,NRF24L01与TTL转NRF24L01模块通信

2023-05-16

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);           	    	// 使能接收通道0
	nRF24L01P_Write_Reg(WRITE_REG + RF_CH, 40);                 			// 选择射频通道0x40
	nRF24L01P_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);   					// 使能接收通道0
	nRF24L01P_Write_Reg(WRITE_REG + SETUP_RETR, 0x0a);  					// 自动重发延时等待250us+86us,自动重发10次
	nRF24L01P_Write_Reg(WRITE_REG + RF_CH, 40);         					// 选择射频通道0x40
	nRF24L01P_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 stat
	state = 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接线

STC89C52RCNRF24L01
VCC3.3V
GNDGND
CSNP1_5
CEP1_4
MOSIP1_3
SCKP1_2
IRQP1_1
MISOP1_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,希望得到大佬指点,需要工程的在下方留言

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

51驱动NRF24L01通信,NRF24L01与TTL转NRF24L01模块通信 的相关文章

  • 【MongoDB】——TTL Index

    TTL Index
  • 1、ESP8266入门(AT模式)——调试连接,使用USB-TTL

    1 ESP8266总括 1 1 资料官方下载 乐鑫 xff1a https www espressif com zh hans products hardware esp8266ex overview 安信可 xff1a https www
  • TTL和RS232之间的详细对比

    背景 之前就听过TTL xff0c 一直没搞懂其和RS232的区别 最近 xff0c 打算去买个USB转RS232的芯片 xff0c 结果找到此产品 xff1a 六合一多功能USB转UART串口模块CP2102 usb TTL485 232
  • 基于stm32与NRF24L01的无线门禁系统

    首先 xff0c 需要说明梁只是一个小本科生 xff0c 水平不高 xff0c 许多错误请大家指教 xff08 qq1257681989 xff09 所写的内容是我自己做的 xff0c 写此博客仅在于让自己在完成之后有个回顾和总结 进入正文
  • 【MongoDB】——TTL Index

    TTL Index
  • USB转TTL、USB转串口、USB转232的区别

    PO主作为一个没有专业背景的小白 xff0c 在初玩单片机时曾被上面的几个名词所混淆 xff0c 不过后来终于大彻大悟 xff0c 现在把自己的理解写在这里 xff0c 同样准备入门单片机的小白可以看看 xff0c 或许对你有所帮助 首先
  • WIFI-TTL透传模块

    简介 WiFi TTL透传模块基于我司DT ESPC2 12模块研发 xff0c 引出串口TTL EN STATE 等引脚 产品内置我司最新版本的串口透传固件可完成设备TTL 端口到WiFi 云的数据实时透传 本模块可直接取代原有的有线串口
  • ESP-Drone控制板设计的第二个任务-绘制USB-TTL串口下载电路和ESP32-S2芯片内置USB接口电路

    1 摘要 ESP32系列处理器一般会需要采用串口来下载代码 xff0c 因此在其设计中都会保留一个USB TTL串口电路 xff0c 查看乐鑫官网的参考设计 xff0c 基本上是采用CP2102这颗USB转TTL串口芯片 xff0c 但在本
  • mavros连接px4失败的usb-ttl原因

    问题描述 xff1a 最近在搞mavros xff0c 以方便协处理器和pixhawk通讯 xff0c 在按照官网教程安装mavros xff0c 设置px4 xff0c 连接硬件之后发现mavros卡在中间下不去 xff1a MAVROS
  • TTL/RS232/RS422/RS485串行通信接口区别与波形

    TTL RS232 RS422 RS485通信接口区别与波形 串行通信接口区别串口数据帧格式接线图波形图 串行通信接口区别 TTL RS232 RS422 RS485指的是电平接口标准 xff0c 都属于串行通信接口 xff0c 即串口 x
  • Jetson TX2——串口的使用(TTL-RS485)

    Jetson TX2之串口的使用 xff08 TTL RS485 xff09 TX2串口设备 TX2 有5个 UARTs 到主连接器 其中UART3 用于 WLAN BT 有关 UARTs 的典型任务 请参见下表 查看可用串口设备 xff1
  • 数字电路-门电路

    摘要 本章系统地讲述了数字集成电路中的基本逻辑单元电路 门电路 由于门电路中的二极管和三极管经常工作在开关状态 所以首先介绍它们在开关状态下的工作特性 然后 重点讨论了目前广泛使用的CMOS门电路和TTL门电路 对于每一种门电路 除了讲解它
  • 各种通信接口的简单对比

    对比表 同步方式与异步方式的主要区别在于 是否传输时钟信号 只要是通訊前雙方需要設定相同波特率的 都是異步傳輸方式 异步传输 Asynchronous Transmission 每次异步传输的信息都以一个起始位开头 它通知接收方数据已经到达
  • C 套接字发送 UDP 并处理来自路由器的 ICMP 回复

    我正在尝试向生存时间为 1 的路由器发送 UDP 数据包 然后接收 ICMP 超时回复 到目前为止 我能够发送数据包 但是当我的程序到达执行的接收部分时 它就挂起了 我对recvfrom进行了错误检查 但它甚至没有达到这一点 我的计算机正在
  • Redis 数据库 TTL

    无论如何 有没有办法创建一个 Redis 数据库 其中键HAVE TO一定时间后会过期吗 我知道我可以使用以下命令使单个密钥过期EXPIRE命令 但由于无论如何我都会在一定时间后使每个密钥过期 因此最好在 Redis 配置文件中指定此行为
  • 将 RDF .ttl 文件合并到一个文件数据库中 - 过滤并仅保留所需的数据/三元组

    我需要将 1000 多个 ttl 文件合并到一个文件数据库中 如何通过过滤源文件中的数据来合并它们 并仅保留目标文件中所需的数据 Thanks 有很多选项 但最简单的方法可能是使用 Turtle 解析器读取所有文件 并让该解析器将其输出传递
  • Mongodb TTL 使文档提前过期

    我正在尝试将文档插入 Mongo 数据库并让它在预定时间后自动过期 到目前为止 我的文档已被插入 但总是会在 0 60 秒内从数据库中删除 即使我将 expireAfterSeconds 设置得更长 我知道 mongodb 大约每 60 秒
  • Go 中带有 TTL 选项的映射

    我需要构建这样的数据结构 map string SomeType 但它必须将值存储大约 10 分钟 然后从内存中清除 第二个条件是记录数量 它必须是巨大的 该数据结构必须至少添加每秒 2 5K 条记录 那么 Go 中最正确的实现方法是什么
  • 如何在aerospike中获取ttl为-1的记录集?

    我在aerospike中有很多记录 我想获取ttl为 1的记录 请提供解决方案 只是为了澄清 设置TTL 为 1 https github com aerospike aerospike client go blob master docs
  • ArangoDB 游标超时

    使用 ArangoDB 2 3 1 看来我的光标将在几分钟内过期 我希望它们能持续一个小时 我已使用 TTL 参数设置 AQL 查询对象 如下所示 query removed actual query count true batchSiz

随机推荐

  • CMake 引用第三方库

    一 cmake简介 cmake 是gnu工具链中构建项目重要的一环 xff0c 而且在windows linux OS X中都可以使用 xff0c 特别是linux C C 43 43 程序员必备基本功 二 基本命令 xff1a 命名变量
  • C/C++:struct和class区别

    C和C 43 43 中的Struct区别 CC 43 43 不能将函数放在结构体声明能将函数放在结构体声明在C结构体声明中不能使用C 43 43 访问修饰符 public protected private 在C 43 43 中可以使用 在
  • 四旋翼无人机学习之准备篇(一)

    最近我哥要给我邮递个四旋翼无人机 xff0c 再加上本人对蓝天从小就很感兴趣 所以在学习完四驱小车后打算上手下无人机 刚开始学习根本不知道要看哪些 xff0c 在几天漫无头绪的学习 xff0c 终于有点气色了 xff0c 就把学习经验分享给
  • 更改Ubuntu默认python版本的方法

    可以按照以下方法使用 ls 命令来查看你的系统中都有那些 Python 的二进制文件可供使用 1 2 ls usr bin python usr bin python usr bin python2 usr bin python2 7 us
  • c++求素数

    C 43 43 练习第一课 C 43 43 输入一个n 求n以内的素数 xff1a C 43 43 输入一个n 求n以内的素数 xff1a include span class token operator lt span iostream
  • 贪吃蛇

    C尝试写的贪吃蛇项目 xff08 数组实现 xff09 以后会更新用链表实现贪吃蛇 span class token macro property span class token directive keyword define span
  • Android公司面试题

    Android 面试题及面试经验 我的第一次面试经验 今天来到成都面试 xff0c 面试的是Android xff0c 说实话 xff0c Android并不是我的强项 xff0c 只是在大学期间接触过 第一关人事还可以 xff0c 第二关
  • linux---tcp通信流程以及代码实现

    TCP通信特性 xff1a xff08 在网络版块详细讲解 xff09 面向连接 可靠 面向字节流 TCP通信过程 c 43 43 封装TCP通信 1 include lt iostream gt 2 include lt arpa ine
  • 物联网学习及理解

    物联网学习及理解 xff08 来自一个物联网专业学生的心得 xff09 什么是物联网物联网能做什么一 物联网运用领域二 物联网发展趋势 物联网怎么实现一 局域网内的物联网二 广域网内的物联网 总结 在开始写这篇博客之前 xff0c 我不得不
  • vscode代码格式化快捷键

    Windows xff1a Shift 43 Alt 43 F Linux Ctrl 43 Shift 43 I MacOS Shift 43 Option 43 F
  • 多线程和网络编程(多线程)

    一 多线程 1 进程和线程 进程 xff1a 是正在运行的程序 是系统进行资源分配和调用的独立单位 每一个进程都有它自己的内存空间和系统资源 线程 xff1a 是进程中的单个顺序控制流 xff0c 是一条执行路径 单线程 xff1a 一个进
  • Java八种基本数据类型(图文详解)

    Java八种基本数据类型 Java八种数据类型Java八种数据类型的分类 xff08 图 xff09 基本数据类型分为三大类 数值型 字符型 布尔型 数值型整数类型 xff08 byte short int long xff09 浮点型 f
  • numpy基础用法-学习笔记-task10

    大作业 本次练习使用 鸢尾属植物数据集 iris data xff0c 在这个数据集中 xff0c 包括了三类不同的鸢尾属植物 xff1a Iris Setosa xff0c Iris Versicolour xff0c Iris Virg
  • STM32F103驱动LD3320语音识别模块

    STM32F103驱动LD3320语音识别模块 LD3320语音识别模块简介模块引脚定义STM32F103ZET6开发板与模块接线测试代码实验结果 LD3320语音识别模块简介 基于 LD3320 xff0c 可以在任何的电子产品中 xff
  • Arduino UNO驱动土壤湿度传感器检测

    Arduino UNO驱动土壤湿度传感器检测 简介运行要求Arduino UNO与传感器接线程序展示实践效果总结 简介 本次使用到是这个新款土壤湿度传感器 xff01 这款电容式土壤湿度传感器区别于市面上绝大部分的电阻式传感器 xff0c
  • ESP32使用TCP HTTP访问API接口JSON解析获取数据

    ESP32使用TCP HTTP访问API接口JSON解析获取数据 API接口代码解析获取时间代码烧录效果总结 API接口 单片机常用的API接口基本都是返回的一串JSON格式的数据 xff0c 这里以ESP32联网获取时间信息作为获取API
  • 电池保护板 - 问题归纳

    电池保护板 问题归纳 简介充电锂电池磷酸铁锂电池 放电总结 最近更新日期 xff1a 2023 03 07 简介 电池充放电过程中 xff0c 如果电压 电流或温度等参数不稳定或超出电池的安全范围 xff0c 就会对电池造成损害 xff0c
  • Arduino驱动DS1302显示时钟

    Arduino驱动DS1302显示时钟 前言电气参数经典应用电路接线程序实验结果 前言 目前有许多流行的串行时钟电路 xff0c 例如 DS1302 xff0c DS3231 xff0c DS1307 xff0c PCF8485 等 它们由
  • 计算机网络---应用层以及HTTP协议

    网络层是程序员接触最多的一个层级 xff0c 应用层是层级体系中的最上层的一级 xff0c 是我们做逻辑处理最多的 应用层的功能什么是urlhttp协议 应用层的功能 是程序员写的一个一个解决的实际的问题都是在应用层 xff0c 是做逻辑运
  • 51驱动NRF24L01通信,NRF24L01与TTL转NRF24L01模块通信

    51驱动NRF24L01通信 xff0c NRF24L01与TTL转NRF24L01模块通信 NRF24L01一 简介二 引脚功能描述 程序设计一 对 24L01 的程序编程的基本思路如下 xff1a 二 Tx 与 Rx 的配置过程1 Tx