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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/902002.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

InnoDB 存储引擎<二>页结构和行结构

目录 ⻚结构 ⾏结构 ⻚结构 ⻚在MySQL运⾏的过程中起到了⾮常重要的作⽤&#xff0c;为了能发挥更好的性能&#xff0c;可以结合⾃⼰系统的 业务场景和数据⼤⼩&#xff0c;对⻚相关的系统变量进⾏调整&#xff0c;⻚的⼤⼩就是⼀个⾮常重要的调整项 1.⻚的⼤⼩可以设置吗&…

RHCSA笔记一

常见的操作系统 UNIX 、 Linux 类、 Windows 类 搭建Linux学习环境 如何安装linux操作系统&#xff1a; 安装独立的 Linux 系统&#xff0c;不再安装其他操作系统。 安装 Windows 与 Linux 并存的多操作系统&#xff0c;启动时通过菜单选择要启动的操作系统。 在虚拟机中安…

十一、数据库配置

一、Navicat配置 这个软件需要破解 密码是&#xff1a;123456&#xff1b; 新建连接》新建数据库 创建一个表 保存出现名字设置 双击打开 把id设置为自动递增 这里就相当于每一次向数据库添加一个语句&#xff0c;会自动增长id一次 二、数据库的增删改查 1、Vs 建一个控…

探索华为云DataArts Insight:数据智能的新引擎

在快速发展的数字化时代&#xff0c;数据已经成为企业最宝贵的资产。如何有效地管理和利用这些数据&#xff0c;以实现商业价值&#xff0c;是每个企业需要面对的重要挑战。华为云DataArts Insight平台应运而生&#xff0c;作为一款强大的数据智能解决方案&#xff0c;它帮助企…

Kotlin-Annotations详解

在Kotlin中&#xff0c;注解&#xff08;Annotations&#xff09;是用于为代码提供元数据的一种机制。这些元数据可以被编译器、IDE&#xff08;集成开发环境&#xff09;或其他工具使用&#xff0c;以生成代码、执行编译时检查或提供运行时信息。 注解通常被用于类、方法、属…

算法的学习笔记—左旋转字符串(牛客JZ58)

&#x1f600;前言 在程序设计中&#xff0c;字符串处理问题屡见不鲜&#xff0c;其中“字符串左旋”是一种常见操作&#xff0c;今天我们一起来探讨一个经典的左旋转字符串题目&#xff0c;以及一种优雅的解决方案——三步翻转法。 &#x1f3e0;个人主页&#xff1a;尘觉主页…

anaconda jupyter notebook themes install jupyter notebook样式更改,取消页面头部,全屏展示!

现在已经有很多相关的文章了&#xff0c;我只说简单的解决步骤&#xff1a; 我用的是anaconda的 jupyter notebook&#xff0c;这个要更改主题&#xff0c;方法有&#xff1a; 一&#xff0c;最简单&#xff1a;用 jupyter notebook自带的setting>Theme>自己选&#xff1…

模型 是否树(逻辑树之三)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。决策分支&#xff0c;是与否的逻辑路径。 1 是否树的应用 1.1 个人IP打造中的是否树应用案例&#xff1a;社交媒体营销策略 在个人品牌建设中&#xff0c;是否树可以帮助个人识别关键的决策点&#…

纯GO语言开发RTSP流媒体服务器-RTSP推流直播、本地保存录像、录像回放、http-flv及hls协议分发

温馨提示&#xff1a;我们分享的文章是给需要的人&#xff0c;不需要的人请绕过&#xff0c;不知道为什么总有一些人总觉得我们发的文章是给他看的&#xff0c;我们不逼任何人用或了解&#xff0c;不要一来就攻击我们&#xff0c;我们不惹事但也不怕事&#xff01;也希望大家和…

springboot083基于springboot的个人理财系统--论文pf(论文+源码)_kaic

基于springboot的个人理财系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了个人理财系统的开发全过程。通过分析个人理财系统管理的不足&#xff0c;创建了一个计算机管理个人理财系统的方案。文章介绍了个…

Depcheck——专门用于检测 JavaScript 和 Node.js 项目中未使用依赖项的工具

文章目录 Depcheck 是什麽核心功能&#x1f4da;检测未使用的依赖&#x1f41b;检测缺失的依赖✨支持多种文件类型&#x1f30d;可扩展性 安装与使用1. 安装 Depcheck2. 使用 Depcheck Depcheck 的应用总结项目源码&#xff1a; Depcheck 是什麽 来看一个常见错误场景&#x1…

深入了解 Android 中的命名空间:`xmlns:tools` 和其他常见命名空间

在 Android 开发中&#xff0c;xmlns &#xff08;.xml的namespace&#xff09;命名空间是一个非常重要的概念。通过引入不同的命名空间&#xff0c;可以使用不同的属性来设计布局、设置工具属性或者支持自定义视图等。除了 xmlns:tools 以外&#xff0c;还有很多常见的命名空间…

故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码

故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码 目录 故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码效果一览基本介绍程序设计参考资料 效果一览 基本介绍 CNN-ResNets&#xff08;卷积神经网络-残差网络&#xff09;在滚动轴承故障诊断中是一种常用的方法。这种方法利用…

VisionPro - 高级 - 保存模式以备后用 - 中心圆的查找配置

前言: 在基础篇, VisionPro Basic - 01- 有关应用和作业-CSDN博客 我们提到了应用和作业的保存,那么这些都是vpp的保存格式。 我们知道,在模式工具的配置中,如果我们做好了很多的调试,最后配置好参数后,也有一个保存模式的选项。我们在保存的时候,一定要添加前缀或…

Java多线程详解②(全程干货!!!)Thread Runnable

这里是Themberfue 上节主要讲完了多线程的一些基础知识&#xff0c;这节通过代码进一步理解多线程&#x1fae1; 多线程 Java标准库中提供了Thread类&#xff0c;以程序员们编写多线程代码&#xff0c;我们可以查看官方文档进一步了解Thread的特性以及提供的接口。 类似于Sy…

【ROS中的IMU惯性测量单元】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、IMU的部分关键数据解析二、常规IMU模块与九轴三、使用C实现获取IMU数据的节点1.IMU中的话题2.获取IMU数据程序设计思路3.获取IMU数据程操作步骤与实验现象&…

世界酒中国菜与另可数字平台达成战略合作

世界酒中国菜与另可数字平台达成战略合作&#xff0c;共推行业发展新高度 近日&#xff0c;在行业内引起广泛关注的“世界酒中国菜”项目&#xff0c;与“另可”数字平台成功举行了战略合作签约仪式。这一重要合作不仅是双方发展历程中的重要里程碑&#xff0c;更是继世界酒中…

Ubuntu 22.04系统启动时自动运行ROS2节点

在 Ubuntu 启动时自动运行 ROS2 节点的方法 环境&#xff1a;Ubuntu 系统&#xff0c;ROS2 Humble&#xff0c;使用系统自带的 启动应用程序 目标&#xff1a;在系统启动时自动运行指定的 ROS2 节点 效果展示 系统启动后&#xff0c;自动运行小乌龟节点和键盘控制节点。 实践…

川渝地区软件工程考研择校分析

C哥专业提供——计软考研院校选择分析专业课备考指南规划 通过最新数据分析,5所高校软件工程专业2025年考研难度从高到低预计为: 电子科技大学 >> 四川大学 > 重庆大学 ≈ 西南交通大学 > 西南大学 对于想考川渝地区985但核心目标为优先上岸的考生,建议重点考虑西…

SSM学习day01 JS基础语法

一、JS基础语法 跟java有点像&#xff0c;但是不用注明数据类型 使用var去声明变量 特点1&#xff1a;var关键字声明变量&#xff0c;是为全局变量&#xff0c;作用域很大。在一个代码块中定义的变量&#xff0c;在其他代码块里也能使用 特点2&#xff1a;可以重复定义&#…