文章目录
- 一.概要
- 二.NRF24L01模块介绍
- 三.NRF24L01模块主要特性
- 四.国产射频芯片SI24R1介绍
- 五.模块接线说明
- 六.参考原理图
- 七.通讯协议介绍
- 八.STM32单片机与NRF24L01模块实现远无线通讯实验
- 1.硬件准备
- 2.软件工程
- 3.软件主要代码
- 4.实验效果
- 九.源代码工程下载
- 十.小结
一.概要
NRF2401是单片射频收发芯片,工作于2.4~2.5GHz频段,芯片内置频率合成器、功率放大器、晶体振荡器和调制器等功能模块,输出功率和通信频道可通过程序进行配置。芯片能耗非常低,以-5dBm的功率发射时,工作电流只有10.5mA,接收时工作电流只有18mA,多种低功率工作模式,节能设计更方便。其DuoCeiverTM技术使NRF2401可以使用同一天线,同时接收两个不同频道的数据。NRF2401适用于多种无线通信的场合,如无线数据传输系统、无线鼠标、遥控开锁、遥控玩具等。
二.NRF24L01模块介绍
本模块采用国产射频芯片SI24R1,内部集成了所有与RF协议相关的高速信号处理部分,由于链路层完全集成在模块上,非常便于开发。自动检测和自动重发丢失的数据包,重发时间及重发次数可软件控制,自动存储未收到应答信号的数据包;在收到有效数据后,模块自动发送应答信号,无须另行编程,载波检测一固定频率检测,内置硬件CRC检错和点对多点通信地址控制数据包传输错误计数器及载波检测功能可用于跳频设置可同时设置六路接收通道地址,可有选择性的打开接收通道。
SI24R1的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口,便于使用低成本单片机。
三.NRF24L01模块主要特性
1.板载2.4G PCB天线,ISM频段,标准插针DIP2.54mm间距接口,体积小巧,便于嵌入式应用。
2.支持六路通道的数据接收(一对六)
3.支持GFSK/FSK等通用调制方式
4.支持2Mbps/1Mbps/250Kbps 数据速率,可设不同的发射功率
5.多频点:126频点,满足多点通信和跳频通信需要2400MHz~2525MHz,1MHz跳频步进
6.内部集成高PSRR的LDO
7.宽电源电压范围:1.9~3.6V,典型3.3V
8.平均发射电流低至25mA(7dBm)
9.接收灵敏度:-83dBm@2Mhz
10.发射功率可高达+7dBm
11.采用四线SPI接口,速率可达10MHZ
12.内部集成智能ARQ基带协议引擎
13.收发数据硬件中断输出
14.支持1bit RSSl输出
15.工作温度:-20℃~85℃
四.国产射频芯片SI24R1介绍
Si24R1是一颗工作在 2.4GHz ISM 频段,专为低功耗无线场合设计,集成嵌 入式 ARQ 基带协议引擎的无线收发器芯 片 。Si24R1 采用 GFSK/FSK 数字调制与解调技术。数据传输速率与 PA 输出功率都可以调节,支持 2Mbps,1Mbps,250Kbps 三种数据速率。
芯片内部框图
五.模块接线说明
模块引脚说明:
六.参考原理图
NRF24L01模块参考原理图
七.通讯协议介绍
芯片操作流程:
TX 工作模式
当需要发送数据时,需要切换到TX工作模式。芯片进入到TX工作模式的条件为:TX FIFO 中有数据, CONFIG寄存器的PWR_UP位的值为1,PRIM_RX位的值为0,同时要求引脚CE上有一个至少持续10us的高脉冲。Idle-TX模式切换到TX模式的时间为 120us~130us 之间,但不会超过 130us。单包数据发送完成后,如果 CE=1, 则由TX FIFO的状态来决定芯片所处的工作模式,当TX FIFO还有数据,芯片继续保持在TX工作模式,并发送下一包数据;当TX FIFO没有数据,芯片返回Idle-TX模式;如果CE=0,立即返回Standby模式。数据发射完成后,芯片产生数据发射完成中断。
RX 工作模式
当需要接收数据时,需要切换到RX工作模式。芯片进入到RX工作模式的条件为:设置寄存器CONFIG的PWR_UP位的值为1,PRIM_RX位的值为1,并且引脚CE=1。芯片由Standby 模式切换到RX模式的时间为120~130us。当接收到数据包的地址与芯片的地址相同,并且CRC检查正确时,数据会自动存入RX FIFO,并产生数据接收中断。芯片最多可以同时存三个有效数据包,当FIFO已满,接收到的数据包被自动丢掉。
SPI时序
芯片采用标准的四线SPI接口,实测最高读写速度大于10Mb/S。外部微控制器可以通过SPI接口对芯片进行配置,包括读写功能寄存器、读写FIFO、读芯片状态、清除中断等。
SPI读写时序
SPI命令表
如下图所示,读数据就是0x61命令
内部寄存器定义
比如状态寄存器定义如下,地址0x07:
八.STM32单片机与NRF24L01模块实现远无线通讯实验
1.硬件准备
数据收发,采用两块板子,一块发送,一块接收,两块板子接法一样,STLINK接STM32G070RBT6开发板,STLINK接电脑USB口。
模块与开发板相连:
NRF2401模块在开发板上的接口定义
NRF_CE <---->板子PA4
NRF_IRQ <---->板子PA3
NRF_CS <---->板子PA2
SPI1_SCK <---->板子PA1
SPI1_MISO<---->板子PA6
SPI1_MOSI<---->板子PA7
2.软件工程
打开STM32CubeMX软件,新建工程
Part Number处输入STM32G070RB,再双击就创建新的工程
NRF2401的相应的GPIO控制引脚配置,采用模拟SPI方式,所以没有配置SPI
采用默认内部晶振,16M主频,不倍频
配置工程文件名,保存路径,KEIL5工程输出方式
生成工程
用Keil5打开工程
添加代码
添加OLED显示驱动文件,及配置相应引脚
添加NRF2401驱动文件,及配置相应引脚
添加应用相关代码
以上发送的板子跟接收的板子流程配置都一样,只是后续应用部分代码不同
接收的板子,添加相应的代码
发送的板子,添加相应的代码
3.软件主要代码
发送的板子主要代码
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();//16M主频,内部晶振
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
OLED_Init(); //OLED初始化
OLED_Clear(); //清屏
Init_NRF24L01(); //初始化NRF24L01
while(NRF24L01_Check())//检测24L01
{
}
TX_Mode();//发送模式
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
OLED_Clear();
OLED_ShowCHinese(18,0,0);//光
OLED_ShowCHinese(36,0,1);//子
OLED_ShowCHinese(54,0,2);//物
OLED_ShowCHinese(72,0,3);//联
OLED_ShowCHinese(90,0,4);//网
OLED_ShowString(6,3,"NRF2401 TEST");
OLED_ShowString(0,6,"SEND:");
for(int i=0;i<5;i++)
{
tmp_buf[i]=i;
OLED_ShowNum(40+i*8,6,tmp_buf[i],1,16);//显示发送内容
}
if(NRF24L01_TxPacket(tmp_buf)==TX_OK) //发送数据
{
OLED_ShowString(96,6,"OK");
HAL_Delay(3000);
}
else
{
OLED_ShowString(96,6,"ERR");
HAL_Delay(3000);
}
}
/* USER CODE END 3 */
}
接收的板子主要代码
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
OLED_Init(); //OLED初始化
OLED_Clear(); //清屏
Init_NRF24L01(); //初始化NRF24L01
while(NRF24L01_Check())//检测24L01
{
}
RX_Mode();//接收模式
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
OLED_Clear();
OLED_ShowCHinese(18,0,0);//光
OLED_ShowCHinese(36,0,1);//子
OLED_ShowCHinese(54,0,2);//物
OLED_ShowCHinese(72,0,3);//联
OLED_ShowCHinese(90,0,4);//网
OLED_ShowString(6,3,"NRF2401 TEST");
OLED_ShowString(0,6,"RECV:");
memset(tmp_buf,0x00,sizeof(tmp_buf));
if(NRF24L01_RxPacket(tmp_buf)==0)//接收数据,内容放tmp_buf
{
for(int i=0;i<5;i++)
{
OLED_ShowNum(40+i*8,6,tmp_buf[i],1,16);//显示收到的数据
}
}
HAL_Delay(3000);//等待3秒
}
/* USER CODE END 3 */
}
4.实验效果
发送的板子能发送5个字节,接收的板子能接收到5个字节数据,并显示
九.源代码工程下载
CSDN代码工程下载
十.小结
NRF2401模块非常适用于需要远距离无线通信的应用,如物联网设备、无线传感器网络、遥控器等。学会了该模块驱动,可以适用于很多无线通讯的场合。