2.4G通信

news/2024/11/8 17:06:04/

文章目录

  • 2.4G无线通信实验
  • 一、模块简介
  • 二、Enhanced ShockBurstTM模式介绍
  • 三. 编程
    • 1.初始化IO口
    • 2.Enhanced ShockBurstTM发送流程
    • 3.Enhanced ShockBurstTM发送模式初始化
    • 4.Enhanced ShockBurstTM接收流程
    • 5.Enhanced ShockBurstTM接收模式初始化
    • 6.读函数
    • 7.写函数
    • 8.主函数
  • 总结


2.4G无线通信实验

2.4G无线通信一般是通过两个设备进行通信,最高速率可达到2Mbps,抗干扰能力强。一般的可以进行1对6的通信,一般是1个接收,6个发送。


一、模块简介

本次2.4G通信使用的是NRF24L01,如图所示
在这里插入图片描述
CE:模式控制线。在 CSN为低的
情况下,CE 协同CONFIG 寄存器
共同决定NRF24L01 的状态(参照
NRF24L01 的状态机)
CSN:SPI片选线
SCK:SPI时钟线
MOSI:SPI数据线(主机输出,从机输入)
MISO:SPI数据线(主机输入,从机输出)
IRQ:中断信号线。中断时变为低电平,在以下三种情况变低:Tx FIFO 发完并且收到ACK(使能ACK情况下)、Rx FIFO 收到数据、达到最大重发次数。
在这里插入图片描述
空闲状态SCK为0,CPOL=0;数据在时钟第一个时间边沿采集,CPHA=0;
Cn:SPI命令位
Sn:STATUS寄存器位
Dn:数据位( MSB,多字节传输时,低字节在前)

在这里插入图片描述
其中,收发模式又有: Enhanced ShockBurstTM收发模式和ShockBurstTM收发模式,只有Enhanced ShockBurstTM收发模式支持自动ACK和自动重发。开启自动ACK,则默认选择Enhanced模式。一般的都是用的 Enhanced ShockBurstTM收发模式。
PS:在接收数据时,自动把字头和CRC校验码移去。在发送数据时,自动加上字头和CRC校验码,在发送模式下,置CE为高,至少10us,将使能发送过程。也就是发送模式时,PWR_UP由高变低时,需要有个至少10us的延时。

二、Enhanced ShockBurstTM模式介绍

Enhanced ShockBurst TM 模式:发送方要求终端设备在接收到数据后有应答信号,以便发送方检测有无数据丢失,一旦丢失则重发数据。重发数据设置在地址为 0X04 的数据重发设置寄存器 用于设置其重发次数及设置在未收到应答信号后等待重发的时间。
在接收模式下,最多可以接收6路不通的数据。每一个数据通道使用不同的地址,但是共用相同的频道。也就是说6 个不同的NRF24L01 设置为发送模式后可以与同一个设置为接收模式的NRF24L01 进行通讯,而设置为接收模式的NRF24L01可以对这6 个发射端进行识别。数据通道0 是唯一的一个可以配置为40 位自身地址的数据通道。1~5 数据通道都为8 位自身地址和32 位公用地址(由通道1设置)。所有的数据通道都可以设置为Enhanced ShockBurst 模式。
在这里插入图片描述
在接收端,确认收到数据后记录地址,并以此地址为目标地址发送应答信号。

在发送端,通道0被用作接收应答信号,因此通道0的接收地址要与发送地址端地址相等,以确保接收到正确的应答信号。
PS:通道0的地址不能更改,通道1-5的地址只有最后两位能进行更改。

三. 编程

1.初始化IO口

//初始化24L01的IO口void NRF24L01_Init(void)
{  GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure; RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE );	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_SetBits(GPIOC,GPIO_Pin_4);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU  ;   //上拉输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);SPI1_Init();    		//初始化SPISPI_Cmd(SPI1, DISABLE); // SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master;		//设置SPI工作模式:设置为主SPISPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;		//设置SPI的数据大小:SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;		//选择了串行时钟的稳态:时钟悬空低电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;	//数据捕获于第一个时钟沿SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;		//NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;		//定义波特率预分频的值:波特率预分频值为256SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;	//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7;	//CRC值计算的多项式SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器NRF24L01_CE=0; 	//使能24L01NRF24L01_CSN=1;	//SPI片选取消	 	
}

注意:NRF24L01与W25Q64和SD卡共用SPI1,注意要分时复用!!

2.Enhanced ShockBurstTM发送流程

  1. 把地址和要发送的数据按时序送入NRF24L01;
  2. 配置CONFIG寄存器,使之进入发送模式;
  3. 微控制器把CE置高(至少10us),激发Enhanced ShockBurstTM发射;
  4. Enhanced ShockBurstTM发射:① 给射频前端供电;②射频数据打包(加字头、CRC校验码); ③ 高速发射数据包; ④发射完成,NRF24L01进入空闲状态。
//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:发送完成状况
u8 NRF24L01_TxPacket(u8 *txbuf)
{u8 sta;SPI1_SetSpeed(SPI_BaudRatePrescaler_8);//spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   NRF24L01_CE=0;NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节NRF24L01_CE=1;//启动发送	   while(NRF24L01_IRQ!=0);//等待发送完成sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值	   NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志if(sta&MAX_TX)//达到最大重发次数{NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器 return MAX_TX; }if(sta&TX_OK)//发送完成{return TX_OK;}return 0xff;//其他原因发送失败
}

3.Enhanced ShockBurstTM发送模式初始化

1)写Tx 节点的地址 TX_ADDR
2)写Rx 节点的地址(主要是为了使能Auto Ack) RX_ADDR_P0
3)使能AUTO ACK EN_AA
4)使能PIPE 0 EN_RXADDR
5)配置自动重发次数 SETUP_RETR
6)选择通信频率 RF_CH
7)配置发射参数(低噪放大器增益、发射功率、无线速率) RF_SETUP
8)配置24L01 的基本参数以及切换工作模式 CONFIG。

//该函数初始化NRF24L01到TX模式
//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,波特率和LNA HCURR
//PWR_UP,CRC使能
//当CE变高后,即进入RX模式,并可以接收数据了		   
//CE为高大于10us,则启动发送.	 
void NRF24L01_TX_Mode(void)
{														 NRF24L01_CE=0;	    NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址 NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK	  NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址  NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //设置RF通道为40NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断NRF24L01_CE=1;//CE为高,10us后启动发送
}

4.Enhanced ShockBurstTM接收流程

  1. 配置接收地址和要接收的数据包大小;
  2. 配置CONFIG寄存器,使之进入接收模式,把CE置高。
  3. 130us后,NRF24L01进入监视状态,等待数据包的到来;
  4. 当接收到正确的数据包(正确的地址和CRC校验码),NRF2401自动把字头、地址和CRC校验位移去;
  5. NRF24L01通过把STATUS寄存器的RX_DR置位(STATUS一般引起微控制器中断)通知微控制器;
  6. 微控制器把数据从FIFO读出(0X61指令);
  7. 所有数据读取完毕后,可以清除STATUS寄存器。NRF2401可以进入
    四种主要的模式之一;
//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:0,接收完成;其他,错误代码
u8 NRF24L01_RxPacket(u8 *rxbuf)
{u8 sta;		    							   SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)   sta=NRF24L01_Read_Reg(STATUS);  //读取状态寄存器的值    	 NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志if(sta&RX_OK)//接收到数据{NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器 return 0; }	   return 1;//没收到任何数据
}					    

5.Enhanced ShockBurstTM接收模式初始化

1)写Rx 节点的地址 RX_ADDR_P0
2)使能AUTO ACK EN_AA
3)使能PIPE 0 EN_RXADDR
4)选择通信频率 RF_CH
5)选择通道0 有效数据宽度 RX_PW_P0
6)配置发射参数(低噪放大器增益、发射功率、无线速率) RF_SETUP
7)配置24L01 的基本参数以及切换工作模式 CONFIG。

//该函数初始化NRF24L01到RX模式
//设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR
//当CE变高后,即进入RX模式,并可以接收数据了		   
void NRF24L01_RX_Mode(void)
{NRF24L01_CE=0;	  NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX节点地址NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);    	//使能通道0的自动应答    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);	//使能通道0的接收地址  	 NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);	    	//设置RF通信频率		  NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度 	    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);	//设置TX发射参数,0db增益,2Mbps,低噪声增益开启   NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);		//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式 NRF24L01_CE = 1; //CE为高,进入接收模式 
}						 

6.读函数

//读取SPI寄存器值
//reg:要读的寄存器
u8 NRF24L01_Read_Reg(u8 reg)
{u8 reg_val;	    NRF24L01_CSN = 0;          //使能SPI传输		SPI1_ReadWriteByte(reg);   //发送寄存器号reg_val=SPI1_ReadWriteByte(0XFF);//读取寄存器内容NRF24L01_CSN = 1;          //禁止SPI传输		    return(reg_val);           //返回状态值
}	
//在指定位置读出指定长度的数据
//reg:寄存器(位置)
//*pBuf:数据指针
//len:数据长度
//返回值,此次读到的状态寄存器值 
u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
{u8 status,u8_ctr;	       NRF24L01_CSN = 0;           //使能SPI传输status=SPI1_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值   	   for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI1_ReadWriteByte(0XFF);//读出数据NRF24L01_CSN=1;       //关闭SPI传输return status;        //返回读到的状态值
}

7.写函数

//SPI写寄存器
//reg:指定寄存器地址
//value:写入的值
u8 NRF24L01_Write_Reg(u8 reg,u8 value)
{u8 status;	NRF24L01_CSN=0;                 //使能SPI传输status =SPI1_ReadWriteByte(reg);//发送寄存器号 SPI1_ReadWriteByte(value);      //写入寄存器的值NRF24L01_CSN=1;                 //禁止SPI传输	   return(status);       			//返回状态值
}
//在指定位置写指定长度的数据
//reg:寄存器(位置)
//*pBuf:数据指针
//len:数据长度
//返回值,此次读到的状态寄存器值
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
{u8 status,u8_ctr;	    NRF24L01_CSN = 0;          //使能SPI传输status = SPI1_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI1_ReadWriteByte(*pBuf++); //写入数据	 NRF24L01_CSN = 1;       //关闭SPI传输return status;          //返回读到的状态值
}				   

8.主函数

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
#include "spi.h"
#include "24l01.h"   
//ALIENTEK Mini STM32开发板范例代码24
//无线通信实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司  int main(void){ u8 key,mode;u16 t=0;			 u8 tmp_buf[33]; delay_init();	    	 //延时函数初始化	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2uart_init(9600);	 	//串口初始化为9600LED_Init();		  		//初始化与LED连接的硬件接口LCD_Init();			   	//初始化LCD 	KEY_Init();				//按键初始化NRF24L01_Init();    	//初始化NRF24L01  POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(60,50,200,16,16,"Mini STM32");	LCD_ShowString(60,70,200,16,16,"NRF24L01 TEST");	LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(60,110,200,16,16,"2014/3/12");		  while(NRF24L01_Check())	//检查NRF24L01是否在位.	{LCD_ShowString(60,130,200,16,16,"NRF24L01 Error");delay_ms(200);LCD_Fill(60,130,239,130+16,WHITE);delay_ms(200);}								   LCD_ShowString(60,130,200,16,16,"NRF24L01 OK");while(1)//在该部分确定进入哪个模式!{key=KEY_Scan(0);if(key==KEY0_PRES){mode=0;   break;}else if(key==KEY1_PRES){mode=1;break;}t++;if(t==100)LCD_ShowString(10,150,230,16,16,"KEY0:RX_Mode  KEY1:TX_Mode"); //闪烁显示提示信息if(t==200){	LCD_Fill(10,150,230,150+16,WHITE);t=0; }delay_ms(5);	  }   LCD_Fill(10,150,240,166,WHITE);//清空上面的显示		  POINT_COLOR=BLUE;//设置字体为蓝色	   if(mode==0)//RX模式{LCD_ShowString(60,150,200,16,16,"NRF24L01 RX_Mode");	LCD_ShowString(60,170,200,16,16,"Received DATA:");	NRF24L01_RX_Mode();		  while(1){	  		    		    				 if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.{tmp_buf[32]=0;//加入字符串结束符LCD_ShowString(0,190,239,32,16,tmp_buf);    }else delay_us(100);	   t++;if(t==10000)//大约1s钟改变一次状态{t=0;LED0=!LED0;} 				    };	}else//TX模式{							    LCD_ShowString(60,150,200,16,16,"NRF24L01 TX_Mode");	NRF24L01_TX_Mode();mode=' ';//从空格键开始  while(1){	  		   				 if(NRF24L01_TxPacket(tmp_buf)==TX_OK){LCD_ShowString(60,170,239,32,16,"Sended DATA:");	LCD_ShowString(0,190,239,32,16,tmp_buf); key=mode;for(t=0;t<32;t++){key++;if(key>('~'))key=' ';tmp_buf[t]=key;	}mode++; if(mode>'~')mode=' ';  	  tmp_buf[32]=0;//加入结束符		   }else{										   	LCD_ShowString(60,170,239,32,16,"Send Failed "); LCD_Fill(0,188,240,218,WHITE);//清空上面的显示			   };LED0=!LED0;delay_ms(1500);				    };} 
}

总结

总的来说,2.4G无线通信的原理和其他通信原理大同小异,基本就是几大步骤:发信息,收信息,读信息,写信息。然后2.4G无线通信还加了一个模式选择,一般选择是Enhanced ShockBurstTM这个模式,这个模式可以支持自动ACK和自动重发。然后,博主的代码是对于stm32mini板的程序,1-7步骤主要是对2.4G通信的初始化,要注意的是NRF24L01与W25Q64和SD卡共用SPI1,注意要分时复用。然后8就是主函数,能实现的功能就是通过按键0和按键1,来控制是接受模式还是发送模式,然后就进行发送或者接受。如果为发送模式,发送的是32个ASCLL码,从空格开始,一直到~。对于2.4G通信博主也只是初了解,这个程序也是从别处白嫖过来的,如有错误,请指正。


http://www.ppmy.cn/news/814057.html

相关文章

FGH40N60SMD安森美车规MOS管\原装现货ASEMI代理

编辑&#xff1a;ll FGH40N60SMD安森美车规MOS管\原装现货ASEMI代理 型号&#xff1a;FGH40N60SMD 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 最大漏源电流&#xff1a;40A 漏源击穿电压&#xff1a;600V RDS&#xff08;ON&#xff09;Max&#xff1a;0.08Ω 引脚…

光模块之数通市场代际更迭,100G需求恢复,400G蓄势待发

光模块主要应用领域有两大块&#xff0c;一个是电信市场&#xff0c;比如当前正在大力建设的5G领域&#xff0c;一个是数通市场&#xff0c;即数据中心信息传输方面。 值得注意的是&#xff0c;由于5G网络带来流量和速率的提升&#xff0c;对光模块速率的要求也相应提高&#…

Windows下如何查看十几G的日志文件

周二工作中&#xff0c;为了查明一个bug产生的原因&#xff0c;记录了近30个小时的test环境的日志文件hrmkq.log。拿到的日志文件解压后有30G&#xff0c;这是任何文本编辑器都无法处理的大小。这里介绍一下windows环境分析大文件的好工具——LogViewer (http://www.uvviewsoft…

FGH40N60SMD安森美车规IGBT,ASEMI原厂代理FGH40N60SMD

编辑-Z FGH40N60SMD用的TO-247封装&#xff0c;是安森美一款汽车级IGBT管。FGH40N60SMD的功耗&#xff08;Ptot&#xff09;为349W&#xff0c;集电极截止电流&#xff08;ICES&#xff09;为250uA&#xff0c;G−E漏电流&#xff08;IGES&#xff09;为400nA&#xff0c;其工…

100G光模块之后,200G,400G谁将成为市场宠儿

随着近年来光通信及互联网络的高速发展,用户对网络需求也顺势猛增,这导致了电信骨干网的流量每年正以50%~80%的速度飞速增长。为了适应网络市场10G-40G-100G或10G-25G-100G发展的趋势,100G光模块应运而生,并在市场中迅速崛起,在构建100G

(亲自整理)如何让你的C盘立马多出来20G空间

我的C盘120G&#xff0c;但是C盘所有文件加起来也就40G&#xff0c;但是显示已经用了60G&#xff0c;那20G不知去向。后来查了下&#xff0c;这20G确实用掉了&#xff0c;主要用在三个地方&#xff0c;一备份、二用来做虚拟内存、三休眠文件。 一、系统更新后&#xff0c;大多…

电脑计算机软件满了怎么办,电脑C盘太满怎么办?一招教你清理60G

原标题&#xff1a;电脑C盘太满怎么办&#xff1f;一招教你清理60G 因为 Win10 经常升级&#xff0c;大家经常会遇到C盘空间不足的情况。C盘空间满了&#xff0c;很多人可能会装360安全卫士或者腾讯电脑管家之类的第三方工具&#xff0c;其实完全不用。 之所以不建议安装这种软…

移动H60G改为桥接

移动光猫桥接 超级管理登录192.168.1.1 超级管理登录 账号 CMCCAdmin 密码 aDm8H%MdA192.168.1.1 打开网址登录超级用户不要登录光猫自带的user用户 点击网络 截图保存后删除此链接&#xff0c;不删除会造成拨号冲突&#xff0c;如后面故障解决图 宽带密码 CZKDMM到100…