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

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)按键,用于给接收端发送数据,如果接收端没有在线,或没有收到数据以及重发次数超了,发射端会有状态指示灯亮起,接收端收到数据,会通过串口将数据打印出来。本示例只演示单个字符数据发送。

  • 🚩在控制领域,这些功能都非常重要,设备状态以及收发状态都可以很直观的展现出来,当然可以另外添加OLED屏幕来显示这些重要信息,本案例实现的是基本重要功能,对于其他外设驱动,可以自行添加进去,本工程案例只是针对nRF24L01模块功能部分的实现。扩展功能可以根据个人开发以及实际需求进行添加,也是为了方便工程移植使用,尽量将模块功能独立。
    在这里插入图片描述
  • 🌿发射和接收端在开机或重启时串口会打印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

相关文章:

  • 2022济南大学acm新生赛题解
  • ES+Redis+MySQL,这个高可用架构设计太顶了!
  • js逆向爬取某音乐网站某歌手的歌曲
  • Python打包成exe,文件太大问题解决办法(比保姆级还保姆级)
  • 【小白】git是什么?gitee和git和github的关系?
  • 如何用Python求解微分方程组
  • 初识C++需要了解的一些东西(2)
  • 【面试题】面试官:如果后端给你 1w 条数据,你如何做展示?
  • 伯努利方程示例 Python 计算(汽水流体和喷泉工程)
  • 想要成为高级网络工程师,只需要具备这几点
  • 【Python练习】序列结构
  • 【微信小程序】-- 网络数据请求(十九)
  • 十大经典排序算法(上)
  • 【再谈动态规划】
  • 宇宙最强-GPT-4 横空出世:最先进、更安全、更有用
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【Amaple教程】5. 插件
  • 2017 年终总结 —— 在路上
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Apache Pulsar 2.1 重磅发布
  • ComponentOne 2017 V2版本正式发布
  • HTML中设置input等文本框为不可操作
  • HTTP请求重发
  • JavaScript 一些 DOM 的知识点
  • Joomla 2.x, 3.x useful code cheatsheet
  • JS学习笔记——闭包
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • tensorflow学习笔记3——MNIST应用篇
  • Yii源码解读-服务定位器(Service Locator)
  • 从PHP迁移至Golang - 基础篇
  • 第2章 网络文档
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 批量截取pdf文件
  • 前端自动化解决方案
  • 区块链将重新定义世界
  • 全栈开发——Linux
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 大数据全解:定义、价值及挑战
  • ​香农与信息论三大定律
  • #Spring-boot高级
  • #stm32驱动外设模块总结w5500模块
  • #微信小程序:微信小程序常见的配置传旨
  • (1)bark-ml
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (差分)胡桃爱原石
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)德国人的记事本
  • (转)视频码率,帧率和分辨率的联系与区别
  • ***原理与防范
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .stream().map与.stream().flatMap的使用