文档库 最新最全的文档下载
当前位置:文档库 › NRF24L01详细教程

NRF24L01详细教程

NRF24L01详细教程
NRF24L01详细教程

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进行数据读取

分析具体代码

发送模式:

首先我们来看一下例程发送模式下的mian.c 文件

1 #include "stm32f10x.h"

2 #include "bsp_usart1.h"

3 #include "bsp_spi_nrf.h"

4

5 /*

6 * PA2 - PG8 ce使能

7 * PA1 - PG15 cs片选

8 * PA3 - PC4 irq中断

9 */

10 u8 status; //用于判断接收/发送状态

11 u8 txbuf[4]= {0,1,2,3}; //发送缓冲

12 u8 rxbuf[4]; //接收缓冲

13 int i=0;

14

15 /**

16 * @brief 主函数

17 * @param 无

18 * @retval 无

20 int main(void)

21 {

22 SPI_NRF_Init();

23

24 /* 串口1初始化*/

25 USART1_Config();

26

27 printf("\r\n 这是一个NRF24L01 无线传输实验\r\n");

28 printf("\r\n 这是无线传输主机端的反馈信息\r\n");

29

30

31

32

33 NRF_TX_Mode();

34

35 while (1) {

36 printf("\r\n 主机端进入自应答发送模式\r\n");

37

38

39 /*开始发送数据*/

40 status = NRF_Tx_Dat(txbuf);

42 /*判断发送状态*/

43 switch (status) {

44 case MAX_RT:

45 printf("\r\n 主机端

46 没接收到应答信号,发送次数超过限定次数

47 ,发送失败。\r\n");

48 break;

49

50 case ERROR:

51 printf("\r\n 未知原因导致发送失败。\r\n");

52 break;

53

54 case TX_DS:

55 printf("\r\n 主机端接收到从机端

56 的应答信号,发送成功!\r\n");

57 break;

58 }

59

60

61 }

62 }

我们来分析一下mian函数里面的代码

开头的调用的第一个函数就是SPI_NRF_Init(),跟踪这个函数的内容,我们可以发现这函数主要是进行SPI的有关配置与NRF24L01引脚接入STM32 GPIO的有关配置;有关SPI 配置内容,读者可以前去SPI的有关教程了解,这里不展开了。有关GPIO口的配置,这里不是重点,所以亦不展开,可以去读关于LED灯的配置,了解学习GPIO配置的内容。同理调用的第二个函数USART1_Config()亦不作展开.

NRF_TX_Mode()函数的分析:

我们来看一下NRF_TX_Mode()这个函数,这是配置NRF24L01作为发送设备的函数,我们跟踪其定义可以看到如下代码:

1 void NRF_TX_Mode(void)

2 {

3 NRF_CE_LOW();

4

5

SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);

6 //写TX节点地址

7

8

SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);

9 //设置TX节点地址,主要为了使能ACK

10

11 SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);

12 //使能通道0的自动应答

13

14 SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);

15 //使能通道0的接收地址

16

17 SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);

18 //设置自动重发间隔时间:500us + 86us;

19 最大自动重发次数:10次

20

21 SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);

22 //设置RF通道为CHANAL

23

24 SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f);

25 //设置TX发射参数,0db增益,2Mbps,

26 低噪声增益开启

27

28 SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG,0x0e);

29 //配置基本工作模式的参数;PWR_UP,EN_CRC,

30 16BIT_CRC,发射模式,开启所有中断

31

32 }

函数第一行代码NRF_CE_LOW()根据函数名我们就可以获悉它的作用是将CE引脚置低,此作用是确保CE是低电平,处于待机模式一下进行配置

SPI_NRF_WriteBuf()函数分析:

第二行代码SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH)从函数我们可以得知其是向NRF24L01写入一串数据。我们跟踪它,代码如下:

1 /**

2 * @brief 用于向NRF的寄存器中写入一串数据

3 * @param

4 * @arg reg : NRF的命令+寄存器地址

5 * @arg

6 pBuf:存储了将要写入写寄存器数据的数组,外部定义

7

8 * @arg bytes: pBuf的数据长度

9 * @retval NRF的status寄存器的状态

10 */

11 u8 SPI_NRF_WriteBuf(u8 reg ,u8 *pBuf,u8 bytes)

12 {

13 u8 status,byte_cnt;

14

15 /*置低CSN,使能SPI传输*/

16 NRF_CSN_LOW();

17

18 /*发送寄存器号*/

19 status = SPI_NRF_RW(reg);

20

21 /*向缓冲区写入数据*/

22 for (byte_cnt=0; byte_cnt

23 SPI_NRF_RW(*pBuf++); //写数据到缓冲区

24

25 /*CSN拉高,完成*/

26 NRF_CSN_HIGH();

27

28 return (status); //返回NRF24L01的状态

29 }

第一行NRF_CSN_LOW()是将CSN置低,CSN是片选使能的作用,低电平有效,此在强调一下,NRF24L01的每一条指令的执行都要经过CSN置低后再置高,这就是为什么26行代码NRF_CSN_HIGH()置高CSN的原因。

SPI_NRF_RW(reg)函数分析:

19行代码status = SPI_NRF_RW(reg)调用了函数SPI_NRF_RW(reg)我们追踪其代码

1 /**

2 * @brief 用于向NRF读/写一字节数据

3 * @param 写入的数据

4 * @arg dat

5 * @retval 读取得的数据

6 */

7 u8 SPI_NRF_RW(u8 dat)

8 {

9 /* 当SPI发送缓冲器非空时等待*/

10 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

11

12 /* 通过SPI2发送一字节数据*/

13 SPI_I2S_SendData(SPI1, dat);

14

15 /* 当SPI接收缓冲器为空时等待*/

16 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

17

18 /* Return the byte read from the SPI bus */

19 return SPI_I2S_ReceiveData(SPI1);

20 }

此函数用到了很多库函数,在此我们就不分析库函数了,我们了解此函数功能即可,从这函数的说明,我们就能知道,这函数是写入或者读取一字节数据用的。

回到SPI_NRF_WriteBuf(u8 reg ,u8 *pBuf,u8 bytes)函数,我们发觉,它向SPI_NRF_RW(reg)传入的参数是reg,SPI_NRF_WriteBuf()的函数介绍里,reg是指NRF 的命令+寄存器地址,但是这是怎么回事,其实,这里传递的一个字节数据对NRF24L01来说是指令,上面的SPI简介就提到,一些数据对主机来说仅仅是数据,但对从机而言便是指令了。

下面了解一下NRF24L01的指令:

其中,读配置寄存器一个字节的指令后五位是该寄存器地址,写配置寄存器的一个字节指令后五位是该寄存器地址,第六位是1,这就是为什么SPI_NRF_WriteBuf()函数传入的参数是NRF_WRITE_REG+TX_ADDR了,其中NRF_WRITE_REG = 0x20(即0010 0000),TX_ADDR就是寄存器的地址。以上的NRF24L01其他指令,在以下的代码将有用到。

写入命令后,接下来u8 SPI_NRF_WriteBuf(u8 reg ,u8 *pBuf,u8 bytes)的22、23代码即是向寄存器写数据的过程。

5

SPI_NRF_WriteBuf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);

6 //写TX节点地址

由此,我们了解次此两行代码的作用是写入TX的地址,即告知发送设备即将接收数据设备的地址。

8

SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);

9 //设置TX节点地址,主要为了使能ACK

同理是为了写明NRF24L01接收通道0的地址,接收通道0为接收应答信号用,在此说明NRF24L01在接收模式下可以接收6路不同的数据,有6个通道,6个通道的地址有5个通道地址有一定限制,详情参照数据手册。

11 SPI_NRF_WriteReg(NRF_WRITE_REG+EN_AA,0x01);

12 //使能通道0的自动应答

11行代码中使用了新的函数SPI_NRF_WriteReg()跟踪其定义发现其作用与SPI_NRF_WriteBuf()差别在于SPI_NRF_WriteReg()是写入一个字节的数据由此可知11行代码的功能是将EN_AA寄存器配置为0x01,查阅手册可知其是使能通道0自动应答。

14 SPI_NRF_WriteReg(NRF_WRITE_REG+EN_RXADDR,0x01);

15 //使能通道0的接收地址

同理可知其功能是使能接收通道0能够接收数据

17 SPI_NRF_WriteReg(NRF_WRITE_REG+SETUP_RETR,0x1a);

18 //设置自动重发间隔时间:500us + 86us;

19 最大自动重发次数:10次

此为有关重发次数和重发时间间隔的配置

21 SPI_NRF_WriteReg(NRF_WRITE_REG+RF_CH,CHANAL);

22 //设置RF通道为CHANAL

23

24 SPI_NRF_WriteReg(NRF_WRITE_REG+RF_SETUP,0x0f);

25 //设置TX发射参数,0db增益,2Mbps,

26 低噪声增益开启

此处读者编程时按一般例程写即可,可不深究,注意接收设备与发送设备相等。

28 SPI_NRF_WriteReg(NRF_WRITE_REG+CONFIG,0x0e);

29 //配置基本工作模式的参数;PWR_UP,EN_CRC,

30 16BIT_CRC,发射模式,开启所有中断

此处是对NRF24L01的配置寄存器进行配置,设置为发送状态,上电、允许所有中断(TX_DS、RX_DR、MAX_RT)等

至此,发送模式配置完毕。

NRF_Tx_Dat(txbuf)函数分析:

我们接着看main函数的39与40行代码

39 /*开始发送数据*/

40 status = NRF_Tx_Dat(txbuf);

根据发送流程,大家都知道这是MCU写入数据到NRF24L01了,我们具体跟踪此函数代码,代码如下:

1 /**

2 * @brief 用于向NRF的发送缓冲区中写入数据

3 * @param

4 * @arg

5 txBuf:存储了将要发送的数据的数组,外部定义

6 * @retval 发送结果,成功返回TXDS,失败返回MAXRT或ERROR

7 */

8 u8 NRF_Tx_Dat(u8 *txbuf)

9 {

10 u8 state;

11

12 /*ce为低,进入待机模式1*/

13

14 /*写数据到TX BUF 最大32个字节*/

15 SPI_NRF_WriteBuf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);

16

17 /*CE为高,txbuf非空,发送数据包*/

18 NRF_CE_HIGH();

19

20 /*等待发送完成中断*/

21 while (NRF_Read_IRQ()!=0);

22

23 /*读取状态寄存器的值*/

24 state = SPI_NRF_ReadReg(STATUS);

25

26 /*清除TX_DS或MAX_RT中断标志*/

27 SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,state);

28

29 SPI_NRF_WriteReg(FLUSH_TX,NOP); //清除TX FIFO寄存器

30

31 /*判断中断类型*/

32 if (state&MAX_RT) //达到最大重发次数

33 return MAX_RT;

34

35 else if (state&TX_DS) //发送完成

36 return TX_DS;

37 else

38 return ERROR; //其他原因发送失败

39 }

14 /*写数据到TX BUF 最大32个字节*/

15 SPI_NRF_WriteBuf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);

此两行代码即为写入要发送的数据。

17 /*CE为高,txbuf非空,发送数据包*/

18 NRF_CE_HIGH();

拉高CE,启动发送。

20 /*等待发送完成中断*/

21 while (NRF_Read_IRQ()!=0);

MCU启用查询的方式,等待中断发生。(注:例程暂时提供是查询的方式检测中断,在此,编者并不建议用查询的方式,因为这会占用CPU,使部分其他功能可能无法加入,建议用中断的方式进行。)

23 /*读取状态寄存器的值*/

24 state = SPI_NRF_ReadReg(STATUS);

25

26 /*清除TX_DS或MAX_RT中断标志*/

27 SPI_NRF_WriteReg(NRF_WRITE_REG+STATUS,state);

29 SPI_NRF_WriteReg(FLUSH_TX,NOP); //清除TX FIFO寄存器

中断产生后,读取状态寄存器的值,判断中断的类型,此处SPI_NRF_ReadReg();函数为读寄存器函数,功能与操作与上面的函数类似,就不展开了。读取后,并复位状态寄存器,清除中断,并且清除发送寄存器

至此,NRF24L01发送完成。

接收模式:

对比发送模式与接收模式的代码编写流程,可以发现其实两者是差不多的,只是配置有部分不同,数据处理与CE拉高顺序部分不同,发送模式下,写入数据和地址后,拉高CE,接收模式下,先拉高CE,再读取数据。因为有多地方是相同的,所以就不再赘述,只说明不相同的地方。

模式配置的不同:

先看接收模式的代码:

1 void NRF_RX_Mode(void)

2

3 {

4 NRF_CE_LOW();

5

6

SPI_NRF_WriteBuf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);

nRF24L01无线通信模块使用手册12

深圳市德普施科技有限公司 nRF24L01无线通信模块使用手册 一、模块简介 该射频模块集成了NORDIC公司生产的无线射频芯片nRF24L01: 1.支持2.4GHz的全球开放ISM频段,最大发射功率为0dBm 2.2Mbps,传输速率高 3.功耗低,等待模式时电流消耗仅22uA 4.多频点(125个),满足多点通信及跳频通信需求 5.在空旷场地,有效通信距离:25m(外置天线)、10m(PCB天线) 6.工作原理简介: 发射数据时,首先将nRF24L01配置为发射模式,接着把地址TX_ADDR和数据TX_PLD 按照时序由SPI口写入nRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10μs,延迟130μs后发射数据;若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号。如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD从发送堆栈中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC_CNT)达到上限,MAX_RT置高,TX_PLD不会被清除;MAX_RT或TX_DS置高时,使IRQ变低,以便通知MCU。最后发射成功时,若CE为低,则nRF24L01进入待机模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入待机模式2。 接收数据时,首先将nRF24L01配置为接收模式,接着延迟130μs进入接收状态等待数据的到来。当接收方检测到有效的地址和CRC时,就将数据包存储在接收堆栈中,同时中断标志位RX_DR置高,IRQ变低,以便通知MCU去取数据。若此时自动应答开启,接收方则同时进入发射状态回传应答信号。最后接收成功时,若CE变低,则nRF24L01进入空闲模式1。 三、模块引脚说明

NRF24L01无线模块收发程序例程

//下面是接收的NRF24L01的程序。 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include #include "nrf24l01.h" #include #define uchar unsigned char #define uint unsigned int sbit IRQ =P1^2;//输入 sbit MISO =P1^3; //输入 sbit MOSI =P1^1;//输出 sbit SCLK =P1^4;//输出 sbit CE =P1^5;//输出 sbit CSN =P1^0;//输出 uchar RevTempDate[5];//最后一位用来存放结束标志 uchar code TxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址 /*****************状态标志*****************************************/ uchar bdata sta; //状态标志 sbit RX_DR=sta^6; sbit TX_DS=sta^5; sbit MAX_RT=sta^4; /*****************SPI时序函数******************************************/ uchar NRFSPI(uchar date) { uchar i; for(i=0;i<8;i++) // 循环8次 { if(date&0x80) MOSI=1; else MOSI=0; // byte最高位输出到MOSI date<<=1; // 低一位移位到最高位 SCLK=1; if(MISO) // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据date|=0x01; // 读MISO到byte最低位 SCLK=0; // SCK置低 } return(date); // 返回读出的一字节 } /**********************NRF24L01初始化函数*******************************/ void NRF24L01Int() {

nRF24L01无线通信模块使用手册

nRF24L01无线通信模块使用手册 一、模块简介 该射频模块集成了NORDIC公司生产的无线射频芯片nRF24L01: 1.支持2.4GHz的全球开放ISM频段,最大发射功率为0dBm 2.2Mbps,传输速率高 3.功耗低,等待模式时电流消耗仅22uA 4.多频点(125个),满足多点通信及跳频通信需求 5.在空旷场地,有效通信距离:25m(外置天线)、10m(PCB天线) 6.工作原理简介: 发射数据时,首先将nRF24L01配置为发射模式,接着把地址TX_ADDR和数据TX_PLD按照时序由SPI 口写入nRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10μs,延迟130μs后发射数据;若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号。如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD 从发送堆栈中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC_CNT)达到上限,MAX_RT置高,TX_PLD不会被清除;MAX_RT或TX_DS置高时,使IRQ变低,以便通知MCU。最后发射成功时,若CE为低,则nRF24L01进入待机模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入待机模式2。 接收数据时,首先将nRF24L01配置为接收模式,接着延迟130μs进入接收状态等待数据的到来。当接收方检测到有效的地址和CRC时,就将数据包存储在接收堆栈中,同时中断标志位RX_DR置高,IRQ 变低,以便通知MCU去取数据。若此时自动应答开启,接收方则同时进入发射状态回传应答信号。最后接收成功时,若CE变低,则nRF24L01进入空闲模式1。 二、模块电气特性 参数数值单位 供电电压5V 最大发射功率0dBm 最大数据传输率2Mbps 电流消耗(发射模式,0dBm)11.3mA 电流消耗(接收模式,2Mbps)12.3mA 电流消耗(掉电模式)900nA 温度范围-40~+85℃ 三、模块引脚说明 管脚符号功能方向 1GND电源地 2IRQ中断输出O 3MISO SPI输出O 4MOSI SPI输入I 5SCK SPI时钟I 6NC空 7NC空 8CSN芯片片选信号I 9CE工作模式选择I 10+5V电源

NRF24L01无线模块C语言程序

NRF24L01无线模块C语言程序 24MHz晶振 #include #include #include #include #include #include #define U8 unsigned char #define U16 unsigned int #define TX_ADDR_WITDH 5 //发送地址宽度设置为5个字节 #define RX_ADDR_WITDH 5 //接收地址宽度设置为5个字节 #define TX_DATA_WITDH 1//发送数据宽度1个字节 #define RX_DATA_WITDH 1//接收数据宽度1个字节 #define R_REGISTER 0x00//读取配置寄存器 #define W_REGISTER 0x20//写配置寄存器 #define R_RX_PAYLOAD 0x61//读取RX有效数据 #define W_TX_PAYLOAD 0xa0//写TX有效数据 #define FLUSH_TX 0xe1//清除TXFIFO寄存器 #define FLUSH_RX 0xe2//清除RXFIFO寄存器 #define REUSE_TX_PL 0xe3//重新使用上一包有效数据 #define NOP 0xff//空操作 #define CONFIG 0x00//配置寄存器 #define EN_AA 0x01//使能自动应答 #define EN_RXADDR 0x02//接收通道使能0-5个通道 #define SETUP_AW 0x03//设置数据通道地址宽度3-5 #define SETUP_RETR 0x04//建立自动重发 #define RF_CH 0x05//射频通道设置 #define RF_SETUP 0x06//射频寄存器 #define STATUS 0x07//状态寄存器 #define OBSERVE_TX 0x08//发送检测寄存器 #define CD 0x09//载波 #define RX_ADDR_P0 0x0a//数据通道0接收地址 #define RX_ADDR_P1 0x0b//数据通道1接收地址 #define RX_ADDR_P2 0x0c//数据通道2接收地址 #define RX_ADDR_P3 0x0d//数据通道3接收地址 #define RX_ADDR_P4 0x0e//数据通道4接收地址 #define RX_ADDR_P5 0x0f//数据通道5接收地址

NRF24L01功能使用文档

NRF24L01使用文档 基于c8051f330单片机

目录 芯片简介 (3) 1 NRF24L01功能框图 (4) 2 NRF24L01状态机 (5) 3 Tx与Rx的配置过程 (7) 3.1 Tx 模式初始化过程 (7) 3.2 Rx模式初始化过程 (8) 4控制程序详解 (9) 4.1 函数介绍 (9) 4.1.1 uchar SPI_RW(uchar byte) (9) 4.1.2 uchar SPI_RW_Reg (uchar reg, uchar value) (10) 4.1.3 uchar SPI_Read (uchar reg); (10) 4.1.4 uchar SPI_Read_Buf (uchar reg, uchar *pBuf, uchar bytes); (11) 4.1.5 uchar SPI_Write_Buf (uchar reg, uchar *pBuf, uchar bytes); (11) 4.1.6 void RX_Mode(void) (12) 4.1.7 void TX_Mode(void) (13) 4.2 NRF24L01相关命令的宏定义 (13) 4.3 NRF24L01相关寄存器地址的宏定义 (14) 5 实际通信过程示波器图 (16) 1)发射节点CE与IRQ信号 (17) 2)SCK与IRQ信号(发送成功) (18) 3)SCK与IRQ信号(发送不成功) (19)

芯片简介 NRF24L01是NORDIC公司最近生产的一款无线通信通信芯片,采用FSK调制,内部集成NORDIC自己的Enhanced Short Burst 协议。可以实现点对点或是1对6的无线通信。无线通信速度可以达到2M(bps)。NORDIC公司提供通信模块的GERBER文件,可以直接加工生产。嵌入式工程师或是单片机爱好者只需要为单片机系统预留5个GPIO,1个中断输入引脚,就可以很容易实现无线通信的功能,非常适合用来为MCU系统构建无线通信功能。

nrf24l01(2.4G模块)

NRF24L01(2.4G模块) 一、模块简介 (1)2.4GHz全球开放ISM频段免许可证使用。 (2)最高工作速率2Mbps,高效GFSK调制,抗干扰能力强。 (3)126频道,满足多点通信和跳频通信需要。 (4)内置硬件CRC检错,和点对点通信地址控制。 (5)低功耗,1.9-3.6V工作,待机模式下22uA;掉电模式900nA。 (6)内置2.4GHz天线,体积小巧:15mm×29mm。 (7)模块可软件设置地址,只有收到本机地址时才会输出数据(提供中断提示),可直接接各种单片机使用,软件编程非常方便。 (8)内稳压电路,使用各种电源包括DC/DC开关电源均有很好的通道效果。 (9)2.54mm间距接口,DIP封闭。 (10)工作于Enhanced ShockBurst具有Automatic packet handling,Auto packet transaction handling,具有可选的内置包应答机制,极大地降低丢包率。 (11)与51单片机P0口连接的时候,需要加10K的上拉电阻,与其余口连接不需要。(12)其他系列的单片机,如果是5V的,请参考该系列单片机IO口输出电流大小,如果超过10mA,需要串联电阻分压,否则容易烧毁模块!如果是3.3V的,可以直接和RF24L01模块的IO口线连接。比如AVR系列单片机。如果是5V的一般串接2K的电阻。 二、接口电路 说明: 1)VCC脚接电压范围为:1.9V-3.6V,不能在这个敬意之外,超过3.6V将会烧毁模块。推荐电压3.3左右。 2)除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口直接相连,无需转换。当然对3V左右的单片机更加适用了。 3)硬件上面没有SPI的单片机也可以控制本模块,用普通单片机IO口模拟SPI,不需要单片机真正的串口介入,只需要普通的单片机IO口就可以了,当然用串口也可以。 4)如果需要其他封装接口,比如密脚插针,或者其他形式的接口,可联系我们定做。 三、引脚说明

nrf24l01无线模块NRF24L01模块收发c程序

//许多人都在找nrf24l01无线模块的c程序;我以前刚接触无线//时用的就是nrf24l01模块;搜索了许多程序有很多都没法直接用;甚至还怀疑模块是不是被我搞坏了;拿去让别人检测模块又是好的;为避免大家走弯路;我将我的程序发出来供大家参考; 这是nrf24l01无线模块pcb图; 下面有Nrf24l01无线模块的收发c程序;以下程序经本人亲自测试;绝对能用!! 请注意以下几点: 1、24L01模块的电源电压是否为3V-3.6V之间; 2、如果您用的单片机是5V的话,请在IO口与模块接口之间串一个1K电阻; 3、检查模块的GND是否与单片机的GND相连接 4、先用程序进行调试,如果IO口不同,请更改IO口或相关时序; 5、如果是51系列单片机,晶振请选用11.0592M Hz; 模块供电最好用asm1117 5v转3.3v 稳压 测试单片机是stc89c52;at89c52 通用; 收发一体;

一大截不废话了;上程序;此程序是按键控制led;当按下s的时候对应接受的led会闪闪发光;很简单的~如果要实现其他更先进的功能;自己发掘吧~~ 务必将硬件连接正确;否则;它不会工作的~~当然做什么都要严谨~~错一点就差大了~~ 《《收发一体程序》》 #include #include typedef unsigned char uchar; typedef unsigned char uint; //****************************************NRF24L01端口定义

*************************************** sbit M ISO =P1^3; sbit M OSI =P1^4; sbit SCK =P1^2; sbit CE =P1^1; sbit CSN =P3^2; sbit IRQ =P3^3; //************************************按键*************************************************** sbit KEY=P2^0; //***************************************************************************** sbit led=P2^1; //*********************************************NRF24L01*********************** ************** #define TX_ADR_WIDTH 5 // 5 uints TX address width #define RX_ADR_WIDTH 5 // 5 uints RX address width #define TX_PLOAD_WIDTH 20 // 20 uints TX payload #define RX_PLOAD_WIDTH 20 // 20 uints TX payload uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址//***************************************NRF24L01寄存器指令******************************************************* #define READ_REG 0x00 // 读寄存器指令 #define WRITE_REG 0x20 // 写寄存器指令 #define RD_RX_PLOAD 0x61 // 读取接收数据指令 #define WR_TX_PLOAD 0xA0 // 写待发数据指令 #define FLUSH_TX 0xE1 // 冲洗发送FIFO指令 #define FLUSH_RX 0xE2 // 冲洗接收FIFO指令 #define REUSE_TX_PL 0xE3 // 定义重复装载数据指令 #define NOP 0xFF // 保留 //*************************************SPI(nRF24L01)寄存器地址**************************************************** #define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 // 自动应答功能设置 #define EN_RXADDR 0x02 // 可用信道设置 #define SETUP_AW 0x03 // 收发地址宽度设置 #define SETUP_RETR 0x04 // 自动重发功能设置 #define RF_CH 0x05 // 工作频率设置 #define RF_SETUP 0x06 // 发射速率、功耗功能设置 #define STATUS 0x07 // 状态寄存器 #define OBSERVE_TX 0x08 // 发送监测功能 #define CD 0x09 // 地址检测 #define RX_ADDR_P0 0x0A // 频道0接收数据地址 #define RX_ADDR_P1 0x0B // 频道1接收数据地址

NRF24L01参考程序(包含多个实例)

(相关人员如觉得本人水平低下,还请见谅) Nrf24L01的使用程序和使用方法和简单操作: 功能: 无线对发程序。两个模块a,b,实现按下一个按键,会在对方的数码管上显示3或4,在本机上显示1,2。 当一个模块,比如a模块。当两个按键按下其中一个,则会在另一个模块b上显示数字3,4(具体根据按下哪个按键)。以上功能描述,B模块按键按下,如同a模块一样的功能,不做系统性描述了。 下面给出程序中几个地方的解释: #define READ_REG 0x00 // 读寄存器指令 #define WRITE_REG 0x20 // 写寄存器指令 #define RD_RX_PLOAD 0x61 // 读取接收数据指令 #define WR_TX_PLOAD 0xA0 // 写待发数据指令 #define FLUSH_TX 0xE1 // 冲洗发送FIFO指令 #define FLUSH_RX 0xE2 // 冲洗接收FIFO指令 #define REUSE_TX_PL 0xE3 // 定义重复装载数据指令 #define NOP 0xFF // 保留 类似这种的描述,可以等同于READ_REG =0x00;这个是经过实际程序测试出来的,比如 以下程序: #include #define k 0xfe void main() { P1=k; } 则会出现此类结果:

MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI uchar = (uchar << 1); // shift next bit into MSB.. SCK = 1; // Set SCK high.. uchar |= MISO; // capture current MISO bit SCK = 0; 此处为spi的核心,是spi协议的编程,其中uchar |= MISO; 表示uchar |= MISO | uchar; MOSI = (uchar & 0x80);其中0x80是1000 0000,与上uchar,这种&,是按位与,故可以从uchar提取出一个电平给mosi。 MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI uchar = (uchar << 1); 这两句组合起来用,就实现了把uchar编程8位2进制数后的每一位都可以发送给mosi;Uchar的只待对象,就是上面的诸如#define FLUSH_TX 0xE1 这样的数,或者是相关的发送数据。 *pBuf这个并不是一个主要的问题,实际这个是涉及指针问题的,带*的跟地址有关系,但是我们其实不需要很关心编译的时候数据被具体存入哪个地址,即使是很重要的数据。 void init_NRF24L01(void) { inerDelay_us(100); CE=0; // chip enable CSN=1; // Spi disable SCK=0; // SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动ACK应答允许 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB } 在整个初始化中我们看到: CE=0; // chip enable CSN=1; // Spi disable 这是设置整个的状态。如过状态设置成待机,则引脚可能变为高阻。(以上并非全部引脚)

nrf24l01无线模块

基于nRF24L01的无线温度采集系统设计 1引言 温度采集系统所采集的温度通常通过RS485、CAN总线通信方式传输至上位机,但这种方式维护较困难,不利于工业现场生产;而无线通信GPRS技术传输距离长,通信可靠稳定,但设计复杂、成本昂贵。这里采用工业级内置硬件链路层协议的低成本单芯片nRF24L01型无线收发器件实现系统间的无线 通信,完成无线信号的接收、显示及报警功能。 2nRF24L01简介 nRF24L01是一款工业级内置硬件链路层协议的低成本无线收发器。该器件工作于2.4GHz全球开放ISM频段,内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合增强型ShockBu rst技术,其输出功率和通信频道可通过程序配置。拥有ShockBurst和Enhanced ShockBurst两种数据传输模式。可直接与单片机I/O连接,外接元件数目少。nRF24L01功耗低,以-6dBm的功率发射时,工作电流仅9mA;接收时,工作电流仅12.3mA,多种低功率工作模式(掉电和空闲模式)更利于节能 设计。 3系统硬件设计 系统硬件设计主要由采集发送和接收显示两部分组成。图1为采集发送电路原理图,该电路主要由温度传感器DS18B20、单片机STC12LE5408和nRF24L01组成。 STC12LE5408是增强型8051单片机,速度快,集成度高,电压范围宽(2.2~3.8V),和MCS-5 1系列单片机指令系统完全兼容。其内部还有8KB Flash程序存储器,512字节RAM、2KB EEPRO M、4路PWM以及硬件看门狗(WDT)等资源.性价比高。 DSl8B20是DALLAS公司生产的单总线数字1-Wire温度传感器,可把温度信号直接转换成串行数字信号供单片机处理,采用1-Wire接口。DSl8B20的数据端DQ可通过4.7kΩ的上拉电阻接STC12LE5 408。nRF24L01的CE,CSN,SCK,MOSI,MISO,IRQ引脚则可接STC12LE5408的任意端口,但需在编程时注意,这里接至P1端口。由于nRF24L01具有接收数据功能,所以接收显示电路由单片机ST C12LE5408、nRF24L01和显示电路组成。所采集的数据也通过串口发送至PC机进行处理。

NRF24L01无线发射简易教程

NRF24L01 简易教程

先来看接口电路,使用的IO 口不是唯一的哦,可随意定义接口,当然是在使用IO 口模拟SPI 且IRQ 中断引脚不使用的使用查询方法判断接收状态的情况下了。作为初探我们就是用简单的IO 模拟SPI 的方法了,中断使用查询的方式。那么该教程讲解的接口与单片机的连接如下: 首先您需要了解NRF24L01,请参阅“NRF24L01 芯片中文资料”或者“NRF24L01 芯片英文资料”。 我们的教程是以一个简单的小项目为大家展示NRF24L01 的使用方法与乐趣。我们所写的教程均是以这种方式的呢,让您在学习的时候明白它能做什么,使您学起来不至于枯燥无味。 作为简易的教程,我们只需要知道它是怎么使用的就够了,我们本教程的目的是用NRF24L01 发送数据和接收数据,且接收方会对比发送的数据与接收的数据,若完全相同则控制LED 闪烁一次,并且把接收到的数据通过串口发送到PC 端,通过串口工具查看接收到的数据。 具体的要求如下: 1、具备发送和接收的能力。 2、发送32 个字节的数据,接收方接收到正确数据之后给予提示,通过LED 闪烁灯形 式。 3、把接收到的数据传送到PC 进行查看。 4、发送端每隔大约1.5 秒发送一次数据,永久循环。以上是程序的要求,若您想自行 设计出硬件接口,您也是可以添加一条呢:使用DIY 方 式设计NRF24L01 的接口板,且包含含单片机平台,使用PCB 方式或者万用板方式均可。如果您想让自己学的很扎实,那么推荐您自行做出接口板子呢。当然若您的能力不足,那么我们不推荐自行做板呢,因为这样会增加您学习的难度,反而起到了反效果呢。 我们使用的方式是画PCB 的方式呢,若您自己做了接口板子,那么您可以对比下一呢,O(∩_∩)O! 我们知道NRF24L01 的供电电压是1.9V~3.6V 不能超过这个范围,低了不工作,高了可能烧毁NRF24L01 芯片。我们常用的STC89C52 的单片机的供电电压是5V,我们不能直接给24L01 这个模块供电,我们需要使用AMS1117-3.3V 稳压芯片把5V 转成3.3V 的电压为24L01 模块供电。 为此我们的设计原理图如下:包含单片机最小系统、供电系统、下载程序接口、5V 转3.3V 电路、NRF24L01 模块接口。并且全部引出单片机的IO 口,另外还加了5 个电源输出接口,为扩展使用。还包括了电源指示LED 以及一个IO 口独立控制的LED,这个独立控制的LED用于NRF24L01 接收成功闪烁指示。为了保证系统的稳定性,在设计中添加了两个滤波电容。

NRF24L01无线模块

XL24L01P‐D01模块手册

尊敬的客户: 您好,感谢您选用本公司的无线模块,为了更快更好的使用此产品,请您仔细阅读本使用说明。无线传输距离受空间环境,输出速率,天线等因素影响,本公司标注的距离为基于本公司的测试硬件的开阔地测试距离,仅供参考。深圳市汇睿微通科技开发有限公司为专业无线模块制造厂商,具有多年的无线模块开发设计和制造生产能力,使用中有任何技术问题,请及时联系本公司的技术支持! 一:模块简介 XL24L01P‐D01是采用挪威NORDIC公司的nrf24L01p 2.4G无线收发IC设计的一款高性能2.4G无线收发模块,采用GFSK调制,工作在2400‐2483M的国际通用ISM频段,最高调制速率可达2MBPS。XL24L01P-D01集成了所有与RF协议相关的高速信号处理部分,如:自动重发丢失数据包和自动产生应答信号等,模块的SPI接口可以利用单片机的硬件SPI口连接或用单片机的I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口,便于使用低成本单片机。 模块大小32*15.2mm,2.54mm间距的双排插针接口,使用内置PCB天线设计,开阔地1MBPS速率下,收发10个字节的数据量测试距离最远约70米左右。 1.1 模块尺寸: 管脚次序 管脚定义 功能描述 1 GND 电源地(方形焊盘) 2 VIN 输入电源(3.0—3.3V) 3 CE 工作模式选择,RX或TX模式选择 4 CSN SPI使能,低有效 5 SCK SPI时钟 6 MOSI SPI输入 7 MISO SPI输出 8 IRQ 中断输出

二:模块功能 2.1 特性 z工作频率 2400‐2483M,共125个工作频道, 符合国际通用ISM法规, z FSK/GSK调制 z支持2M的高速数据传输,减少发射时间,降低平均功耗。 z当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了平均功耗收 z自动重发功能,自动检查和重发丢失的数据包,重发时间及重发次数可软件控制z自动应答功能,在收到有效数据后,模块自动发送应答信号,无须另行编程 z内置硬件CRC检错和点对多点通信地址控制 z数据包传输错误计数器及载波检测功能可用于跳频设置 z可同时设置六路接收通道地址,可选择性的打开接收通道 z自动存储未收到的应答信号的数据包 2.2 应用范围 无线遥控 机器人控制 家庭自动化 智能玩具 游戏无线控制器 无线传感器 无线语音

NRF24L01的C51单片机讲解

#include #include /*********************************************************************** ****************/ /* NRF24L01 的管脚定义,以及在本程序中的应用,VCC接3.3V电源,可以通过5V用电压转换芯片 /*得到,NC 管脚可以接可以不接,暂时没用途。本程序应用于51或者52单片机,是两个模块进行通讯 /*成功的简单指示,现象是:模块1的 KEY1 对应模块1的LED1 和模块2的LED3 ,模块1的 KEY2 对应模 /*块1的LED2 和模块2的LED4,发过来也对应。 /*********************************************************************** ****************/ typedef unsigned char uchar; typedef unsigned char uint; /************************************NRF24L01端口定义 ***********************************/ =P1^3; sbit MOSI =P1^2; sbit SCK =P1^1; sbit CSN =P1^0; sbit IRQ =P3^2; //数字输入(可屏蔽中断) /************************************按键 ***********************************************/ sbit KEY1=P2^7;//按键S1 sbit KEY2=P2^2;//按键S2 /************************************数码管位选 ******************************************/ sbit led1=P1^0; //LED0 sbit led2=P1^1; //LED1 sbit led3 =P1^2; //LED2 sbit led4 =P1^3; //LED3 sbit led5 =P1^4; //LED4 /*********************************************NRF24L01****************** *****************/ #define TX_ADR_WIDTH 5 // 5 uints TX address width #define RX_ADR_WIDTH 5 // 5 uints RX address width #define TX_PLOAD_WIDTH 20 // 20 uints TX payload #define RX_PLOAD_WIDTH 20 // 20 uints TX payload uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址 uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址

NRF24L01详细教程..

先来看接口电路,使用的IO 口不是唯一的哦,可随意定义接口,当然是在使用IO 口模拟SPI 且IRQ 中断引脚不使用的使用查询方法判断接收状态的情况下了。作为初探我们就是用简单的IO 模拟SPI 的方法了,中断使用查询的方式。那么该教程讲解的接口与单片机的连接如下: 首先您需要了解NRF24L01,请参阅“NRF24L01 芯片中文资料”或者“NRF24L01 芯片英文资料”。 我们的教程是以一个简单的小项目为大家展示NRF24L01 的使用方法与乐趣。我们所写教程均是以这种方式的呢,让您在学习的时候明白它能做什么,使您学起来不至于枯燥无味。 作为简易的教程,我们只需要知道它是怎么使用的就够了,我们本教程的目的是用NRF24L01 发送数据和接收数据,且接收方会对比发送的数据与接收的数据,若完全相同则控制LED 闪烁一次,并且把接收到的数据通过串口发送到PC 端,通过串口工具查看接收到的数据。 具体的要求如下: 1、具备发送和接收的能力。 2、发送32 个字节的数据,接收方接收到正确数据之后给予提示,通过LED 闪烁灯形 式。 3、把接收到的数据传送到PC 进行查看。 4、发送端每隔大约1.5 秒发送一次数据,永久循环。 以上是程序的要求,若您想自行设计出硬件接口,您也是可以添加一条呢:使用DIY 方式设计NRF24L01 的接口板,且包含含单片机平台,使用PCB 方式或者万用板方式均可。如果您想让自己学的很扎实,那么推荐您自行做出接口板子呢。当然若您的能力不足,那么我们不推荐自行做板呢,因为这样会增加您学习的难度,反而起到了反效果呢。 我们知道NRF24L01 的供电电压是1.9V~3.6V 不能超过这个范围,低了不工作,高了可能烧毁NRF24L01 芯片。我们常用的STC89C52 的单片机的供电电压是5V,我们不能直接给24L01 这个模块供电,我们需要使用AMS1117-3.3V 稳压芯片把5V 转成3.3V 的电压为24L01 模块供电。 为此我们的设计原理图如下:包含单片机最小系统、供电系统、下载程序接口、5V 转3.3V 电路、NRF24L01 模块接口。并且全部引出单片机的IO 口,另外还加了5 个电源输出接口,为扩展使用。还包括了电源指示LED 以及一个IO 口独立控制的LED,这个独立控制的LED用于NRF24L01 接收成功闪烁指示。为了保证系统的稳定性,在设计中添加了两个滤波电容。

2.4G无线传输模块 NRF24L01

NRF24L01无线反射接收模块

1.所需材料 a)单片机最小系统 b)液晶(显示状态作用) c)NRF24L01无线模块 2.基本须知 a)引脚 i. b)NRF24L01状态机(主要有一下几个状态) i.Power Down Mode:掉电模式 ii.Tx Mode:发射模式 iii.Rx Mode:接收模式 iv.Standby-1Mode:待机1模式 v.Standby-2Mode:待机2模式 c)对模块的固件编程的基本思路如下: i.置CSN为低,是能芯片,配置芯片各个参数。配置参数在Power Down状态中完成 ii.如果是Tx模式,填充Tx FIFO iii.配置完成以后,通过CE与CONFIG中的PWR_UP与PRIM_RX参数确定NRF24L01要切换到的状态。 Tx Mode:PWR_UP=1;PRIM_RX=0;CE=1(保持超过10us就可以) Rx Mode:PWR_UP=1;PRIM_RX=1;CE=1 iv.IRQ引脚会在以下三种情况变低: 1.Tx FIFO发完并且收到ACK(使能ACK情况下) 2.RxFIFO收到数据 3.达到最大重发次数 将IRQ接到外部中断输入引脚,通过中断程序进行处理 d)模块通信中的相互识别,是通过定义发送地址和本机地址(如 )地址可以自定义 3.实现思路

a)使用SPI通信与NRF24L01进行相互通信,需要编写基本通信模块的代码(需要用到读 写数据时序图) b)操作NRF24L01模块需要控制其内部的寄存器,因此要在程序中宏定义模块内部需要使 用的寄存器的地址。 c)使用模块之前需要对模块内的相应寄存器进行初始化设置,同理,其他各个模式也有相应 的初始化设置。 d)若接收到数据,IQR引脚会被拉低,此时可以通过SPI通信模块程序读取相应寄存器的 值,读取出所接收到的数据。 e)

NRF24L01模块说明书

NRF24L01高速嵌入式无线数传模块 说 明 书

2008年12月20日 一、产品特性 2.4GHz全球开放ISM频段,最大0dBm发射功率,免许可证使用 支持六路通道的数据接收 低工作电压:1.9~3.6V低电压工作 高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象(软件设置1Mbps或者2Mbps的空中传输速率) 多频点:125频点,满足多点通信和跳频通信需要 超小型:内置2.4GHz天线,体积小巧,15x29mm(包括天线) 低功耗:当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了电流消耗。 低应用成本:NRF24L01集成了所有与RF协议相关的高速信号处理部分,比如:自动重发丢失数据 包和自动产生应答信号等,NRF24L01的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口,便于使用低成本单片机。 便于开发:由于链路层完全集成在模块上,非常便于开发。 自动重发功能,自动检测和重发丢失的数据包,重发时间及重发次数可软件控制

自动存储未收到应答信号的数据包 自动应答功能,在收到有效数据后,模块自动发送应答信号,无须另行编程 载波检测—固定频率检测 内置硬件CRC检错和点对多点通信地址控制 数据包传输错误计数器及载波检测功能可用于跳频设置 可同时设置六路接收通道地址,可有选择性的打开接收通道 标准插针Dip2.54MM间距接口,便于嵌入式应用 二、基本电气特性 三、引脚说明

说明: 1)VCC脚接电压范围为1.9V~3.6V之间,不能在这个区间之外,超 过3.6V将会烧毁模块。推荐电压3.3V左右。 (2)除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口 直接相连,无需电平转换。当然对3V左右的单片机更加适用了。 (3)硬件上面没有SPI的单片机也可以控制本模块,用普通单片机IO 口模拟SPI不需要单片机真正的串口介入,只需要普通的单片机IO口 就可以了,当然用串口也可以了(a:与51系列单片机P0口连接时候,需要加10K的上 拉电阻,与其余口连接不需要。 b:其他系列的单片机,如果是5V的,请参考该系列 单片机IO口输出电流大小,如果超过10mA,需要串联 电阻分压,否则容易烧毁模块!如果是3.3V的,可以 直接和RF24l01模块的IO口线连接。比如AVR系列单片机

NRF24L01无线通信模块

NRF24L01无线通信模块 一、NRF24L01简介: NRF24L01 是一款工作在2.4~2.5GHz 世界通用ISM 频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型SchockBurst TM 模式控制器、功率放大器、晶体振荡器、调制器、解调器。输出功率、频道选择和协议的设置可以通过SPI 接口进行设置。极低的电流消耗:当工作在发射模式下发射功率为-6dBm 时电流消耗为9mA,接收模式12.3mA。掉电模式和待机模式下电流消耗更低。 二、NRF24L01参考数据: 三、模块接口尺寸和说明

四、引脚及功能: 五、NRF24L01的SPI命令宏定义:

六、NRF24L01相关寄存器地址宏定义: 七、NRF24L01的工作模式: 1、NRF24L01模式配置

2、发送模式函数配置 3、接收模式函数配置 4、发送、接收模式说明 (1)在发射模式下,CE至少要拉高10us。 (2)NRF24L01在接收模式下可以接收6路不同通道的数据,每一个数据通道使用不同的地址,但是共用相同的频道。 (3)数据通道0是唯一一个可以配置为40位自身地址的数据通道,1~5数据通道都为8位自身地址和32位共用地址。 (4)所有的数据通道都可以设置为增强型ShockBurst模式。

八、NRF24L01的打包格式: 1、增强型ShockBurst模式下的数据包形式 前导码 | 地址(3~5字节) | 9位(标志位) | 数据(1~32字节) | CRC校验(0/1/2字节) 2、ShockBurst模式下与NRF24L01等相兼容的数据包形式 前导码 | 地址(3~5字节) | 数据(1~32字节) | CRC校验(0/1/2字节) 3、数据包说明 前导码:在发送模式下加入,接收模式下去除,用来检测0和1。 地址:1)地址内容为接收机地址。 2)地址宽度可以是3、4或5字节宽度。 3)地址可以对接收通道和发射通道分别进行配置。 4)从接收的数据包中自动去除地址。 标志位:1)PID,数据包识别。其中两位是用来每当接收到新的数据包后加一。 2)七位保留,用作将来与其他产品相兼容。 3)当NRF24L01与NRF2401/NRF24E1通讯时不起作用。 数据:1~32字节宽度。 CRC:CRC校验是可选的。 九、小结: 1、对于NRF24L01,在使用的时候要注意收发双方的频道要相同(NRF24L01总共有40个可选频道)。 2、注意寄存器的配置。 3、地址要统一。

相关文档
相关文档 最新文档