2.4G模块NRF24L01调试经验

article/2025/9/21 0:34:04

参照野火STM32程序调试NRF24L01成功,颇获喜感

nRF24L01是一款工作在2.4~2.5GHz世界通用ISM频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型SchockBurstTM模式控制器、功率放大器、警惕振荡器、调制器、解调器。输出功率、频道选择和协议的设置可以通过SPI接口进行设置。

模块外形图如下图所示:                 PCB和引脚示意图如下图所示:

          

电路图如图所示:



VDD电压范围为1.9V~3.6V,我使用的是3.3V,与单片机的通信接口类型为SPI,读写时序如下图所示:


与开发板硬件连接如下:

 * 硬件连接:----------------------------—----|
            |  PA5-SPI1-SCK     : NRF -SCK  |
            |   PA6-SPI1-MISO  : NRF -MISO |
            |   PA7-SPI1-MOSI  : NRF -MOSI |
            |   PA4          : NRF -CE     |
 *          |   PA3                       : NRF -CSN  |
            | PA2          : NRF -IRQ    |
 *           -------------------------------------------

引脚配置如下:

  /*配置 SPI_NRF_SPI的 SCK,MISO,MOSI引脚,GPIOA^5,GPIOA^6,GPIOA^7 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用功能GPIO_Init(GPIOA, &GPIO_InitStructure);  /*配置SPI_NRF_SPI的CE引脚,GPIOA^4和SPI_NRF_SPI的 CSN 引脚: NSS GPIOC^4*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);/*配置SPI_NRF_SPI的IRQ引脚,GPIOA^2*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;  //上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure); 
SPI配置如下:

  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;    //双线全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master;	 		        //主模式SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;	 		//数据大小8位SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;		 		//时钟极性,空闲时为低SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;				//第1个边沿有效,上升沿为采样时刻SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		   		//NSS信号由软件产生SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;    //8分频,9MHzSPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  		        //高位在前SPI_InitStructure.SPI_CRCPolynomial = 7;SPI_Init(SPI1, &SPI_InitStructure);/* Enable SPI1  */SPI_Cmd(SPI1, ENABLE);

配置进入接收模式:

void NRF_RX_Mode(void)
{NRF_CE_LOW();	SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);    //使能通道0的自动应答    SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址    SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);      //设置RF通信频率    SPI_NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度      SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x07); //设置TX发射参数,0db增益,1Mbps,低噪声增益开启   SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG, 0x0f);  //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式NRF_CE_HIGH(); /*CE拉高,进入接收模式*/ delay_ms(100); //CE拉高一段时间
}    
配置进入发射模式:

void NRF_TX_Mode(void)
{  NRF_CE_LOW();		SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);    //写TX节点地址; SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK;   SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答;    SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址;  SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次;SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);   //设置RF通道为CHANAL;SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x07);  //设置TX发射参数,0db增益,1Mbps,低噪声增益开启;   SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,发射模式,开启所有中断;
/*CE拉高,进入发送模式*/	NRF_CE_HIGH();delay_ms(100); //CE要拉高一段时间才进入发送模式
}
NRF24L01的开机自检:

u8 NRF_Check(void)
{u8 buf[5]={0xC2,0xC2,0xC2,0xC2,0xC2};u8 buf1[5];u8 i; SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,buf,5); /*写入5个字节的地址.  */  SPI_NRF_ReadBuf(TX_ADDR,buf1,5); /*读出写入的地址 */	              for(i=0;i<5;i++)   	/*比较*/ {if(buf1[i]!=0xC2)break;}   if(i==5)return SUCCESS ;        //MCU与NRF成功连接 elsereturn ERROR ;        //MCU与NRF不正常连接
}
数据发送:

u8 NRF_Tx_Dat(u8 *txb)
{u8 state;  NRF_CE_LOW(); /*ce为低,进入待机模式1*/						SPI_NRF_WriteBuf(WR_TX_PLOAD,txb,TX_PLOAD_WIDTH);	/*写数据到TX BUF 最大 32个字节*/NRF_CE_HIGH();	  /*CE为高,txb非空,发送数据包 */   	  		                           while(NRF_Read_IRQ()!=0);  /*等待发送完成中断 */  	state = SPI_NRF_ReadReg(STATUS); /*读取状态寄存器的值 */ SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,state); /*清除TX_DS或MAX_RT中断标志*/ 	SPI_NRF_WriteReg(FLUSH_TX,NOP);    //清除TX FIFO寄存器 /*判断中断类型*/    if(state&MAX_RT)                     //达到最大重发次数return MAX_RT; else if(state&TX_DS)                  //发送完成return TX_DS;elsereturn ERROR;                 //其他原因发送失败
} 
数据接收,可放在主函数里循环检测,也可更换为中断模式检测:

u8 NRF_Rx_Dat(u8 *rxb)
{u8 state; NRF_CE_HIGH();	 //进入接收状态/*等待接收中断*///while(NRF_Read_IRQ()!=0);/// NRF_CE_LOW();  	 //进入待机状态	             state = SPI_NRF_ReadReg(STATUS);	/*读取status寄存器的值*/  if(state&RX_DR)  /*判断是否接收到数据*/  //接收到数据{									     SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,state);/* 清除中断标志*/ SPI_NRF_ReadBuf(RD_RX_PLOAD,rxb,RX_PLOAD_WIDTH);//读取数据
//	    SPI_NRF_WriteReg(FLUSH_RX,NOP);          //清除RX FIFO寄存器return RX_DR; }else    return ERROR;                    //没收到任何数据
}

主循环任务程序如下:

void nrf_task(void *pdata)
{while(NRF_Check()!=SUCCESS){<span style="white-space:pre">	</span>delay_ms(100);}NRF_TX_Mode();//主动请求连接nrf_Txbuf[0]='H';nrf_Txbuf[1]='E';nrf_Txbuf[2]='L';nrf_Txbuf[3]='L';nrf_Txbuf[4]='0';do{ 	  status = NRF_Tx_Dat(nrf_Txbuf);}while((status != TX_DS)&(status != MAX_RT));//发送成功或者到达最大重发次数<span style="white-space:pre">	</span>if(status == MAX_RT) {	 USART1_printf( USART1,"Connection Failed\r\n");}<span style="white-space:pre">	</span>memset(nrf_Txbuf,0,sizeof(nrf_Txbuf));NRF_RX_Mode();//配置为接收模式while(1){/*等待接收数据*/status = NRF_Rx_Dat(nrf_Rxbuf);/*判断接收状态*/if(status == RX_DR)//接收到数据中断标志{Usb_SendData((char*)nrf_Rxbuf,strlen((char*)nrf_Rxbuf));//通过USB转发}if(0 != strlen((char*)nrf_Txbuf))//发送缓冲不为空{NRF_TX_Mode();//主动请求连接do{ 	  status = NRF_Tx_Dat(nrf_Txbuf);delay_ms(10);}while((status != TX_DS)&(status != MAX_RT));//发送成功或者到达最大重发次数memset(nrf_Txbuf,0,sizeof(nrf_Txbuf));NRF_RX_Mode();//配置为接收模式}delay_ms(100);}
}



http://chatgpt.dhexx.cn/article/v2w6oPGo.shtml

相关文章

小体积、高速率的nRF24L01芯片通信模块

在选择纯硬件通信模块时&#xff0c; 面对上述问题&#xff0c;AS01提供了很好的解决办法。 AS01系列模块是工作在2.4GHz(ISM频段)的纯硬件模块。此系列基于NORDIC原装nRF24L01P芯片方案开发&#xff0c;提供多种接口形式&#xff0c;具有高空速&#xff08;最高空速可达到2…

Arduino使用NRF24L01模块进行无线通信

Arduino使用NRF24L01模块进行无线通信 前言 ​ 其实CSDN有很多关于这个无线模块的使用&#xff0c;包括Arduino的使用例程&#xff0c;但是实际自己跟着做一遍的时候还是发现了有些小问题&#xff0c;于是记录一下方便以后做其他有意思的小项目。&#xff08;Arduino的库文件…

nRF24L01--2.4G无线通信模块(1)(51单片机和51单片机通信)

作者&#xff1a;李剀 出处&#xff1a;https://www.cnblogs.com/kevin-nancy/ 或者 https://blog.csdn.net/Kevin_8_Lee/article/details/95667604 欢迎转载&#xff0c;但也请保留上面这段声明。谢谢&#xff01;&#xff08;上面两个都是我的博客&#xff0c;只是在不同平台…

STM32控制NRF24L01无线模块进行通信

一.NRF2401无线模块 1.模块介绍 功能介绍 (1)2.4Ghz 全球开放ISM 频段免许可证使 2) 最高工作速率2Mbps&#xff0c;高效GFSK调制&#xff0c;抗干扰能力强&#xff0c;特别适合工业控制场合 (3)126 频道&#xff0c;满足多点通信和跳频通信需要 (4) 内置硬件CRC 检错和点对…

NRF24L012.4G模块

文章目录 datasheet1. 相关案例&#xff1a;2. nRF24L01通信的常识1. 发送模式。1.5 补充spi一点知识1. SPI读写时序2. 工作模式2.1 收发模式Enhanced ShockBurstTM收发模式Enhanced ShockBurstTM发送流程&#xff1a;Enhanced ShockBurstTM接收流程&#xff1a; 3. SPI指令 3.…

STM32驱动NRF24L01无线模块

目录 一、模块简介二、工作模式三、主要命令四、配置寄存器五、状态寄存器六、接收模式七、发送模式八、STM32使用NRF24L01模块 一、模块简介 NRF24L01是NORDIC公司生产的一款无线通信芯片&#xff0c;采用FSK调制&#xff0c;内部集成NORDIC自己的Enhanced Short Burst 协议&…

nRF24L01无线模块笔记

nRF24L01模块 官网链接: https://www.nordicsemi.com/Products/nRF24-series 常见的无线收发模块, 工作在2.4GHz频段, 适合近距离遥控和数据传输. nRF24L01是一个能兼顾距离和数据速率的无线模块, 在空旷环境下&#xff0c;2M速率15米, 1M速率30米, 250K速率能达到50米. 和蓝牙…

NRF24L01+模块:一对一双向通信,成功!

查找了很多资料&#xff0c;好多都是复制粘贴转发&#xff0c;或者安装英文手册直译的&#xff08;比如我自己上篇笔记&#xff0c;&#xff0c;&#xff09;&#xff0c;看完还是一脸懵逼&#xff0c;没几个可行的&#xff0c;推荐几个比较实在的资料&#xff1a;手册我也不是…

NRF24L01 无线通信模块使用方法

原文出处&#xff1a;http://blog.csdn.net/mc_hust/article/details/39473913 昨天登录百度账号&#xff0c;无意间发现漏看了好多朋友的私信&#xff0c;其中不少是找我探讨关于NRF2401模块的。从12年到14年的信件都有&#xff08;平时很少注意系统提示信息。。。&#xff0…

STM32 + 无线通信模块 NRF24L01 数据收发

NRF24L01的模块资料&#xff0c;网上已很详尽了&#xff0c;在这不再重复描述知识点了。 这篇文章的目的&#xff0c;旨在把主要知识点胶接起来&#xff0c;梳理成一套完整的步骤&#xff0c;使器件快速上手汇入工作使用。 将按操作顺序&#xff0c;拆分成7个步骤&#xff0c;…

NRF24L01 无线模块

NRF24L01 简介 NRF24L01 可以实现点对点或者是1&#xff08;收&#xff09;对6&#xff08;发&#xff09;的无线通信。NRF24L01 采样SPI通信&#xff0c;很方便连接MCU NRF24L01 无线模块&#xff0c;采用的芯片是 NRF24L01&#xff0c;该芯片的主要特点如下&#xff1a; 1&a…

NRF2401模块

一、模块介绍 (1) 2.4Ghz 全球开放 ISM 频段免许可证使用 (2) 最高工作速率 2Mbps&#xff0c;高效 GFSK 调制&#xff0c;抗干扰能力强&#xff0c;特别适合工业控制场合 (3) 126 频道&#xff0c;满足多点通信和跳频通信需要 (4) 内置硬件 CRC 检错和点对多点通信地址控制…

Nrf24l01无线模块

Nrf24l01无线模块 一&#xff0c;模块介绍 二&#xff0c;接口电路&#xff0c; 模块连接注意点&#xff1a; (1) VCC 脚接电压范围为 1.9V~3.6V 之间&#xff0c;不能在这个区间之外&#xff0c;超 过 3.6V 将会烧毁模块。推荐电压 3.3V 左右。 (2) 除电源 VCC 和接地端&…

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

51驱动NRF24L01通信&#xff0c;NRF24L01与TTL转NRF24L01模块通信 NRF24L01一、简介二、引脚功能描述 程序设计一、对 24L01 的程序编程的基本思路如下&#xff1a;二、Tx 与 Rx 的配置过程1、Tx 模式初始化过程&#xff1a;2、Rx 模式初始化过程&#xff1a; 三、基本程序函数…

详解NRF24L01无线收发模块

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

nRF24L01芯片(模块)介绍

nRF24L01芯片&#xff08;模块&#xff09;简介 nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。无线收发器包括&#xff1a;频率发生器、增强型“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接口进行通讯&#xff0c;输出功率频道选择和协议的设置可以通过SPI 接口进行设置&#xff0c;几乎可以连接到各种单片…

分布式集群脑裂问题

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

分布式脑裂问题

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