STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈

STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈


  • 📌相关篇《STM32F1基于STM32CubeMX配置硬件SPI驱动nRF24L01数据收发》

  • 🎬功能演示
    在这里插入图片描述

  • 🌿工程默认配置的是STM32F103VC单片机,其他型号的修改需要修改启动文件startup_stm32f10x_hd.s低容量的选择startup_stm32f10x_ld.s,并在Keil设置里面修改对应的宏STM32F10X_HDSTM32F10X_MD

  • ✨测试该项目需要两块单片机才行,涉及到数据收发端。

  • 🌼nrf24l01模块以及接线说明
    在这里插入图片描述
    在这里插入图片描述

  • 📜接线定义:

	SPI1控制引脚:
   CLK--->PA5
  MISO--->PA6
  MOSI--->PA7
	 
  CSN-->PB7
  CE -> PB6
  IRQ -> PB8
----------------------
   VCC CSN MOSI IRQ
   GND CE  SCK  MISO

📑功能说明

✨在发射端通过从单片机引出4个IO引脚作为中断(EXTI)按键,用于给接收端发送数据,如果接收端没有在线,或没有收到数据以及重发次数超了,发射端会有状态指示灯亮起,接收端收到数据,会通过串口将数据打印出来。本示例只演示单个字符数据发送。

在这里插入图片描述

  • 🌿发射和接收端在开机或重启时串口会打印nRF24L01自检信息,同时接在PE5引脚上的状态指示灯会闪烁3次,如果设备自检正常,指示灯会熄灭,如果自检不正常,指示灯一直常亮。
    (自检只能检测设备的SPI硬件通讯的3根线(SCKI、MOSI、MISO)接线正确以及nRF24L01模块正常,并不能作为其他接线顺序是否OK,其他接线是否正确需要发送数据是否正常才能进一步确认。)
    在这里插入图片描述
  • 🔰如果接线错误或nRF24L01有问题会打印如下信息:
    在这里插入图片描述
  • 🍁工程架构
    在这里插入图片描述

📝发射端主程序

/*nrf24l01发射端程序*/
/*开机或重启后,指示灯闪烁3次,代表工作支持,按下发射按键如果对方没有收到应答指示灯常量*/
/*配置的是SPI1接口
							使用软件控制引脚信号:
							CLK--->PA5
							MISO--->PA6
							MOSI--->PA7
							
							CSN-->PA8							
						  CE -> PA11						  
						  IRQ -> PA1	(发射端必须接)					
							PA4用于控制MAX7219
							
				VCC	CSN	MOSI IRQ
				GND	CE	SCK	 MISO
*/
#include "stm32f10x.h"  
#include "USART1.h"
//#include "delay.h"
#include "PC13_LED.h"
#include "nrf24l01_spi1.h"
#include "KEY_Send.h"  
#include "stdio.h" 


void SWID_DISABLE(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/*  *     @arg GPIO_Remap_SWJ_NoJTRST      : Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST
  *     @arg GPIO_Remap_SWJ_JTAGDisable  : JTAG-DP Disabled and SW-DP Enabled
  *     @arg GPIO_Remap_SWJ_Disable      : Full SWJ Disabled (JTAG-DP + SW-DP)	
	*/
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
}


int main(void)
{

	uint8_t nrf_send_add[TX_RX_ADR_WIDTH] = {0xad,0x3e,0x35,0x45,0xfe};
	LED0_Config();
	LED1_Config();
	USART1_Config();
	NRF24L01_Init();
	NRF24L01_Check();
	NRF_TX_Mode(nrf_send_add);
	Four_KEY_config();
	printf("Hello Send \r\n");
//		NRF_Send_TX_Data(nrf_send_add,5);    //开始让NRF发送数据
//		delay_ms(1000);
	while(1)
	{
	}

	
}



📝接收端主程序

/*nrf24l01接收端程序*/
/*开机或重启后,指示灯闪烁3次,代表工作支持
							使用软件控制引脚信号:
							CLK--->PA5
							MISO--->PA6
							MOSI--->PA7
							
							CSN-->PA8							
						  CE -> PA11						  
						  IRQ -> PA1
----------------------
   VCC CSN MOSI IRQ
   GND CE  SCK  MISO							

*/
#include "stm32f10x.h"
#include "USART1.h"
//#include "delay.h"
#include "PC13_LED.h"
#include "nrf24l01_spi1.h"


void SWID_DISABLE(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/*  *     @arg GPIO_Remap_SWJ_NoJTRST      : Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST
  *     @arg GPIO_Remap_SWJ_JTAGDisable  : JTAG-DP Disabled and SW-DP Enabled
  *     @arg GPIO_Remap_SWJ_Disable      : Full SWJ Disabled (JTAG-DP + SW-DP)	
	*/
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
}


int main(void)
{

	uint8_t NRF_Stauts;
	uint8_t nrf_recived_add[TX_RX_ADR_WIDTH] = {0xad,0x3e,0x35,0x45,0xfe};
	uint8_t receivd_dat[TX_RX_PLOAD_WIDTH];
	LED0_Config();
	LED1_Config();
	NRF24L01_Init();
	NRF24L01_Check();
	NRF_RX_Mode(nrf_recived_add,3);	
	USART1_Config();
	
	printf("Hello receivd \r\n");

	while(1)
	{
		if((NRF_IRQ_Status() == 0))   //nrf产生中断,且是数据接收函数中判断是否为接收中断
		{
			LED1ON;
			NRF_RX_Data(receivd_dat, TX_RX_PLOAD_WIDTH);
			if(receivd_dat[0] != 0x0)   //NRF接收到数据,接收函数会清除中断
			{
				printf("received dat is %c \r\n",receivd_dat[0]);
				receivd_dat[0]=0;
				LED1OFF;
//				LED1_FLASH();
			}
			else
			{
				NRF_Stauts = Get_NRF_STATUS();
				/* 清除中断标志*/      
    		SPI_NRF_WriteReg(STATUS,NRF_Stauts);
			}
		}
		
	}

	
}



📚工程源码

  • ⚡使用须知,本代码功能已验证,不提供技术支持和问题解答!
  • 🌿发射端
链接: https://pan.baidu.com/s/19UHRdOv1mYJeRGEDFcXr9g
提取码: dtc3
  • 🌿接收端
链接: https://pan.baidu.com/s/1dvYlCdfQUvGUtLWnDZj87Q
提取码: wgf8

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

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

相关文章

python+django+vue图书个性化推荐系统

整个系统是由多个功能模块组合而成的,要将所有的功能模块都一一列举出来,然后进行逐个的功能设计,使得每一个模块都有相对应的功能设计,然后进行系统整体的设计。 本图书个性化推荐系统结构图如图python manage.py runserver 开…

宇宙最强-GPT-4 横空出世:最先进、更安全、更有用

文章目录前言一、准确性提升1.创造力2.视觉输入3.更长的上下文二、相比于ChatGPT有哪些提升1.GPT-4 的高级推理能力超越了 ChatGPT2.GPT-4 在多种测试考试中均优于 ChatGPT。三、研究团队在GPT-4模型都做了哪些改善1.遵循 GPT、GPT-2 和 GPT-3 的研究路径2.我们花了 6 个月的时…

分享10个不错的C语言开源项目

今天跟大家分享10个重量级的C语言开源项目,C语言确实经得住考验: Redis:Redis是一个开源的高性能的键值对数据库。它以C语言编写,具有极高的性能和可靠性。 Nginx:Nginx是一个高性能的HTTP和反向代理服务器&#xff0…

刚工作3天就被裁了....

前言 还有谁?刚上三天班就被公司公司的工作不适合我,叫我先提升一下。 后面我也向公司那边讨要了一个说法,我只能说他们那边的说辞让我有些不服气。 现在之所以把这件事上记录一下,一是记录一下自己的成长轨迹,二是…

改进YOLO系列 | CVPR2023最新Backbone | FasterNet 远超 ShuffleNet、MobileNet、MobileViT 等模型

论文地址:https://export.arxiv.org/pdf/2303.03667v1.pdf 为了设计快速神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,作者观察到FLOPs的这种减少不一定会带来延迟的类似程度的减少。这主要源于每秒低浮点运算(FLOPS)效率低下。并且,如此低的FLOPS主要…

javaSE系列之类与对象

javaSE系列之类与方法什么是类类的定义书写事项什么是实例化this引用this的注意事项对象的初始化构造方法封装的概念访问限定符封装扩展之包static成员static的特性static的初始化代码块注意事项内部类1.实例内部类💗 💗 博客:小怡同学💗 &am…

【LeetCode】1171. 从链表中删去总和值为零的连续节点、面试题 02.05. 链表求和

作者:小卢 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 目录 1171. 从链表中删去总和值为零的连续节点 面试题 02.05. 链表求和 1171. 从链表中删去总和…

【面试题】面试官:如果后端给你 1w 条数据,你如何做展示?

最近一位朋友参加阿b的面试,然后面试官问了她这个问题,我问她咋写的,她一脸淡定的说:“虚拟列表。”大厂面试题分享 面试题库前后端面试题库 (面试必备) 推荐:★★★★★地址:前端面…

tp6实现邮件发送

tp6实现邮件发送 phpMailer 是一个非常强大的 ph p发送邮件类,可以设定发送邮件地址、回复地址、邮件主题、html网页,上传附件,并且使用起来非常方便。 phpMailer 的特点: 1、在邮件中包含多个 TO、CC、BCC 和 REPLY-TO。2、平台应用广泛,支持的 SMTP…

阿里p8测试总监,让我们用这份《测试用例规范》,再也没加班过

经常看到无论是刚入职场的新人,还是工作了一段时间的老人,都会对编写测试用例感到困扰?例如: 固然,编写一份好的测试用例需要:充分的需求分析能力 理论及经验加持,作为测试职场摸爬打滚的老人&…

ElasticSearch 8 学习笔记总结(六)

文章目录一. ES8 的Java API 环境准备二. ES8 的Java API 索引操作三. ES8 的Java API 文档操作1. 文档的 插入 批量插入 删除等操作2. 文档的查询四、异步客户端操作一. ES8 的Java API 环境准备 ES8 废除了Type的概念。为了适应这种数据结构的改变,ES官方从1.7版…

学习 Python 之 Pygame 开发魂斗罗(十一)

学习 Python 之 Pygame 开发魂斗罗(十一)继续编写魂斗罗1. 改写主类函数中的代码顺序2. 修改玩家初始化3. 显示玩家生命值4. 设置玩家碰到敌人死亡5. 设置敌人子弹击中玩家6. 修改updatePlayerPosition()函数逻辑继续编写魂斗罗 在上次的博客学习 Pytho…

(四)HDFS双HA高可用机制

目录 概述 原理 主备切换 小结: 概述 进入到了hadoop 2.x的时代,为了保证namenode上的元数据不会丢失,而且是高可用的,出现了双实例HA的机制 原理 集群里启动两个namenode,一个是active状态(主),一个是standby(备…

HDFS黑名单退役服务器

黑名单:表示在黑名单的主机IP地址不可以,用来存储数据。 企业中:配置黑名单,用来退役服务器。 黑名单配置步骤如下: 1)编辑/opt/module/hadoop-3.1.3/etc/hadoop目录下的blacklist文件 添加如下主机名称&…

Spring —— 初学 Spring, 理解控制反转

JavaEE传送门JavaEE Servlet —— Smart Tomcat,以及一些访问出错可能的原因 Servlet —— Servlet API 目录SpringIoC (理解控制反转)传统代码ioc代码DISpring Spring 通常指的是 Spring Farmework (Spring 框架), 它是一个开源框架 用一句话来概括: Spring 是一个包含了众多…

【linux】Linux基本指令(上)

前言: 在之前我们已经简单了介绍了一下【Linux】,包括它的概念,由来啊等进行了讲解,接下来我们就将正式的踏入对其的学习!!! 本文目录👉操作系统的概念1.命令的语法1.1命令介绍1.2选…

ChatGPT告诉你:项目管理能干到60岁吗?

早上好,我是老原。这段时间最火的莫过于ChatGPT,从文章创作到论文写作,甚至编程序,简直厉害的不要不要的。本以为过几天热度就自然消退了,结果是愈演愈烈,热度未减……大家也从一开始得玩乐心态&#xff0c…

python flask项目打包成docker镜像发布

1.编写python flask代码,简单写一个加法的接口,命名为sum.py import json from flask import Flask,request,render_template app Flask(__name__)app.route(/) def index():return hello worldapp.route(/sum,methods[POST]) def correct():a request…

C/C++网络编程笔记Socket

https://www.bilibili.com/video/BV11Z4y157RY/?vd_sourced0030c72c95e04a14c5614c1c0e6159b上面链接是B站的博主教程,源代码来自上面视频,侵删,这里只是做笔记,以供复习和分享。上一篇博客我记录了配置环境并且跑通了&#xff0…

Nginx——Nginx的优化设计

摘要 本博文介绍Nginx的优化设计方向和原理,帮助大家在nginx的使用和优化中提供一个参考的方向,让你的nginx发挥最大性能,节约系统资源。 一、Nginx开启Http2.0的优化 HTTP/2是HTTP协议的最新标准,它是HTTP/1.1的继承者。由于它…