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 register PRIM_RX register CE FIFO state

RX Mode 1 1 1 -

TX Mode 1 0 1 数据存在TX FIFO寄存器中

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

待机模式2 1 0 1 TX FIFO为空

待机模式1 1 - 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 ACK EN_AA

4)使能 PIPE 0 EN_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 ACK EN_AA

3)使能 PIPE 0 EN_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)发射

[1] [2] [3]

关键字:STM32  驱动NRF24L01

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

上一篇:STM32学习笔记——PWM基础知识与720电机驱动
下一篇:最后一页

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

推荐阅读

STM32程序移植技巧总结

1. 工程更换不同的STM32芯片eg:stm32f103rct6 ---->stm32f103c8t6:1.1. 修改芯片点击魔术棒,在出来的菜单栏里,Device 选项重新选择芯片1.2. 修改启动文件此处举例是 RCT6 修改为 C8T6,因为 flash 容量大小不一样,所以需要对应修改启动文件,如果是 flash 大小相同,此步骤不需要。此处由:startup_stm32f10x_hd.s修改为startup_stm32f10x_md.s1.3. 修改全局宏定义同样先点击魔术棒,在菜单栏选择 C/C++。进而修改全局宏定义。此处:STM32F10X_HD–>STM32F10X_MD1.4. 重新添加FLASH
发表于 2019-01-09
STM32程序移植技巧总结

STM32学习笔记一一FLASH 模拟 EEPROM

1. 简述STM32 本身没有自带 EEPROM,但是 STM32 具有在应用编程(IAP:In Application Programming)功能,可以把它的 FLASH 当成 EEPROM 来使用。不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了1024K 字节。MiniSTM32 开发板选择的 STM32F103RCT6 的 FLASH 容量为 256K 字节,属于大容量产品,闪存模块组织如下图:1.1 主存储器:该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品,其被划分为 256 页,每页 2K 字节。**注意:**小容量和中容量产品则每页
发表于 2019-01-09
STM32学习笔记一一FLASH 模拟 EEPROM

STM32学习笔记一一HEX文件和BIN文件格式

1. 引言今天看串口的 IAP ,平时我们通过 JTAG 等工具下载的都是 HEX 文件,都没有思考一下 HEX 的文件组成。而串口 IAP 下载的是 BIN 文件,刚好在这里区分学习一下。我们平时烧写 HEX 文件是不需要设置地址信息的,因为已经包含在文件里面,而使用 BIN 烧写,需要在程序中指定地址。2. 简述Intel hex 文件是记录文本行的 ASCII 文本文件,在 Intel HEX 文件中,每一行是一个 HEX 记录,由十六进制数组成的机器码或者数据常量。Intel HEX 文件经常被用于将程序或数据传输存储到 ROM、EPROM,大多数编程器和模拟器使用Intel HEX文件。2.1 HEX文件HEX 文件是包括
发表于 2019-01-09
STM32学习笔记一一HEX文件和BIN文件格式

STM32学习笔记一一串口 IAP

(Bootloader 程序)必须通过其它手段,如 JTAG 或 ISP 烧入;第二部分代码(APP 程序)可以使用第一部分代码 IAP 功能烧入,也可以和第一部分代码一起烧入,以后需要程序更新时再通过第一部分 IAP代码更新。他们存放在 STM32 FLASH 的不同地址范围,一般从最低地址区开始存放 Bootloader,紧跟其后的就是 APP 程序。2 .STM32程序流程2.1 STM32 正常的程序运行流程下图为 STM32 正常的程序运行流程:STM32 的内部闪存(FLASH)地址起始于 0x08000000,一般情况下,程序文件就从此地址开始写入。此外STM32是基于Cortex-M3内核的微控制器,其内部通过一张
发表于 2019-01-09
STM32学习笔记一一串口 IAP

STM32学习笔记一一待机唤醒

1. 简述1.1 低功耗模式:在系统或电源复位以后,微控制器处于运行状态。当CPU不需继续运行时,可以利用多种低功耗模式来节省功耗,例如:等待某个外部事件时,常见的按键唤醒。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。1.2 STM32F10X系列的低功耗模式STM32F10xxx有三种低功耗模式:–模式– –特点—睡眠模式 Cortex-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行停止模式 所有的时钟都已停止待机模式 1.8V电源关闭在这三种低功耗模式中,最低功耗的是待机模式,在此模式下,最低只需 2uA 左右的电流。停机模式
发表于 2019-01-09
STM32学习笔记一一待机唤醒

STM32学习笔记一一红外遥控

}2.2 中断捕获u8 RmtSta=0;u16 Dval;u32 RmtRec=0;u8 RmtCnt=0;void TIM5_IRQHandler(void){ if(TIM_GetITStatus(TIM5,TIM_IT_Update)!= RESET) { if(RmtSta&0x80)//数据接收到标志位 { RmtSta &= ~0x10;//取消上升沿捕获标记 if((RmtSta&0x0F)==0x00) RmtSta |= 1<<6; if((RmtSta&0x0F)<14) RmtSta++; else { RmtSt
发表于 2019-01-09
STM32学习笔记一一红外遥控

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved
pt type="text/javascript" src="//v3.jiathis.com/code/jia.js?uid=2113614" charset="utf-8">