IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 学习笔记——NRF24L01 -> 正文阅读

[嵌入式]学习笔记——NRF24L01

1、什么是nRF24L01

nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。有着极低的电流消耗。
无线收发器包括:频率发生器、增强型“SchockBurst”模式控制器、功率放大器、晶体振荡器、调制器和解调器。

nRF24L01与5V单片机的连接通过SPI接口进行通讯,输出功率频道选择和协议的设置可以通过SPI 接口进行设置,几乎可以连接到各种单片机芯片,并完成无线数据传送工作。

2、接口电路

在这里插入图片描述
VCC脚接电压范围1.9V~3.6V,超过3.6V将会烧毁模块。一般电压3.3V左右。除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口直接相连,无需电平转换。

nRF24L01无线模块
在这里插入图片描述
nRF24L01芯片
在这里插入图片描述

3、引脚说明

在这里插入图片描述
通过以下六个引脚,便可实现模块的所有功能:
(1)MOSI:主器件数据输出,从器件数据输入
(2)MISO:主器件数据输入,从器件数据输出
(3)SCLK:时钟信号,由主器件产生
(4) CSN :从器件使能信号(片选线)
(5)CE:芯片使能,使能器件的发送模式或者接收模式。高电平有效,在发送和接收过程中都要将这个引脚拉高,
(6)IRQ:中断信号线,中断输出。低电平有效,中断时变为低电平,在以下三种情况变低:Tx FIFO 发完并且收到ACK(使能ACK情况下)、Rx FIFO收到数据、达到最大重发次数。

通过 SPI 接口,可激活在数据寄存器 FIFO 中的数据,或者通过 SPI 命令访问寄存器。
在待机或掉电模式下,单片机通过 SPI 接口配置模块;
在发射或接收模式下,单片机通过 SPI 接口接收或发射数据。

4、工作模式:

工作模式由 CE 和 PWR_UP (CONFIG寄存器第1位)、 PRIM_RX(CONFIG寄存器第0位) 两寄存器共同操纵:
在这里插入图片描述
也可以理解为NRF2401有工作模式有四种:
收发模式,配置模式,空闲模式,关机模式

收发模式有Enhanced ShockBurstTM收发模式、ShockBurstTM收发模式和直接收发模式三种。只有Enhanced ShockBurstTM收发模式支持自动ACK和自动重发,开启自动ACK,则默认选择Enhanced模式。

Enhanced ShockBurstTM收发模式(常用)
NRF24L01自动处理字头和CRC校验码。在接收数据时,自动把字头和CRC校验码移去。在发送数据时,自动加上字头和CRC校验码,在发送模式下,置CE为高,至少10us,将使能发送过程。
ShockBurstTM收发模式
发送方要求终端设备在接收到数据后有应答信号,以便发送方检测有无数据丢失,一旦丢失则重发数据。数据重发设置寄存器可设置其重发次数及在未收到应答信号后等待重发的时间。
直接收发模式
工作在该模式下的nRF2401 就像传统的射频器件一样。数据必须是在传输频率为1Mbps、250kbps 或者低频状态进行设定,以保证接收机能探测到信号。

在接收模式下,最多可以接收6路不同的数据。每一个数据通道使用不同的地址,但是共用相同的频道。也就是说6 个不同的NRF24L01设置为发送模式后可以与同一个设置为接收模式的NRF24L01 进行通讯,而设置为接收模式的NRF24L01可以对这6个发射端进行识别。
数据通道0是唯一的一个可以配置为40位自身地址的数据通道;而数据通道1~5 都为8位自身地址和32位公用地址(由通道1设置)。所有的数据通道都可以设置为Enhanced ShockBurst 模式。

在接收端,确认收到数据后记录地址,并以此地址为目标地址发送应答信号。在发送端,通道0被用作接收应答信号,因此通道0的接收地址要与发送地址端地址相等,以确保接收到正确的应答信号。
配置模式 15 字节的配置字会在配置模式时下载到nRF2401 中,CE为0才能配置。
空闲模式(睡眠/待机模式):用来减小平均电流的损耗,在该模式下,晶体振荡器处于部分工作状态,电流损耗由晶体振荡器频率决定。在待机模式期间,寄存器配置字内容保持不变。
掉电模式:nRF20L01 各功能关闭,保持电流消耗最小。该模式下,nRF24L01 停止工作,当设备达不到最小的电流损耗或最大电量枯竭时,设备就会进入掉电模式。

5、发送

Enhanced ShockBurstTM发送流程
1.把地址和要发送的数据按时序送入NRF24L01;
2.配置CONFIG寄存器,使之进入发送模式;
3.微控制器把CE置高(至少10us),激发Enhanced ShockBurstTM发射;
4.Enhanced ShockBurstTM发射:
①给射频前端供电;
②射频数据打包(加字头、CRC校验码);
③高速发射数据包;
④发射完成,NRF24L01进入空闲状态。

Enhanced ShockBurstTM发送模式初始化
发射模式Tx模式初始化过程
1))写Tx节点的地址 TX_ADDR
2)写Rx节点的地址RX_ADDR_P0(主要是为了使能 Auto Ack)
3)使能AUTO ACK EN_AA
4)使能PIPE 0 EN_RXADDR
5)配置自动重发次数SETUP_RETR
6)选择通信频率RF_CH。频率计算公式:2400+RF_CH (Mhz)
7)配置发射参数RF_SETUP(低噪放大器增益、发射功率、无线速率)
8 )选择通道0有效数据宽度Rx_Pw_P0
9)配置24L01的基本参数以及切换工作模式CONFIG。

6、接收

Enhanced ShockBurstTM接收流程
1.配置接收地址和要接收的数据包大小;
2.配置CONFIG寄存器,使之进入接收模式,把CE置高;
3. 130us后,NRF24LO1进入监视状态,等待数据包的到来;
4.当接收到正确的数据包(正确的地址和CRC校验码),NRF2401自动把字头、地址和CRC校验位移去;
5.NRF24LO1通过把STATUS寄存器的RX_DR置位(STATUS一般引起微控制器中断)通知微控制器;
6.微控制器把数据从FIFO读出(0X61指令);
7.所有数据读取完毕后,可以清除STATUS寄存器。进入四种主要的模式之—。

Enhanced ShockBurstTM接收模式初始化
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。

7、SPI指令

所有的 SPI 指令均在当 CSN 由低到高开始跳变时执行;从 MOSI 写命令的同时, MISO实时返回 24L01 的状态值; SPI 指令由命令字节和数据字节两部分组成。
在这里插入图片描述
在这里插入图片描述

8、寄存器内容及说明

在写寄存器之前,一定要进入待机模式或掉电模式。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

9、主要函数

初始化NRF24L01到TX模式

/*********************************************************************************************************
*函数:void NRF24L01_TX_Mode(void)
*输入:无
*输出:无
*功能:初始化NRF24L01到TX模式
*配置:	1、设置TX地址
				2、设置TX数据宽度,发送与接收必须一致
				3、清除TX FIFO寄存器,保证开始是干净的
				4、清除所有中断,防止一进去就触发中断,写1清除中断
				5、设置重发次数和重发间隔
				6、设置工作频率,收发必须一致
				7、设置发射速率和发射功率
				8、设置为发送模式,且设置是否开启中断,若开启则有中断IRQ就置低响应后自动恢复高电平,若不开就一直高

*中断:	1、TX_FIFO发送完成,并收到ACK(使能ACK的情况下),会产生中断
				2、达到最大重发次数,会产生中断
*********************************************************************************************************/
void NRF24L01_TX_Mode(void)
{
	NRF2401_CSN_HIGH;		//开始先置高防止误写入,在每一次写入寄存器的时候会置低
	Delay_us(10);
	NRF2401_SCK_LOW;		//时钟信号先置低
	
	SPI_Write_Buf(NRF24L01_WRITE_REG + TX_ADDR,(uint8_t*)TX_ADDRESS,TX_ADR_WIDTH);    //写要发送的地址,二者必须一致,接收的时候不需要写这一句,写一句不耽误事以防万一
  SPI_Write_Buf(NRF24L01_WRITE_REG + RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH); //写自己的地址,二者必须一致,发送的时候不需要写这一句,写一句不耽误事以防万一
	SPI_Write_Buf(WR_TX_PLOAD,TxBuf,TX_PLOAD_WIDTH);		//设置发送的数据长度,本次设置为32字节,发送与接收必须一致
	SPI_RW_Reg(FLUSH_TX,0xFF);													//清除TX FIFO寄存器,保证开始是干净的
	SPI_RW_Reg(NRF24L01_WRITE_REG + STATUS,0X70);				//清除所有中断,防止一进去接收模式就触发中断,写1清除中断
	SPI_RW_Reg(NRF24L01_WRITE_REG + EN_AA, 0x00);      	//使能通道0的自动应答	ACK应答允许
	SPI_RW_Reg(NRF24L01_WRITE_REG + EN_RXADDR, 0x01);  	//EN_RXADDR=0000 0001允许接收地址只有频道0,如果需要多频道可以参考Page21 
	
	SPI_RW_Reg(NRF24L01_WRITE_REG + SETUP_RETR, 0x00);	//设置自动重发间隔时间:500us一次,自动重发次数:10次,10*500=5ms
	
	SPI_RW_Reg(NRF24L01_WRITE_REG + RF_CH, 0x00);        	//设置信道工作为2.4GHZ,收发必须一致,2400M+X(0<X<126M)
	SPI_RW_Reg(NRF24L01_WRITE_REG + RF_SETUP, 0x07);   	//设置发射速率为1MHZ,发射功率为最大值0dB
	/* 0x01:1MHZ和-18dB | 0x03:1MHZ和-12dB | 0x05:1MHZ和-6dB | 0x07:1MHZ和0dB|||||0x09:2MHZ和-18dB | 0x0B:2MHZ和-12dB | 0x0D:2MHZ和-6dB | 0x0E:2MHZ和0dB*/
	SPI_RW_Reg(NRF24L01_WRITE_REG + CONFIG, 0x0E);			//配置基本工作模式的参数;PWR_UP,EN_CRC,16位CRC,发送模式,开启所有中断
	EXTI_ClearITPendingBit(EXTI_Line8);
	NRF2401_CE_HIGH;
	Delay_us(130);
}

初始化NRF24L01到RX模式

/*********************************************************************************************************
*函数:void NRF24L01_RX_Mode(void)
*输入:无
*输出:无
*功能:初始化NRF24L01到RX模式
*配置:	1、通道使能,六个通道根据自己需要开启使能以及以下配置
				2、设置RX地址
				3、设置RX数据宽度,发送与接收必须一致
				4、设置工作频率,收发必须一致
				5、设置发射速率和发射功率
				6、设置为接收模式,且设置是否开启中断,若开启则有中断IRQ就置低响应后自动恢复高电平,若不开就一直高
				7、清除RX FIFO寄存器,保证开始是干净的

*中断:	1、RX_FIFO收到指定长度的有效数据(RX_PW_Px),会产生中断
*********************************************************************************************************/
void NRF24L01_RX_Mode(void)
{
	NRF2401_CSN_HIGH;	//开始先置高防止误写入,在每一次写入寄存器的时候会置低
	Delay_us(10);
	NRF2401_SCK_LOW;	//时钟信号先置低	
	
	SPI_Write_Buf(NRF24L01_WRITE_REG + TX_ADDR,(uint8_t*)TX_ADDRESS,TX_ADR_WIDTH);  	//写要发送的地址,二者必须一致,接收的时候不需要写这一句,写一句不耽误事以防万一
	SPI_Write_Buf(NRF24L01_WRITE_REG + RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH); //写自己的地址,二者必须一致,发送的时候不需要写这一句,写一句不耽误事以防万一
	
	SPI_RW_Reg(FLUSH_RX,0xFF);																	//清除RX FIFO寄存器,保证开始是干净的
	SPI_RW_Reg(NRF24L01_WRITE_REG + EN_AA, 0x00);      					//频道0自动ACK应答, 7-6位默认值00,0-5位:使能0-5通道的自动应答功能
	SPI_RW_Reg(NRF24L01_WRITE_REG + EN_RXADDR, 0x01);  					//允许接收地址只有频道0,如果需要多频道可以参考Page21
	SPI_RW_Reg(NRF24L01_WRITE_REG + RF_CH, 0x00);        					//设置工作频率,收发必须一致,2400M+X(0<X<126M)
	SPI_RW_Reg(NRF24L01_WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); 	//设置P0接收数据长度,本次设置为32字节,发送与接收必须一致
	SPI_RW_Reg(NRF24L01_WRITE_REG + RF_SETUP, 0x07);   					//设置发射速率为1MHZ,发射功率为最大值0dB,这句话虽然是设置发送的但必须要有
	/* 0x01:1MHZ和-18dB | 0x03:1MHZ和-12dB | 0x05:1MHZ和-6dB | 0x07:1MHZ和0dB|||||0x09:2MHZ和-18dB | 0x0B:2MHZ和-12dB | 0x0D:2MHZ和-6dB | 0x0E:2MHZ和0dB*/
	SPI_RW_Reg(NRF24L01_WRITE_REG + CONFIG, 0x0f);   						//最重要的一个配置,IRQ收发完成中断响应,16位CRC,接收模式,接收到时IRQ会置低,接收到后自动恢复高电平
	NRF2401_CE_HIGH;
	Delay_us(130);
}

发送数据函数

/*********************************************************************************************************
*函数:nRF24L01_TxPacket(unsigned char* rx_buf)
*输入:unsigned char* rx_buf 要发送的数据
*输出:返回0x10说明达到最发重发次数,返回0x20说明发送成功,返回0xFF说明发送错误
*功能:发送 tx_buf 中数据
*配置:尽量配置一下TX_PLOAD_WIDTH,发送的长度,最高32字节,设置太高没必要后面都是0无效数据
*********************************************************************************************************/
unsigned char NRF24L01_TxPacket(u8 *tx_buf)
{
	u8 sta;	
	EXTI->IMR&=~(EXTI_Line8);//关闭中断
	NRF2401_CE_LOW;																		//只有在 CE=0 时才能对NRF24L01进行设置,否则易出现问题 
	SPI_Write_Buf(NRF24L01_WRITE_REG + RX_ADDR_P0,(uint8_t*)TX_ADDRESS,TX_ADR_WIDTH); //装载接收端地址
	SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); //装载数据,以及发送数据的长度
	//SPI_RW_Reg(NRF24L01_WRITE_REG + CONFIG, 0x0e);   	//IRQ收发完成中断响应,16位CRC,主发送
	NRF2401_CE_HIGH;		 															//置高CE,激发数据发送
	Delay_us(10);																			//CE拉高后必须有一个10us以上的延时
	
	while(GPIO_ReadInputDataBit(NRF2401_IRQ_PORT,NRF2401_IRQ_PIN));		//发送完成IRQ会拉低,自动置高
	sta = SPI_Read(STATUS);
	SPI_RW_Reg(FLUSH_TX,0xff);												//把TX_FIFO清空,就发一次
	SPI_RW_Reg(NRF24L01_WRITE_REG + STATUS, sta);
	if(sta&STATUS_MAX)																//判断是否达到最大重发次数
	{
		
		SPI_RW_Reg(FLUSH_TX,0xff);											//清除TX FIFO寄存器 
		EXTI->IMR|=EXTI_Line8;//打开中断
		return STATUS_MAX;															//返回0x10
	}
	
	if(sta&STATUS_TX)																	//判断是否发送完成
	{
		EXTI->IMR|=EXTI_Line8;
		return STATUS_TX;																//返回0x20	
	}
	EXTI->IMR|=EXTI_Line8;
	return 0xff;																			//发送失败,返回0xFF
}

接收数据函数

/*********************************************************************************************************
*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
*输入:unsigned char* rx_buf 要放入数据缓冲区的数据
*输出:revale 读取完成标志 0:没接收到数据 1:接收到数据
*功能:数据读取后放如rx_buf接收缓冲区中
*********************************************************************************************************/
unsigned char NRF24L01_RxPacket(u8 *rx_buf)
{
  u8 revale=0,sta=0;
	sta=SPI_Read(STATUS);															//读取状态寄存其来判断数据接收状况
	if(sta&STATUS_RX)																	//判断是否接收到数据
	{
		NRF2401_CE_LOW ; 																//使能待机
		SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//数据读取后放入rx_buf接收缓冲区中
		revale =1;																			//读取数据完成标志
		
		SPI_RW_Reg(NRF24L01_WRITE_REG+STATUS,sta);   		//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
		SPI_RW_Reg(FLUSH_RX,0xff);											//清除接收缓冲器
		NRF2401_CE_HIGH; 			
	}
	return revale;																		//返回0说明没收到
}

此外,还应有系统的初始化,主要有GPIO初始化,SPI初始化,NRF24L01中断初始化。

在GPIO初始化中,需要注意各引脚的工作模式:
SPI时钟,设置为复用推挽输出
SPI输出引脚(SOMI),设置为复用推挽输出
SPI输入引脚(SOMO),设置为悬浮输入
CS、CE引脚,使用软件控制,所以直接设置成推挽输出

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 11:00:44  更:2022-08-06 11:01:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:14:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码