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

article/2025/9/21 0:57:38

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接线

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://chatgpt.dhexx.cn/article/n3pJUQ49.shtml

相关文章

详解NRF24L01无线收发模块

近日有粉丝朋友留言,希望介绍一下nRF24L01这款无线收发芯片,正巧前不久的电赛有些涉及,因此将自己的一些经验写在这里,希望能有所收获。 前面我们介绍过单片机的几种通信协议,并且初步了解如何操作寄存器进而控制芯片的…

nRF24L01芯片(模块)介绍

nRF24L01芯片(模块)简介 nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型“SchockBurst”模式控制器、功率放大器、晶体振荡器、调制器和解调器。 输出功率频道选择和协议的…

2.4G通信

文章目录 2.4G无线通信实验一、模块简介二、Enhanced ShockBurstTM模式介绍三. 编程1.初始化IO口2.Enhanced ShockBurstTM发送流程3.Enhanced ShockBurstTM发送模式初始化4.Enhanced ShockBurstTM接收流程5.Enhanced ShockBurstTM接收模式初始化6.读函数7.写函数8.主函数 总结 …

无线收发模块——NRF24L01

1、什么是nRF24L01 nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。有着极低的电流消耗。 nRF24L01与5V单片机的连接通过SPI接口进行通讯,输出功率频道选择和协议的设置可以通过SPI 接口进行设置,几乎可以连接到各种单片…

分布式集群脑裂问题

Zookeeper集群"脑裂"问题 - 运维总结 在分布式集群的脑裂问题中,zookeeper脑裂是一个经典的例子。 在zookeeper集群中,有一个leader和多个follower(observer不参与选举,可以忽略),leader通过周…

分布式脑裂问题

"脑裂"定义 脑裂(split-brain)就是“大脑分裂”,也就是本来一个“大脑”被拆分了两个或多个“大脑”,我们都知道,如果一个人有多个大脑,并且相互独立的话,那么会导致人体“手舞足蹈”,“不听使唤…

Redis常见问题——脑裂问题

文章目录 背景一、脑裂问题产生二、选举完成三、总结四、解决方法 背景 脑裂问题:有三台服务器一台主服务器,两台从服务器,还有一个哨兵(哨兵就相当于一个代码段,不参与实际业务) 一、脑裂问题产生 解释一…

Redis脑裂现象

Redis脑裂现象 什么是Redis的脑裂现象 当Redis主从集群环境出现两个主节点为客户端提供服务,这时客户端请求命令可能会发生数据丢失的情况。 脑裂出现的场景 场景一 主从哨兵集群中如果当发生主从集群切换时,那么一定是超过预设quorum数量的哨兵和主…

redis集群(主从)脑裂及解决方案

什么是redis的集群脑裂? redis的集群脑裂是指因为网络问题,导致redis master节点跟redis slave节点和sentinel集群处于不同的网络分区,此时因为sentinel集群无法感知到master的存在,所以将slave节点提升为master节点。此时存在两个…

redis脑裂

脑裂:在主从集群中,同时有两个主节点他们都能接收写请求。而脑裂最直接影响的就是客户端不知道往哪个主节点写入数据,结果就是不同的客户端往不同的主节点写入数据。而且严重的会导致数据丢失。 为什么会发生脑裂? 1.确认是不是数…

【集群】脑裂是什么?Zookeeper是如何解决的?

文章目录 什么是脑裂Zookeeper集群中的脑裂场景过半机制 什么是脑裂 脑裂(split-brain)就是“大脑分裂”,也就是本来一个“大脑”被拆分了两个或多个“大脑”,我们都知道,如果一个人有多个大脑,并且相互独立的话,那么…

PXC脑裂问题分析与解决

前言 在使用PXC架构做mysql集群时,线上出现过一次PXC脑裂的故障,通过问题排查,分析与定位,最终针对这个问题以及解决方法做一次记录 脑裂现象表现 1、产品访问MySQL,出现数据不一致的情况(脑裂后一个集群分裂成两个独立的集群,如PXC前置是通过LVS架构访问,当VIP发生…

keepalived脑裂现象

Keepealived最常见的问题是会出现脑裂现象: Master一直发送心跳消息给backup主机,如果中间的链路突然断掉,backup主机将无法收到master主机发送过来的心跳消息(也就是vrrp报文),backup这时候会立即抢占mas…

zookeeper的脑裂问题

关于集群中的"脑裂"问题,不清楚的可以看这里(https://www.cnblogs.com/kevingrace/p/7205846.html),下面重点说下 Zookeeper 脑裂问题的处理办法。ZooKeeper 是用来协调(同步)分布式进程的服务,提供了一个简单高性能的协调内核&…

什么是脑裂问题

所谓脑裂问题就是在多机热备的高可用系统中,当两个结点心跳突然断开,纠纷列为两个独立的个体,由于互相失去联系,都认为对方出现了故障,因此都会争抢对方的资源,这就是脑裂问题 当从节点们发现和主节点连接不…

集群脑裂问题分析

1.什么是集群脑裂 集群的脑裂通常是发生在集群中部分节点之间不可达而引起的(或者因为节点请求压力较大,导致其他节点与该节点的心跳检测不可用)。当上述情况发生时,不同分裂的小集群会自主的选择出master节点,造成原…

Redis中的常见问题(穿透、雪崩、脑裂)

文章目录 1.Redis的缓存穿透2.Redis缓存雪崩的问题3.Redis的脑裂问题 1.Redis的缓存穿透 2.Redis缓存雪崩的问题 3.Redis的脑裂问题 客户端向主服务器写入了数据 但是主服务器还没有来得及同步的情况下 主服务器死了 那么这个时候就会选举新的主服务器 原来的主服务器在一段时间…

脑裂是什么,zk是如何解决脑裂问题的

什么是脑裂 脑裂(split-brain)就是“大脑分裂”,也就是本来一个“大脑”被拆分了两个或多个“大脑”,我们都知道,如果一个人有多个大脑,并且相互独立的话,那么会导致人体“手舞足蹈”,“不听使唤”。 脑裂…

堆叠脑裂

堆叠脑裂 一、什么是堆叠脑裂二、堆叠脑裂的危害三、如何解决堆叠脑裂四、DAD是如何工作的五、DAD恢复机制:六、DAD检测方式:1、 业务口直连检测方式2、Eth-Trunk口代理检测方式3、管理网口检测方式4、堆叠端口检测方式 一、什么是堆叠脑裂 堆叠建立后&…

Redis 的脑裂现象和解决方案

Redis 中的脑裂是什么? 从名字分析,脑裂现象就是大脑裂开了,一个人如果有两个大脑,就出现了两个决策者,此时身体就不知道该听谁的了,势必会造成混乱。 对应到 Redis 上,就是指在主从集群中&am…