注意:1.本实验不是利用传统意义上的多通道实现的
一、功能方案与分析
实验内容
使用 STM32F407 开发板、NRF2401 WIFI 模块,完成以下内容:
- 使用 USB 转 NRF2401 模块完成对 NRF2401 模块的配置,并记录地址、频率等配置的具体情况;
- STM32 开发板上电后,对 NRF2401 的接入是否正确进行检测,并在 LCD 屏上进行模块状态显式;
- NRF2401 模块连接正常后,使用 KEY0 和 KEY1 来控制模块的收发模式,且按 KEY0 进入接收模式,短按 KEY1 进入发送 1 模式,长按 KEY1 进入发送 2 模式;
- 构建一对多的无线传输网络,实现两发一收的传输功能。其中节点 1 为发送 1 模式,每隔 1s 发送一次本机采集的光照强度;节点 2 为发送 2 模式,每隔 2s 发送一次 “IoT BCU”,且每发一次字符串循环左移一位;节点 3 为接收模式,同时接收节点1和节点 2 的数据,并在 LCD 屏幕上进行显示。注意三个节点的工作模式均应可以通过 KEY0 和 KEY1 完成切换。
硬件设计
实验功能简介:开机的时候先检测 NRF24L01 模块是否存在,在检测到 NRF24L01 模块之后,根据 KEY0 和 KEY1 的设置来决定模块的工作模式,在设定好工作模式之后,就会发送/接收数据,可以通过 KEY0 和 KEY1 完成模式切换。
所要用到的硬件资源如下:
- LED0 模块
- KEY0 和 KEY1 按键
- TFTLCD 模块
- NRF24L01 模块
NRF24L01 模块属于外部模块,开发板上 NRF24L01 模块接口和 STM32F4 的连接情况,他们的连接关系下图所示:
这里 NRF24L01 也是使用的 SPI1,和 W25Q128 共用一个 SPI 接口,所以在使用的时候,他们分时复用 SPI1 。本章我们需要把 W25Q128 的片选信号置高,以防止这个器件对NRF24L01的通信造成干扰。另外, NRF_IRQ 和 RS485_RE 共用了 PG8 ,所以,他们不能同时使用,不过我们一般用不到 NRF_IRQ 这个信号,因此, RS485 和 NRF 一般也可以同时使用。
功能流程图
模块的配置
利用 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