STM32F407ZET6+NRF24L01实现一收多发(一发多收)

本文介绍了如何使用STM32F407开发板和NRF24L01模块实现一收多发的无线传输功能。通过USB转NRF24L01模块配置地址和频率,利用按键切换发送和接收模式,创建两个发送节点和一个接收节点,分别发送光照强度和"IoT BCU"字符串。在遇到ST-Link与NRF24L01冲突、通信错误等问题时,通过调整解决了这些问题。
摘要由CSDN通过智能技术生成

注意:1.本实验不是利用传统意义上的多通道实现的

一、功能方案与分析

实验内容

  使用 STM32F407 开发板、NRF2401 WIFI 模块,完成以下内容:

  1. 使用 USB 转 NRF2401 模块完成对 NRF2401 模块的配置,并记录地址、频率等配置的具体情况;
  2. STM32 开发板上电后,对 NRF2401 的接入是否正确进行检测,并在 LCD 屏上进行模块状态显式;
  3. NRF2401 模块连接正常后,使用 KEY0 和 KEY1 来控制模块的收发模式,且按 KEY0 进入接收模式,短按 KEY1 进入发送 1 模式,长按 KEY1 进入发送 2 模式;
  4. 构建一对多的无线传输网络,实现两发一收的传输功能。其中节点 1 为发送 1 模式,每隔 1s 发送一次本机采集的光照强度;节点 2 为发送 2 模式,每隔 2s 发送一次 “IoT BCU”,且每发一次字符串循环左移一位;节点 3 为接收模式,同时接收节点1和节点 2 的数据,并在 LCD 屏幕上进行显示。注意三个节点的工作模式均应可以通过 KEY0 和 KEY1 完成切换。

硬件设计

  实验功能简介:开机的时候先检测 NRF24L01 模块是否存在,在检测到 NRF24L01 模块之后,根据 KEY0 和 KEY1 的设置来决定模块的工作模式,在设定好工作模式之后,就会发送/接收数据,可以通过 KEY0 和 KEY1 完成模式切换。

  所要用到的硬件资源如下:

  1. LED0 模块
  2. KEY0 和 KEY1 按键
  3. TFTLCD 模块
  4. NRF24L01 模块

  NRF24L01 模块属于外部模块,开发板上 NRF24L01 模块接口和 STM32F4 的连接情况,他们的连接关系下图所示:

NRF24L01连接图
  这里 NRF24L01 也是使用的 SPI1,和 W25Q128 共用一个 SPI 接口,所以在使用的时候,他们分时复用 SPI1 。本章我们需要把 W25Q128 的片选信号置高,以防止这个器件对NRF24L01的通信造成干扰。另外, NRF_IRQ 和 RS485_RE 共用了 PG8 ,所以,他们不能同时使用,不过我们一般用不到 NRF_IRQ 这个信号,因此, RS485 和 NRF 一般也可以同时使用。

功能流程图

main函数程序流程图
1
2

模块的配置

  利用 USB 转 NRF24L01 上位机对模块进行配置。

其实没什么用,到时候用单片机,配置代码全在单片机中,其中还有一个很奇怪的现象,用上位机或者AT指令改完配置之后,把NRF24L01模块插入另一个转换器中,用AT指令显示配置会发现配置变成了另外一个。

模块配置参数

二、代码实现

模块检测

u8 NRF24L01_Check(void)
{
   
	u8 buf[5]={
   0XA5,0XA5,0XA5,0XA5,0XA5};
	u8 i;
	SPI1_SetSpeed(SPI_SPEED_8);
	NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);
	NRF24L01_Read_Buf(TX_ADDR,buf,5);
	for(i=0;i<5;i++)if(buf[i]!=0XA5)break; 
	if(i!=5)return 1;
	return 0;
}

  模块检测的原理为:在模块的寄存器上写入数据,然后再将数据读取出来,若读取的数据与原理相同,则表明,模块存在且功能正常。

按键相关

void EXTI3_IRQHandler(void)
{
   
	delay_ms(10);
	if(KEY1==0)
	{
   
		delay_ms(2000);
		if(KEY1==0){
   
			printf("进入发送2模式\n");
			mode=2;
		}
		else {
   printf("进入发送1模式\n");mode=1;}
	} 
	EXTI->PR=1<<3;
}
void EXTI4_IRQHandler(void)
{
   
	delay_ms(10);
	if(KEY0==0)	 
	{
   
		delay_ms(10);
		if(KEY0==0) 
		{
   
			printf("进入接收模式\n");
			mode=3;
		}
	} 
	EXTI->PR=1<<4;
}
void EXTIX_Init(void)
{
   
	KEY_Init(); 
	Ex_NVIC_Config(GPIO_E,3,FTIR);
	Ex_NVIC_Config(GPIO_E,4,FTIR);
	MY_NVIC_Init(2,2,EXTI3_IRQn
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方烟火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值