datasheet

STM32驱动NRF24L01

2019-01-09来源: eefocus 关键字:STM32  驱动NRF24L01

1. 简介


NRF24L01是 nordic 的无线通信芯片,它具有以下特点:

1) 2.4G 全球开放的 ISM 频段(2.400 - 2.4835GHz),免许可证使用;

2)最高工作速率 2Mbps,高校的 GFSK 调制,抗干扰能力强;

3) 125 个可选的频道,满足多点通信和调频通信的需要;

4)内置 CRC 检错和点对多点的通信地址控制;

5)低工作电压(1.9~3.6V),待机模式下状态为 26uA;掉电模式下为 900nA;

6)可设置自动应答,确保数据可靠传输;

7)工作于EnhancedShockBurst 具有Automatic packet handling,Auto packet transaction handling ,可以实现点对点或是 1 对 6 的无线通信,速度可以达到 2M(bps),具有可选的内置包应答机制,极大的降低丢包率。

8)通过 SPI 总线与单片机进行交互,最大通信速率为10Mbps;


1.1 结构框图


如图右侧为六个控制和数据信号,分别为 CSN、 SCK、 MISO、 MOSI、 IRQ、 CE。


信号线功能

CSN芯片的片选线, CSN 为低电平芯片工作

SCK芯片控制的时钟线(SPI 时钟)

MISO芯片控制数据线(Master input slave output)

MOSI芯片控制数据线(Master output slave input)

IRQ中断信号。无线通信过程中 MCU 主要是通过 IRQ 与 NRF24L01 进行通信

CE芯片的模式控制线。 在 CSN 为低的情况下, CE 协同 NRF24L01 的 CONFIG 寄存器共同决定 NRF24L01 的状态


1.2 NRF24L01 状态机



NRF24L01 的状态机如上图 所示,对于 NRF24L01 的固件编程工作主要是参照 NRF24L01 的状态机。主要有以下几个状态:

模式PWR_UP registerPRIM_RX registerCEFIFO state

RX Mode111-

TX Mode101数据存在TX FIFO寄存器中

TX Mode10最小 10us高电平停留在发送模式,直到数据发送完

待机模式2101TX FIFO为空

待机模式11-0无数据传输

掉电模式0---

注:PWR_UP: 上电;PRIM_RX: 掉电;CE: 芯片使能 (PWR_UP和PRIM_RX 在配置寄存器(CONFIG)中设置位0和位1:)


1.3 硬件设计

原理图已经在数据手册给出,我们只需参照其设计即可,主要是在 PCB 上,注意天线部分器件的摆放和天线的净空处理,使天线能够达到最佳效果(这个可以参照数据手册的建议,当然也可以根据需求做更改)。



此处验证采用的是现成的模块。


1.4 固件编程

1) 置 CSN 为低,使能芯片,配置芯片各个参数。配置参数在 Power Down 状态中完成。

2) 如果是 Tx 模式,填充 Tx FIFO。

3) 配置完成以后,通过 CE 与 CONFIG 中的 PWR_UP 与 PRIM_RX 参数确定 24L01要切换到的状态。


Tx Mode: PWR_UP=1; PRIM_RX=0; CE=1 (保持超过 10us 就可以);

Rx Mode: PWR_UP=1; PRIM_RX=1; CE=1;


IRQ 引脚会在以下三种情况变低:中断时变为低电平

Tx FIFO 发完并且收到 ACK(使能 ACK 情况下);

Rx FIFO 收到数据;

达到最大重发次数;


将 IRQ 接到外部中断输入引脚,通过中断程序进行处理。nRF24L01 的中断引脚(IRQ)为低电平触发,当状态寄存器中TX_DS(数据发送完成中断位)、RX_DR(接收数据中断位) 或MAX_RT(达到最多次重发中断位)为高时触发中断。当MCU 给中断源写‘1’时,中断引脚被禁止。可屏蔽中断可以被IRQ 中断屏蔽。通过设置可屏蔽中断位为高,则中断响应被禁止。默认状态下所有的中断源是被禁止的。


1.4.1 Tx 模式初始化

初始化步骤配置NRF24L01寄存器

1)写 Tx 节点的地址TX_ADDR

2)写 Rx 节点的地址(使能 Auto Ack)RX_ADDR_P0

3)使能 AUTO ACKEN_AA

4)使能 PIPE 0EN_RXADDR

5)配置自动重发次数SETUP_RETR

6)选择通信频率RF_CH

7)配置发射参数(低噪放大器增益、发射功率、无线速率)RF_SETUP

8 ) 选择通道 0 有效数据宽度Rx_Pw_P0

9)配置 24L01 的基本参数以及切换工作模式CONFIG

按照如上思路即可配置 TX 模式:


/*****************************************************************************

* 函  数:void NRF24L01_TX_Mode(void)

* 功  能:NRF24L01发送模式配置

* 参  数:无

* 返回值:无

* 备  注:无

*****************************************************************************/

void NRF24L01_TX_Mode(void)

{

NRF_CE2_LOW;

NRF24L01_Write_Buf2(W_REGISTER+TX_ADDR,TX_ADR_WIDTH,(uint8_t *)TX_ADDRESS_X);//写TX节点地址

NRF24L01_Write_Buf2(W_REGISTER+RX_ADDR_P0,RX_ADR_WIDTH, (uint8_t *) RX_ADDRESS_X);//写RX节点地址,为了自动使能ACK

NRF24L01_Write_Reg2(W_REGISTER+EN_AA, 0x01);//使能通道0自动应答

NRF24L01_Write_Reg2(W_REGISTER+EN_RXADDR, 0x01);//使能通道0接收地址

NRF24L01_Write_Reg2(W_REGISTER+SETUP_PETR, 0x1a);//设置自动重发间隔时间:500us+86us,最大重大次数:10次

NRF24L01_Write_Reg2(W_REGISTER+RF_CH, 40);//设置通道为40

NRF24L01_Write_Reg2(W_REGISTER+RF_SETUP, 0x0f);//设置发射参数:0dB增益;2Mnps;低噪声增益开启

NRF24L01_Write_Reg2(W_REGISTER+NRF24L01_CONFIG,0x0e);//基本参数:PWR_UP;EN_CRC;16BIT_CRC;发送模式;开启所有中断

NRF_CE2_HIGH;//NRF_CE为高,10us后启动发送数据

}


1.4.2 Rx 模式初始化

初始化步骤配置NRF24L01寄存器

1)写 Rx 节点的地址RX_ADDR_P0

2)使能 AUTO ACKEN_AA

3)使能 PIPE 0EN_RXADDR

4)选择通信频率RF_CH

5 ) 选择通道 0 有效数据宽度Rx_Pw_P0

6)配置发射参数(低噪放大器增益、发射功率、无线速率)RF_SETUP

7)配置 24L01 的基本参数以及切换工作模式CONFIG

/*****************************************************************************

* 函  数:void NRF24L01_TX_Mode(void)

* 功  能:NRF24L01发送模式配置

* 参  数:无

* 返回值:无

* 备  注:无

*****************************************************************************/

void NRF24L01_RX_Mode(void)

{

NRF_CE2_LOW;

NRF24L01_Write_Buf2(W_REGISTER+RX_ADDR_P0, RX_ADR_WIDTH, (uint8_t *) RX_ADDRESS_X);//写RX地址节点

NRF24L01_Write_Reg2(W_REGISTER+EN_AA,0x01);//使能通道0自动应答

NRF24L01_Write_Reg2(W_REGISTER+EN_RXADDR,0x01);//使能通道0接收地址

NRF24L01_Write_Reg2(W_REGISTER+RF_CH, 40);//设置RF通信频率

NRF24L01_Write_Reg2(W_REGISTER+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0有效数据宽度

NRF24L01_Write_Reg2(W_REGISTER+RF_SETUP, 0x0f);//设置TX发射参数:0db增益,2Mbps,低噪声增益开启

NRF24L01_Write_Reg2(W_REGISTER+NRF24L01_CONFIG, 0x0f);//基本参数:PWR_UP;EN_CRC;16BIT_CRC;接收模式;开启所有中断

NRF_CE2_HIGH;//CE为高,进入接收模式

}


1.5 NRF24L01的收发模式

收发模式有Enhanced ShockBurstTM收发模式、ShockBurstTM 收发模式和直接收发模式三种。


ShockBurstTM模式:


ShockBurst模式下,nRF24L01 可以与成本较低的低速 MCU 相连,高速信号处理是由芯片内部的射频协议处理的。nRF24L01 提供 SPI 接口数据率取决于单片机本身接口速度。ShockBurst 模式通过允许与单片机低速通信而无线部分高速通信减小了通信的平均消耗电流。


在 ShockBurstTM 接收模式下,当接收到有效的地址和数据时 IRQ 通知 MCU ,随后MCU可将接收到的数据从RX FIFO寄存器中读出。


在 ShockBurstTM 发送模式下,nRF24L01 自动生成前导码及 CRC 校验,数据发送完毕后 IRQ 通知 MCU ,减少了 MCU 的查询时间,也就意味着减少了MCU 的工作量同时减少了软件的开发时间。nRF24L01 内部有三个不同的RX FIFO寄存器 6 个通道共享此寄存器和三个不同的TX FIFO寄存器在掉电模式下待机模式下和数据传输的过程中 MCU 可以随时访问FIFO寄存器。这就允许 SPI 接口可以以低速进行数据传送并且可以应用于MCU硬件上没有SPI接口的情况下。


增强型的ShockBurstTM模式:


增强型ShockBurstTM模式可以使得双向链接协议执行起来更为容易有效,典型的双向链接为发送方要求终端设备在接收到数据后有应答信号以便于发送方检测有无数据丢失失。一旦数据丢失,则通过重新发送功能将丢失的数据恢复。增强型的ShockBurstTM模式可以同时控制应答及重发功能(数据重发设置寄存器(SETUP_RETR))而无需增加MCU工作量。


nRF24L01 在接收模式下可以接收6 路不同通道的数据,每一个数据通道使用不同的地址,但是共用相同的频道。也就是说6 个不同的 nRF24L01 设置为发送模式后可以与同一个设置为接收模式的 nRF24L01 进行通讯,而设置为接收模式的nRF24L01 可以对这6 个发射端进行识别。



数据通道0 是唯一 的一个可以配置为40 位自身地址的数据通道。1~5 数据通道都为8 位自身地址和32 位公用地址。所有的 数据通道都可以设置为增强型ShockBurst 模式。NRF24L01 在确认收到数据后记录地址,并以此地址为目标地址发送应答信号,在发送端,数据通道0被用作接收应答信号,因此属通道0 的接收地址要与发送地址端地址相等,以确保接收到正确的应答信号。


nRF24l01 配置为增强型的ShockBurstTM模式下,只要 MCU 有数据发送,就会启动增强型的ShockBurstTM模式来发送数据。发送结束后NRF24L01 转到接收模式且等待终端应答信号,若为收到应答,NRF24L01 将启动重发数据,直至收到 ACK 信号或者超出最大重发次数为止,超过重发次数,将产生 MAX_RT 中断。收到确认信号,NRF24L01 就认为最后一包数据已经发送成功,将把 TX_FIFO 中的数据清除且产生 TX_DS 中断(IRQ信号置高)。


Enhanced ShockBurstTM发射流程:


A. 把接收机的地址和要发送的数据按时序送入NRF24L01;

B. 配置CONFIG寄存器,使之进入发送模式。

C. 微控制器把CE置高(至少10us),激发NRF24L01进行Enhanced ShockBurstTM发射;

D.N24L01的Enhanced ShockBurstTM发射:(1) 给射频前端供电; (2)射频数据打包(加字头、CRC校验码); (3) 高速发射数据包; (4)发射完成,NRF24L01进入空闲状态。


Enhanced ShockBurstTM接收流程:

A. 配置本机地址和要接

[1] [2] [3]

关键字:STM32  驱动NRF24L01

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/2019/ic-news010942847.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32学习笔记——PWM基础知识与720电机驱动
下一篇:STM32驱动MPU6050(二)——软件实现

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32:STM32库函数配置

stm32 固件库V3.0以上的版本,main等源文件中不再直接包含stm32f10x_conf.h,而是stm32f10x.h,stm32f10x.h则定义了启动设置,以及所有寄存器宏定义,此文件中需要注意的有:使用V3.0以上版本固件库的方法如下:1.选择device(配置函数STM32F10x.h,具体配置方法如下)在STM32F10x.h中有如下代码:#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined
发表于 2019-01-17
STM32:STM32库函数配置

STM32:STM32学习记录1:MDK基本数据类型及代码优化

大概一年前开始接触STM32,当时就被它的库函数开发所吸引,但是迫于各种压力放弃了学习,一直在使用所谓稳定的单片机来开发(忍不住要吐槽),现在终于有时间了,开始自己的兴趣之旅喽!!现在网上有各种大牛的经验文档使我受益匪浅,也感谢室友的无私帮助!!!大概看了一下大牛的经验文档,好像没有一个提到MDK的基本数据类型的,自己找找看在MDK的帮助里面有。打开MDK-----help----uVision help----RealView Compiler Reference Guide----C and C++ implementation details----C and C++ implementation
发表于 2019-01-17
STM32:STM32学习记录1:MDK基本数据类型及代码优化

STM32:STM32学习记录5: 外部中断

配置流程:1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。2:IO口初始化,包括引脚,速率,输入输出模式等。3:NVIC 中断向量配置 ,中断向量基地址和优先级的配置。4:EXTI 中断/事件控制器,使能或失能外部线路,使能的模式(事件请求和中断请求),边沿触发模式,状态等。说明:1:主函数写在main.c中,中断函数写在stm32f10x_it.c 中,找到相应的中断函数(一般都是空白),加入自己的中断代码即可。2:中断函数名在startup_stm32f10x_xx.s中查阅3:清除 EXT13 线路的挂起位  注意此处一定要清除!!!!!!!!在EXTI_PR寄存器中3:NVIC一般配
发表于 2019-01-17

STM32学习记录——printf函数重定位

功能: 重定位printf函数,使printf作为串口打印输出函数。代替usart_send_string()函数步骤: usart.c中包含USART初始化函数 1、USART初始化(使能时钟、使能GPIO、GPIO和USART初始化) 2、打开USART 3、在usart.c中加入如下代码#ifdef __GNUC__     /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf      
发表于 2019-01-17

STM32USART串口调节与printf重定义

首先,printf重定义后可以直接使用printf函数从串口发送数据在usart.c中添加代码:#ifdef __GNUC__  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf     set to 'Yes') calls __io_putchar() */  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else  #define PUTCHAR_PROTOTYPE int f
发表于 2019-01-17

STM32中使用标准库重定义printf()函数

//重定义函数1PUTCHAR_PROTOTYPE{ /* Place your implementation of fputc here */ /* e.g. write a character to the USART */  USART_SendData(USART1, (uint8_t) ch);   /* 循环等待直到发送结束*/  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)  {}   return ch;}//重定义函数2 int fputc
发表于 2019-01-17

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved