当前位置: 首页 > article >正文

STM32传感器模块编程实践(十) 2.4G NRF24L01通信模块简介及驱动源码

文章目录

    • 一.概要
    • 二.NRF24L01模块介绍
    • 三.NRF24L01模块主要特性
    • 四.国产射频芯片SI24R1介绍
    • 五.模块接线说明
    • 六.参考原理图
    • 七.通讯协议介绍
    • 八.STM32单片机与NRF24L01模块实现远无线通讯实验
      • 1.硬件准备
      • 2.软件工程
      • 3.软件主要代码
      • 4.实验效果
    • 九.源代码工程下载
    • 十.小结

一.概要

NRF2401是单片射频收发芯片,工作于2.4~2.5GHz频段,芯片内置频率合成器、功率放大器、晶体振荡器和调制器等功能模块,输出功率和通信频道可通过程序进行配置。芯片能耗非常低,以-5dBm的功率发射时,工作电流只有10.5mA,接收时工作电流只有18mA,多种低功率工作模式,节能设计更方便。其DuoCeiverTM技术使NRF2401可以使用同一天线,同时接收两个不同频道的数据。NRF2401适用于多种无线通信的场合,如无线数据传输系统、无线鼠标、遥控开锁、遥控玩具等。

在这里插入图片描述

二.NRF24L01模块介绍

本模块采用国产射频芯片SI24R1,内部集成了所有与RF协议相关的高速信号处理部分,由于链路层完全集成在模块上,非常便于开发。自动检测和自动重发丢失的数据包,重发时间及重发次数可软件控制,自动存储未收到应答信号的数据包;在收到有效数据后,模块自动发送应答信号,无须另行编程,载波检测一固定频率检测,内置硬件CRC检错和点对多点通信地址控制数据包传输错误计数器及载波检测功能可用于跳频设置可同时设置六路接收通道地址,可有选择性的打开接收通道。
SI24R1的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口,便于使用低成本单片机。

三.NRF24L01模块主要特性

1.板载2.4G PCB天线,ISM频段,标准插针DIP2.54mm间距接口,体积小巧,便于嵌入式应用。
2.支持六路通道的数据接收(一对六)
3.支持GFSK/FSK等通用调制方式
4.支持2Mbps/1Mbps/250Kbps 数据速率,可设不同的发射功率
5.多频点:126频点,满足多点通信和跳频通信需要2400MHz~2525MHz,1MHz跳频步进
6.内部集成高PSRR的LDO
7.宽电源电压范围:1.9~3.6V,典型3.3V
8.平均发射电流低至25mA(7dBm)
9.接收灵敏度:-83dBm@2Mhz
10.发射功率可高达+7dBm
11.采用四线SPI接口,速率可达10MHZ
12.内部集成智能ARQ基带协议引擎
13.收发数据硬件中断输出
14.支持1bit RSSl输出
15.工作温度:-20℃~85℃

四.国产射频芯片SI24R1介绍

在这里插入图片描述
Si24R1是一颗工作在 2.4GHz ISM 频段,专为低功耗无线场合设计,集成嵌 入式 ARQ 基带协议引擎的无线收发器芯 片 。Si24R1 采用 GFSK/FSK 数字调制与解调技术。数据传输速率与 PA 输出功率都可以调节,支持 2Mbps,1Mbps,250Kbps 三种数据速率。

芯片内部框图
在这里插入图片描述

五.模块接线说明

在这里插入图片描述

模块引脚说明:

在这里插入图片描述

六.参考原理图

NRF24L01模块参考原理图
在这里插入图片描述

七.通讯协议介绍

芯片操作流程:
在这里插入图片描述

TX 工作模式
当需要发送数据时,需要切换到TX工作模式。芯片进入到TX工作模式的条件为:TX FIFO 中有数据, CONFIG寄存器的PWR_UP位的值为1,PRIM_RX位的值为0,同时要求引脚CE上有一个至少持续10us的高脉冲。Idle-TX模式切换到TX模式的时间为 120us~130us 之间,但不会超过 130us。单包数据发送完成后,如果 CE=1, 则由TX FIFO的状态来决定芯片所处的工作模式,当TX FIFO还有数据,芯片继续保持在TX工作模式,并发送下一包数据;当TX FIFO没有数据,芯片返回Idle-TX模式;如果CE=0,立即返回Standby模式。数据发射完成后,芯片产生数据发射完成中断。

RX 工作模式
当需要接收数据时,需要切换到RX工作模式。芯片进入到RX工作模式的条件为:设置寄存器CONFIG的PWR_UP位的值为1,PRIM_RX位的值为1,并且引脚CE=1。芯片由Standby 模式切换到RX模式的时间为120~130us。当接收到数据包的地址与芯片的地址相同,并且CRC检查正确时,数据会自动存入RX FIFO,并产生数据接收中断。芯片最多可以同时存三个有效数据包,当FIFO已满,接收到的数据包被自动丢掉。

SPI时序
芯片采用标准的四线SPI接口,实测最高读写速度大于10Mb/S。外部微控制器可以通过SPI接口对芯片进行配置,包括读写功能寄存器、读写FIFO、读芯片状态、清除中断等。

SPI读写时序
在这里插入图片描述

SPI命令表
在这里插入图片描述

如下图所示,读数据就是0x61命令
在这里插入图片描述

内部寄存器定义

比如状态寄存器定义如下,地址0x07:
在这里插入图片描述
在这里插入图片描述

八.STM32单片机与NRF24L01模块实现远无线通讯实验

1.硬件准备

数据收发,采用两块板子,一块发送,一块接收,两块板子接法一样,STLINK接STM32G070RBT6开发板,STLINK接电脑USB口。

模块与开发板相连:

在这里插入图片描述
NRF2401模块在开发板上的接口定义
在这里插入图片描述

NRF_CE <---->板子PA4
NRF_IRQ <---->板子PA3
NRF_CS <---->板子PA2
SPI1_SCK <---->板子PA1
SPI1_MISO<---->板子PA6
SPI1_MOSI<---->板子PA7

2.软件工程

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32G070RB,再双击就创建新的工程
在这里插入图片描述

NRF2401的相应的GPIO控制引脚配置,采用模拟SPI方式,所以没有配置SPI
在这里插入图片描述

采用默认内部晶振,16M主频,不倍频
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

添加代码

添加OLED显示驱动文件,及配置相应引脚
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加NRF2401驱动文件,及配置相应引脚
在这里插入图片描述
在这里插入图片描述

添加应用相关代码

以上发送的板子跟接收的板子流程配置都一样,只是后续应用部分代码不同

接收的板子,添加相应的代码
在这里插入图片描述
发送的板子,添加相应的代码
在这里插入图片描述

3.软件主要代码

发送的板子主要代码

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();//16M主频,内部晶振

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
	 MX_GPIO_Init();
	 /* USER CODE BEGIN 2 */
	OLED_Init();			       //OLED初始化  
	OLED_Clear();            //清屏
	Init_NRF24L01();    //初始化NRF24L01 
	while(NRF24L01_Check())//检测24L01
	{
	
	}
	TX_Mode();//发送模式
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		OLED_Clear();
    	OLED_ShowCHinese(18,0,0);//光
		OLED_ShowCHinese(36,0,1);//子
		OLED_ShowCHinese(54,0,2);//物
		OLED_ShowCHinese(72,0,3);//联
		OLED_ShowCHinese(90,0,4);//网
		OLED_ShowString(6,3,"NRF2401 TEST");
		OLED_ShowString(0,6,"SEND:");  
    	for(int i=0;i<5;i++)
		{
			tmp_buf[i]=i;
			OLED_ShowNum(40+i*8,6,tmp_buf[i],1,16);//显示发送内容
		}

		if(NRF24L01_TxPacket(tmp_buf)==TX_OK)		//发送数据
		{		
		   OLED_ShowString(96,6,"OK"); 
		   HAL_Delay(3000);					
		}			
		else						   			
		{		
		  OLED_ShowString(96,6,"ERR"); 			
	      HAL_Delay(3000);	    
		}			

  }
  /* USER CODE END 3 */
}

接收的板子主要代码

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();

  /* USER CODE BEGIN 2 */
	OLED_Init();			       //OLED初始化  
	OLED_Clear();            //清屏
	Init_NRF24L01();    //初始化NRF24L01 
	while(NRF24L01_Check())//检测24L01
	{

	}
	RX_Mode();//接收模式

  /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		OLED_Clear();
    	OLED_ShowCHinese(18,0,0);//光
		OLED_ShowCHinese(36,0,1);//子
		OLED_ShowCHinese(54,0,2);//物
		OLED_ShowCHinese(72,0,3);//联
		OLED_ShowCHinese(90,0,4);//网
		OLED_ShowString(6,3,"NRF2401 TEST");
		OLED_ShowString(0,6,"RECV:");  
		memset(tmp_buf,0x00,sizeof(tmp_buf));
		if(NRF24L01_RxPacket(tmp_buf)==0)//接收数据,内容放tmp_buf
		{
			for(int i=0;i<5;i++)
			{
				OLED_ShowNum(40+i*8,6,tmp_buf[i],1,16);//显示收到的数据
			}
			
		}
		HAL_Delay(3000);//等待3秒

  }
  /* USER CODE END 3 */
}

4.实验效果

发送的板子能发送5个字节,接收的板子能接收到5个字节数据,并显示
在这里插入图片描述

九.源代码工程下载

CSDN代码工程下载

十.小结

NRF2401模块非常适用于需要远距离无线通信的应用,如物联网设备、无线传感器网络、遥控器等。学会了该模块驱动,可以适用于很多无线通讯的场合。


http://www.kler.cn/news/363076.html

相关文章:

  • 互联网摸鱼日报(2024-10-24)
  • 后端C++
  • 阿里云项目启动OOM问题解决
  • C语言程序设计:现代设计方法习题笔记《chapter3》
  • 推荐一个开源非线性视频编辑器:Kdenlive
  • ArkTS 如何适配手机和平板,展示不同的 Tabs 页签
  • elementUi el-table 表头高度异常问题
  • 使用openstack的救援功能对受损的oula系统云主机进行救援
  • word表格问题
  • MFC工控项目实例二十六创建数据库
  • 【Django】增加一个自定义字段
  • esxi开启嵌套虚拟化
  • 轻松上手 Disruptor:两个实例解析并发编程利器
  • AWS账号的费用结构与使用指南
  • Oracle分区表改造(一):通过数据导入迁移到新建分区表
  • 盘点2024年最受欢迎的开源GitOps工具
  • ClickHouse的特点与优势
  • C#/.NET/.NET Core技术前沿周刊 | 第 10 期(2024年10.14-10.20)
  • 认识maven
  • Linux中定时任务调度工具——crontab
  • NASA:全球鹰无人机系统(UAS)上收集的在位云层测量
  • 申请https证书
  • Spring Boot与JavaWeb融合:在线考试系统的新架构
  • 基于SSM品牌银饰售卖系统的设计
  • Socket 网络编程与 C# 中的应用实例
  • GitHub上传文件