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

news2024/12/26 10:06:20

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,希望得到大佬指点,需要工程的在下方留言

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

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

相关文章

五分钟了解支付、交易、清算、银行等专业名词的含义?

五分钟了解支付、交易、清算、银行等专业名词的含义?1. 支付类名词01 支付应用02 支付场景03 交易类型04 支付类型(按通道类型)05 支付类型(按业务双方类型)06 支付方式07 支付产品08 收银台类型09 支付通道10 通道类型…

LeetCode-416. 分割等和子集

目录题目分析回溯法动态规划动态规划(压缩)题目来源 416. 分割等和子集 题目分析 这道题目是要找是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 那么只要找到集合里能够出现 sum / 2 的子集总和,就算是可以分割成两个相同元素和子集了…

使用 ONLYOFFICE 宏借助 ChatGPT 生成文章

AI 技术在过去几年中得到了显著提升,同时也成为了我们日常生活中必不可少的一部分。现在,我们会将这种高科技功能纳入到文档撰写过程。在本文中,我们将展示如何构建一个宏来使用 ChatGPT API 生成文章。 关于 ChatGPT ChatGPT 是由 OpenAI 开…

html2canvas和jspdf导出pdf,每个页面模块占一页,在pdf中垂直居中显示

需求:html页面转换pdf,页面有多个模块,页面中有文本、echarts、表格等模块,一个模块占一页,因为模块高度不够,所以需要垂直居中 通过html2canvas和jspdf实现,html2canvas用于将页面元素生成canv…

以java编写员工管理系统(测试过 无问题)

一、系统结果的部分展示 二、题目以及相关要求 三、组成 1.该系统由 Employee 类 、commonEmployee类、Testemd类和managerEmployee类组成 2.Employee实现的代码 public class Employee {private String id;private String name;private String job;private int holiday…

弱监督参考图像分割:Learning From Box Annotations for Referring Image Segmentation论文阅读笔记

弱监督参考图像分割:Learning From Box Annotations for Referring Image Segmentation论文阅读笔记一、Abstract二、引言三、相关工作A、全监督参考图像分割B、基于 Box 的实例分割C、带有噪声标签的学习四、提出的方法A、概述B、伪标签生成目标轮廓预测Proposal 选…

exe打包工具:advanced installer介绍(一)

前言近年来,web服务逐渐走向云端部署浏览器化、去APP化,然而exe安装仍有着举足轻重的地位,其好处不言而喻,拿到exe安装包后,基本就可以傻瓜安装和操作了,十分便捷。业务场景通过各种IDE/QT/C#/Java等开发工…

项目的生命周期与成本、风险、变更的关系

成本与人力投入水平 项目成本的投入在初始阶段逐渐增加,在执行的中间阶段达到顶峰,在项目收尾阶段逐渐下降。成本的投入趋势如下图所示: 初始阶段:从人力成本来看,信息系统开发团队在前期制定项目管理章程及项目管理…

PCB焊盘设计基本原则

SMT的组装质量与PCB焊盘设计有直接的关系,焊盘的大小比例十分重要。如果PCB焊盘设计正确,贴装时少量的歪斜可以再次回流焊纠正(称为自定位或自校正效应),相反,如果PCB焊盘设计不正确,即使贴装位置十分准确,…

图像金字塔,原理、实现及应用

什么是图像金字塔 图像金字塔是对图像的一种多尺度表达,将各个尺度的图像按照分辨率从小到大,依次从上到下排列,就会形成类似金字塔的结构,因此称为图像金字塔。 常见的图像金字塔有两类,一种是高斯金字塔&#xff0…

为什么越来越多的人开始学习大数据

因为根据国内的发展形势,大数据未来的发展前景会非常好,前景好需求高,自然会吸引越来越多的人进入大数据行业 我国市场环境处于急需大数据人才但人才不足的阶段,所以未来大数据领域会有很多的就业机遇。 2022年春季,…

camunda流程引擎基本使用(笔记)

文章目录一、camunda基础1.1 安装与部署流程引擎1.2 流程引擎结构1.3 流程引擎的基本使用1.3.1 创建一个BPMN Diagram1.3.2 实现一个外部工作者1.3.3 部署流程1.3.4 创建一个流程实例并消费1.3.5 向流程中添加用户任务1.3.6 添加网关1.3.7 业务规则二、Java 集成流程引擎2.1 为…

酷开科技大数据揭秘!酷开系统中的千屏千面究竟指的是什么?

互联网行业的快速发展,给我们带来了极大的便利。回顾整个互联网行业的发展历程,从PC时代到移动互联网时代,从移动互联网时代到物联网时代,现在又即将从物联网时代迈入人工智能时代。这些飞速发展的背后,其实是对数据利…

ICG-alkyne,吲哚菁绿-炔基结构式,实验室科研试剂,CAS号:1622335-41-4

ICG-alkyne,吲哚菁绿-炔基 中文名称:吲哚菁绿-炔基 CAS号:1622335-41-4 英文名称:ICG-alkyne 英文别名:ICG-alk 性状:绿色粉末 化学式:C48H53N3O4S 分子量:768.03 溶剂:溶于…

3BHE029110R0111 ABB

3BHE029110R0111 ABB变频器控制方式低压通用变频输出电压为380~650V,输出功率为0.75~400kW,工作频率为0~400Hz,它的主电路都采用交—直—交电路。其控制方式经历了以下四代。1U/fC的正弦脉宽调制&#xff0…

ggplot2的组图拓展包(1):patchwork(中篇)

专注系列化、高质量的R语言教程推文索引 | 联系小编 | 付费合集上篇和上篇续介绍了使用操作符进行组图的方法,这里默认读者已经能够理解各种操作符在本篇推文中的使用场景。本篇目录如下:0 示例图形6 plot_layout函数(下)6.1 guid…

CSS3-数据可视化

2D动画 - transform CSS3 transform属性允许你旋转,缩放,倾斜或平移给定元素。 Transform是形变的意思(通常也叫变换),transformer就是变形金刚 常见的函数transform function有: 平移:transl…

实际开发中如何存储密码(md5加盐bcrypt)golang

文章目录简介加盐的加密方式md5 加盐方式bcrypt 方式简介 一般前端把用户密码发给服务端,服务端实际业务中如何存储密码呢,如何存储密码才能保证密码不被开发者获取或者被截取呢,保证密码的安全 加盐的加密方式 现在的企业开发大都采用这种…

凌恩生物文献分享|颠覆性的宏基因组新思路,速来get!

非人灵长类动物(NHP)是人类的近亲,为宿主-微生物互作的研究提供了一个很好的例子。近年来研究主要集中在野生灵长类动物的肠道微生物群,这将有助于了解灵长类及其肠道微生物群的进化,但仍然缺乏关于野生种群肠道微生物…

通用后台管理系统-前端搭建

一 背景 基于vuespringboot 搭建一套通用管理后台 主要包括用户管理模块、权限模块、菜单模块 二 环境信息 2.1 前端工具版本 2.1.1 npm 版本 PS D:\front> npm -v 8.5.0PS D:\front> npm config get registry https://registry.npm.taobao.org/ PS D:\front>2.1…