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

这篇具有很好参考价值的文章主要介绍了51驱动NRF24L01通信,NRF24L01与TTL转NRF24L01模块通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

NRF24L01

24l01 51单片机,电子模块测试,51单片机专栏,单片机,stm32,嵌入式硬件

一、简介

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

二、引脚功能描述

24l01 51单片机,电子模块测试,51单片机专栏,单片机,stm32,嵌入式硬件
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接线

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;
	}
}

实验现象
24l01 51单片机,电子模块测试,51单片机专栏,单片机,stm32,嵌入式硬件
下图,右边的20是发送成功标志,左边AA是发送的数据
24l01 51单片机,电子模块测试,51单片机专栏,单片机,stm32,嵌入式硬件

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

1、NRF24L01转TTL串口模块
24l01 51单片机,电子模块测试,51单片机专栏,单片机,stm32,嵌入式硬件
接收参数和发射参数需要设置成一样的才能通讯
24l01 51单片机,电子模块测试,51单片机专栏,单片机,stm32,嵌入式硬件
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、现象
24l01 51单片机,电子模块测试,51单片机专栏,单片机,stm32,嵌入式硬件

总结

NRF24L01模块不支持热插拔,热插拔会损坏模块;代码调试的过程还有些小BUG,希望得到大佬指点,需要工程的在下方留言文章来源地址https://www.toymoban.com/news/detail-780166.html

到了这里,关于51驱动NRF24L01通信,NRF24L01与TTL转NRF24L01模块通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F103C8T6与2.4G无线模块NRF24L01连接

    最近使用到了这个2.4G无线模块NRF24L01,比蓝牙好用,需要同时使用两个来用,它长这样: 使用它需要代码支持,因此我在耗费了一些精力后,从网上东拼西凑了一些代码,修修补补后使它能够正常运行, 注意:我只测试了两个2.4G无线模块NRF24L01的连接。 下图是2.4G无线模块

    2024年02月12日
    浏览(46)
  • NRF24L01学习操作教程(二)——NRF实现一对一,一对多通讯

    上篇博客链接:https://blog.csdn.net/DIVIDADA/article/details/130599974?spm=1001.2014.3001.5501 以下单片机例程都是基于STM32 HAL库,在文档末尾,我会提供参考博客和源码程序的链接。 在CubeMx中配置单片机时钟、SPI通讯接口、NRF24L01接口等,并生成Keil工程 将NRF24L01的驱动程序的.c文件和.h文件

    2024年01月15日
    浏览(46)
  • STM32模拟SPI控制NRF24L01发送和接收

    NRF24L01是一款2.4Ghz ISM频段无线收发芯片。NRF24L01模块可视为无需配对和连接型的WIFI或蓝牙模块。NRF24L01可工作于1发6收工作模式。一个NRF24L01模块工作于发送模式时,每次根据设定的接收端地址发送射频信号和数据;一个NRF24L01模块工作于接收模式时,可以接收来自1~6个发送端

    2024年02月08日
    浏览(47)
  • 基于江科大STM32利用NRF24L01向电脑发送 汉字、字符、数字、浮点数。

    最近在使用stm32单片机时,有一个需求,就是通过NRF24L01向电脑发送数据,学习了部分教程后,发现目前分享的程序里基本只能发送简单的16进制数,并不能发送汉字、字符、数字、浮点数等,于是在其基础上进行改进,目前可以实现发送汉字、字符、数字、浮点数,需要源码

    2024年04月10日
    浏览(45)
  • STM32在使用NRF24L01中PC(电脑)连接无显示数据以及出现error的解决办法

    1.1 问题情况 在使用 正点原子 的代码中有以下这样一段代码: 我们可以看到,这里调用了 NRF24L01 的自检函数 ,用于判断自检是否通过,当自检不通过时,在LCD上就会显示 NRF24L01 Error 1.2 解决办法 其实这个问题是 引脚冲突的问题 ,我们可以在正点原子提供的原理图(这里我

    2024年01月23日
    浏览(56)
  • STM32F103C8T6实验代码之NRF24L01P 多发一收

    NRF24L01P射频芯片,比NRF24L01具有更高的可靠性,更多的功 率等级,以及更远的传输距离和更低的功率。此外还内置RFX2401功放芯片, 内建LNA,接收灵敏度 提高10dBm,工作在2.4GHz~2.5GHz的ISM频段。 电压:最小值=1.9V;典型值=3.0V;最大值=3.6V; 如果要接入5V,需要使用电阻进行分压

    2024年02月06日
    浏览(51)
  • stm32驱动NRF24L01_原理+代码解析

    目录 概念 废话篇(24L01简介) 引脚分配 工作模式 通信地址理解(个人疑难点) 原理分析 寄存器赏析 寄存器操作指令  配置寄存器(CONFIG,位置:0X00)  自动应答使能寄存器(EN_AA,0X01) RX地址使能寄存器(EN_RXADDR,0X02)  自动重发设置寄存器(SETUP_RETR,0X04)  射频频

    2024年01月18日
    浏览(45)
  • 关于STC89C5x系列USB转TTL模块CH340驱动安装失败,预安装成功的解决办法

      这里会讲到单片机USB转TTL模块的CH340驱动安装失败和驱动预安装成功的问题解决。 首先,先说,安装失败不仅仅是告诉你“驱动安装失败”才算,如果提示“驱动预安装成功”也算失败。这里作者用的是普中A7的开发板,和A其他系列都大同小异。直接开讲! 1.安装失败原因

    2024年02月05日
    浏览(63)
  • 51单片机——模拟I2C总线与AT24C02通信

    目录 一、写在前面 二、功能描述 三、主要模块介绍 3.1 I2C总线介绍 3.2 I2C总线协议 3.2.1数据有效规定 3.2.2起始信号和停止信号  3.2.3 发送应答和接收应答 3.2.4 主机发送一个字节和接收一个字节 3.3 AT24C02介绍 3.3 字节写和随机读 四、测试文件test.c 五、现象描述 AT24C02芯片有I

    2024年02月14日
    浏览(56)
  • nRF51822 入门必备教程(一篇搞定nRF51)

    部署PC端开发环境 nRFgo Studio v1.14或更高版本 Keil MDK-ARM Lite v4.54或更高版本 J-Link Software v4.52b或更高版本 下载手机端app IOS系统:进入App Store并搜索“ nRFToolbox ” Android系统(4.3或更高):下载nRFToolbox,解压后安装即可 注意:蓝牙4.0和传统蓝牙的开发方法不同,首先需要手机支持蓝

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包