【STM32】2.4G无线模块nRF24L01驱动编写说明


一、nRF24L01+模块介绍

  nRF24L01+是一款单芯片2.4GHz收发器,适用于超低功耗无线应用。nRF24L01+设计在2.400-2.4835GHz的全球ISM频段内运行。
  要设计一个使用nRF24L01+的无线电系统,只需要一个单片机(微控制器)和一些外部无源组件。
  可以通过串行外设接口(SPI)来操作和配置nRF24L01+。寄存器图包含nRF24L01+中的所有配置寄存器,可通过SPI访问,并可在芯片的所有操作模式下访问。
  nRF24L01+与nRF24L01在线兼容,与nRF2401A、nRF2402、nRF24E1和nRF24E2在线兼容。与nRF24L01相比,nRF24L01+中的互调和宽带阻塞值有了很大改善,在nRF24L01+中添加内部滤波提高了满足射频调节标准的边际。

1.运行电压要求

在这里插入图片描述
  3.3V供电即可。

2.模块引脚定义与原理图

在这里插入图片描述
在这里插入图片描述
  与单片机连接为4线SPI接口,此外需要CE输出口以及IRQ中断输入口。

二、寄存器配置

1.工作模式说明

在这里插入图片描述
接收模式(RX mode):接收数据的模块配置成此模式。

发送模式(TX mode):发送数据的模块配置成此模式。数据存在TX FIFO寄存器中。
  a.如果CE保持高位,则清空所有TX FIFO,并执行所有必要的确认和可能的重新传输。只要重新填充TX FIFO,传输就会继续。如果TX FIFO为空时,CE仍然处于高电平,则nRF24L01+进入待机-II模式。在这种模式下,在向TX FIFO上传数据包(UL)后,一旦CSN设置为高,数据包的传输就开始了。
  b.该工作模式下,CE高脉冲至少持续10µs。这就会传输一个数据包。这是正常操作模式。数据包传输后,nRF24L01+进入待机状态-I模式。

掉电模式(Power Down):PWR_UP位寄存器写0

2.寄存器命令与地址

  这里Data Sheet中的篇幅太长(P51&P57-P63),就直接放程序里的定义了。
在这里插入图片描述
在这里插入图片描述
  其中,配置工作模式需要使用命令:写配置寄存器,加上寄存器地址CONFIG。该寄存器各个位的定义为:
在这里插入图片描述
7位:只能写0
6-4位:中断使能设置
3位:CRC校验使能
2位:1or2字节CRC
1位:电源
0位:RX/TX控制
  根据工作模式配置图,注意1和0位的配置,加上CE引脚的电平,就可以配置工作模式。

ep:配置模块为接收RX模式

NRF24L01_Write_Reg(nRF_WRITE_REG + CONFIG, 0x0f); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断

  其他寄存器配置参考Data Sheet,形式同上。

3.发送过程

  模块配置为发送模式后,将数据写入发送的数组中,直接启动发送函数,发送函数在读取到发送完毕的中断标志TX_DS后,清除中断标志,以便下次发送。

4.接收过程

  模块配置为接收模式后,当收到其他模块发送的一帧数据,STATUS寄存器的RX_DR位被置1,且触发中断,反馈在IRQ引脚上。读取数据后,需要清除中断标志以及清空RX_FIFO寄存器,否则无法进行下一次的接收。
在这里插入图片描述

三、nRF24L01模块配置代码

  使用MCU型号为STM32F103REx,库为HAL库,操作系统rt-thread-2.0.0_beta版本,注意此程序引脚初始化的方式有所不同。
头文件 24L01.h

/**
	********************************************************************
	*	@file			24L01.h
	*	@version       
	*	@date			
	*	@brief
	********************************************************************
	*	@attention
	********************************************************************
	*/
#ifndef _24L01_H_
#define _24L01_H_

#include <stm32xxxx.h>
//#include <rtthread.h>

/**********  RF通道  ***********/
#define NRF24L01_Channel 	0

/**********  NRF24L01寄存器操作命令  ***********/
#define nRF_READ_REG    0x00  //读配置寄存器,低5位为寄存器地址
#define nRF_WRITE_REG   0x20  //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
#define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发送模式下用
#define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
#define NOP             0xFF  //空操作,可以用来读状态寄存器	 
/**********  NRF24L01寄存器地址   *************/
#define CONFIG          0x00  //配置寄存器地址                             
#define EN_AA           0x01  //使能自动应答功能 
#define EN_RXADDR       0x02  //接收地址允许
#define SETUP_AW        0x03  //设置地址宽度(所有数据通道)
#define SETUP_RETR      0x04  //建立自动重发
#define RF_CH           0x05  //RF通道
#define RF_SETUP        0x06  //RF寄存器
#define STATUS          0x07  //状态寄存器
#define OBSERVE_TX      0x08  // 发送检测寄存器
#define RPD             0x09  // 载波检测寄存器
#define RX_ADDR_P0      0x0A  // 数据通道0接收地址
#define RX_ADDR_P1      0x0B  // 数据通道1接收地址
#define RX_ADDR_P2      0x0C  // 数据通道2接收地址
#define RX_ADDR_P3      0x0D  // 数据通道3接收地址
#define RX_ADDR_P4      0x0E  // 数据通道4接收地址
#define RX_ADDR_P5      0x0F  // 数据通道5接收地址
#define TX_ADDR         0x10  // 发送地址寄存器
#define RX_PW_P0        0x11  // 接收数据通道0有效数据宽度(1~32字节) 
#define RX_PW_P1        0x12  // 接收数据通道1有效数据宽度(1~32字节) 
#define RX_PW_P2        0x13  // 接收数据通道2有效数据宽度(1~32字节) 
#define RX_PW_P3        0x14  // 接收数据通道3有效数据宽度(1~32字节) 
#define RX_PW_P4        0x15  // 接收数据通道4有效数据宽度(1~32字节)
#define RX_PW_P5        0x16  // 接收数据通道5有效数据宽度(1~32字节)
#define FIFO_STATUS     0x17  // FIFO状态寄存器
/*——————————————————————————————————————————————————*/

/******  STATUS寄存器中断bit位定义  *******/
#define MAX_TX  	0x10  	  //达到最大发送次数中断
#define TX_OK   	0x20  	  //TX发送完成中断
#define RX_OK   	0x40  	  //接收到数据中断
/*——————————————————————————————————————————————————*/

/*********  24L01发送接收数据宽度定义	  ***********/
#define TX_ADR_WIDTH    5     //5字节地址宽度
#define RX_ADR_WIDTH    5     //5字节地址宽度
#define TX_PLOAD_WIDTH  32    //32字节有效数据宽度
#define RX_PLOAD_WIDTH  32    //32字节有效数据宽度

/* NRF24L01端口定义 */
#define NRF24L01_PWR_gpio        C
#define NRF24L01_PWR_pin         10
#define NRF24L01_PWR_gpio_mode   Out_PP
#define NRF24L01_PWR			 PCout(NRF24L01_PWR_pin)
#define NRF24L01_IRQ_gpio        A
#define NRF24L01_IRQ_pin         8
#define NRF24L01_IRQ_gpio_mode   IPU
#define NRF24L01_IRQ   			 PAin(NRF24L01_IRQ_pin)

#define NRF24L01_CE_gpio         B
#define NRF24L01_CE_pin          11
#define NRF24L01_CE_gpio_mode    Out_PP
#define NRF24L01_CE   			 PBout(NRF24L01_CE_pin)

#define NRF24L01_CSN_gpio        B
#define NRF24L01_CSN_pin         12
#define NRF24L01_CSN_gpio_mode   Out_PP
#define NRF24L01_CSN   			 PBout(NRF24L01_CSN_pin)

#define NRF24L01_SCK_gpio        B
#define 
  • 6
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值