NRF24L01详细教程

更新时间:2024-05-21 16:08:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

NRF24L01详细教程

近来课程的项目需要用到NRF24L01,用来做基本的收发,虽然资料拿到不少,但是,很多资料并不是很清晰、所带的例程并不够简洁或有不少冗余的部分,再加上对应的中文数据手册部分没翻译出来,翻译出来的不够有条理,很多地方模糊,甚至关键的地方看一两次还看不出来,导致了在学NRF24L01时花费了较多时间,所以,学完NRF24L01后,萌生了写个尽量清晰的教程的想法。

教程中的例程虽然是库开发方式,但基本都是最底层的操作才用到库函数譬如发一字节数据、GPIO置位等,虽然用的STM32,但我在看其他板子的例程时,发觉内容与流程都是差不多的,只是不同板引脚不同所导致的引脚配置的不同,不管用什么方式开发,用什么芯片,了解清楚NRF24L01如何配置,了解清楚其收发流程,基本上就会开发了,所以此文档虽然写的是以STM32为例,但看完此文档用NRF24L01基本也没什么大问题了。

教程说明:这教程是基于STMF103ZET6的,是野火的板子,例程也是从野火提供修改例程得来,用的是库开发的方式。

学习NRF24L01的步骤:

1.学习 SPI,SPI就是NRF24L01传送数据到单片机的一种协议,类似于 USB, 当然 USB还是比较有难度的。

2.了解 NRF24L01相关寄存器,结合中文数据手册了解NRF24L01的基本配置,收发数据前后的操作(如何启动发送接收、寄存器清空、标志位重置等)。 3.分析具体代码

SPI的简介:

具体的SPI教程,大家可以去野火的教程进行学习,在此只是简略介绍一下,SPI是一种一对多协议:一个主机(MCU)对应对多个从机,可以分时与多个从机通讯 SPI 总线包含 4 条总线,分别为 SS、SCK、MOSI、MISO,其含义分别为 SS:Slave Select,片选信号线,主机借此信号线选择一个从机,低电平有效。

MOSI:Master Output,Slave Input,主机数据从此线输出到从机,数据方向从主机到从机。

MISO:Master Input, Slave Output,主机从此线读取从机数据,数据方向从从机到主机。 SCK:Serial Clock,时钟频率线,主机时钟频率输出到从机。

对SPI的模式进行配置后(配置不算复杂,过程可以参照野火教程),通过SPI, MCU可以发送命令和数据与从机进行通信了。SPI协议中,先发指令,再发送需要写入的数据(如果进行写操作的话),这些指令,对主机来说,只是它遵守最基本的通讯协议发送出的数据。但设备把这些数据解释成不同的意义(指令编码),所以才成为指令。 介绍一下NRF24L01的管脚:

管脚名称 说明 GND 接地

VCC VCC脚接电压范围为1.9V~3.6V之间

CE 置高会启动发送(发送模式下)或者接收(接收模式下)

CSN 置低使能,SPI片选使能引脚,MCU的每条指令都要经历CSN从低到高 SCK 时钟信号引脚

MOSI 主机数据输出、从机数据输入线

MISO 主机数据输入、从机数据输出线

IRQ 中断引脚、当发送数据成功或者接收数据成功IRQ置低

管脚接法介绍:

GND与VCC对应板上的接即可,MISO、MOSI、SCK、CSN(有些SPI片选段写着的是SS) 对应SPI模块相应引脚即可。CE引脚接上一GPIO口,MCU通过此GPIO口控制CE高低电平即可,同理,IRQ引脚接上另一GPIO口,MCU通过此读取GPIO口的高低电平来判断是否中断。

下面介绍NRF24L01的工作模式和具体的发送与接收流程

工作模式:

NRF24L01有两种工作模式,一种ShockBurst?,一种是Enhanced ShockBurst?,两种模式的差别仅在于Enhanced ShockBurst?模式中在发送过程中会要求接收设备产生应答信号,以便发送方检测数据是否丢失,一旦丢失将重发丢失数据包将丢失的数据恢复。也因为Enhanced ShockBurst?模式有此优点,将很大程度上防止数据的丢失,因此较多选择Enhanced ShockBurst?模式,注意:选择Enhanced ShockBurst?模式,无需自己再写代码设置接收模式接收应答信号或者写代码让其重发,产生应答信号与自动重发(如果数据丢失),都是在设置为Enhanced ShockBurst?模式后自动进行的。

Enhanced ShockBurst?的发送模式下的流程:

① MCU通过SPI对NRF24L01进行基本配置,,配置自动应答通道使能(发送完一包数据后自动进入接收应答信号状态,发送一次发一包数据,一包数据格式见文档最后),设置

自动重发次数不为0(在此设置可以重发数据包)注:此两步是开启Enhanced ShockBurst?模式的关键。设置为发送模式,还有其他配置等等

② MCU把要发送的数据和接收数据设备的地址通过SPI写入NRF24L01 ③ CE引脚置高,启动发送 ④ 此时有两种情况:

1.在有限时间内收到应答信号,则TX_DS置高(发送数据成功标志位),并引发IRQ中断(引脚IRQ置低),并清除TX FIFO(此为发送缓冲寄存器,自行写代码清除),IRQ中断需要写状态寄存器进行复位(因为此处IRQ由TX_DS引发,将TX_DS复位即可使IRQ复位)

2.重发数据次数超过设定值,则MAX_RT置高(达到最多重发次数标志位),并引发IRQ中断(引脚IRQ置低),不清除TX FIFO,IRQ中断需要写状态寄存器进行复位(因为此处IRQ由MAX_RT引发,将MAX_RT复位即可使IRQ复位)

⑤ 接收到应答信号产生中断或者达到最大重发次数产生中断后,NRF24L01继续发下一包数据。

⑥ 当TX FIFO为空时,进入待机模式二(当CE为高,TX FIFO为空时,进入待机模式二;NRF24L01的工作模式图表在最后,工作模式不需过多理会,只要在适当时候拉高CE进行发送即可,配置NRF24L01时CE置低)

Enhanced ShockBurst?的接收模式下的流程:

① 与发送模式一样,一开始MCU通过SPI对NRF24L01进行基本配置,设置数据通道自动应答使能(在EN_AA寄存器进行设置,即收到数据后,向主机发送应答信号),注:此步是开启从机Enhanced ShockBurst?模式的关键。还有进行接收数据通道使能(在

EN_RXADDR寄存器配置,即选择六个接收通道的某一通道来接收数据,六个接收通道具体情况下面会说到),设置为接收模式,还有其他等配置。 ② 拉高CE引脚(CE置高),启动接收状态

③ 接收到一个有效数据包后,数据存储在RX FIFO,并产生RX_DR中断(RX_DR为接收数据成功标志位,接收成功置1),中断和发送模式一样,同样需要复位。 ④ 接收设备自动向发送设备发送确认信号(无需自己写代码) ⑤ 设置CE引脚为低,NRF24L01进入待机模式一 ⑥ MCU通过SPI读取NRF24L01收到的数据

根据NRF24L01的发送数据流程与接收数据流程,我们可以归纳出编写NRF24L01发送代码与接收代码的流程 发送过程:

a. MCU通过SPI对NRF24L01进行基本配置,配置好NRF24L01 b. MCU将要发送的数据与接收数据设备的地址写入NRF24L01 c. CE引脚置高,启动发送

接收过程:

a. MCU通过SPI对NRF24L01进行基本配置,配置好NRF24L01 b. CE引脚置高,启动接收

c. MCU对 NRF24L01进行数据读取

分析具体代码

7 //写RX节点地址 8

9 SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01); 10 //使能通道0的自动应答 11

12 SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01); 13 //使能通道0的接收地址 14

15 SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL); 16 //设置RF通信频率 17

18 SPI_NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); 19 //选择通道0的有效数据宽度 20

21 SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f); 22 //设置TX发射参数,0db增益,2Mbps, 23 低噪声增益开启 24

25 SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG, 0x0f); 26 //配置基本工作模式的参数;PWR_UP,EN_CRC, 27 16BIT_CRC,接收模式 28

29 } 6

SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); 7 //写RX节点地址

此段代码在发送模式的配置亦有同样的一段,作用是写明通道0的地址,在这里,接收通道0作用是不大一样的,接收模式下,接收设备的接收通道0接收的是一个数据包,而在发送模式下,接收通道0接收的是接收设备发过来的应答信号。

9 SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01); 10 //使能通道0的自动应答

在发送模式下,同样有此一句代码,但意义实质是不一样的,接收模式下,这句代码是使接收通道0接收到数据后,接收设备向发送设备发送应答信号。而发送模式下,此代码是使设备发送完数据后,进入接收状态,准备接收应答信号。

18 SPI_NRF_WriteReg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); 19 //选择通道0的有效数据宽度

此为设置接收设备接收的一包数据中有效数据的字节数,一包数据可以包含1到32个有效字节数据,在此说明,发送设备发过来的一个包数据中有限数据的字节数必须与接收数据通道0的有效数据宽度相等。

25 SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG, 0x0f); 26 //配置基本工作模式的参数;PWR_UP,EN_CRC, 27 16BIT_CRC,接收模式

此段代码,接收模式向配置寄存器写入的参数和发送模式不同,此处不同就在于配置寄存器最低位置1(最低位PRIM_RX置1为接收模式、置0为发送模式),因此接收模式输入的参数比发送模式大1。

当然,还有个差别是,接收设备不需要配置自动重发。

接收数据函数NRF_Rx_Dat(rxbuf)分析: 代码如下:

1 u8 NRF_Rx_Dat(u8 *rxbuf) 2 {

3 u8 state;

4 NRF_CE_HIGH(); //进入接收状态 5 /*等待接收中断*/

6 while (NRF_Read_IRQ()!=0); 7

8 NRF_CE_LOW(); //进入待机状态 9 /*读取status寄存器的值 */ 10 state=SPI_NRF_ReadReg(STATUS);

11

12 /* 清除中断标志*/

13 SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,state); 14

15 /*判断是否接收到数据*/

16 if (state&RX_DR) { //接收到数据 17 SPI_NRF_ReadBuf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH); 18 //读取数据

19 SPI_NRF_WriteReg(FLUSH_RX,NOP); //清除RX 20 FIFO寄存器 21 return RX_DR; 22 } else

23 return ERROR; //没收到任何数据 24 }

可以看到,发送数据处理函数与接收处理函数基本一样,只是CE置高与数据处理顺序不同而已。

至此,接收模式讲解完毕

说明一下:

状态寄存器中TX_DS、RX_DR、MAX_RT三位其对应类型中断发生时是被置1的,同时清除这些中断是向这些位写1,这就是为什么会看到,代码中,清除中断标志是先读状态寄存

器的数值后,再向状态寄存器写入刚读出的数值。 (模糊的地方,FIFO的处理)

一个数据包可以写入1—32个字节的有效数据,也就是说发送一次数据,可以选择发送1—32个字节。

注:有关具体寄存器、与其具体的位,请查阅中文数据手册,此处就不再列出

本文来源:https://www.bwwdw.com/article/pbf7.html

Top