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

  • 格式:doc
  • 大小:264.00 KB
  • 文档页数:13

下载文档原格式

  / 32
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(相关人员如觉得本人水平低下,还请见谅)

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

这是设置整个的状态。如过状态设置成待机,则引脚可能变为高阻。(以上并非全部引脚)

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的子程序,将寄存器指令放入nrf24l01。如果需深究,请参考说明书,手册等。或者可以通过#define READ_REG 0x00 // 读寄存器指令等了解大概流程。

在整个无线通信过程中,初始化只需设置一次。

TxBuf[]存放的是发送的数据。并且此数据被发送时,是将这个数组的数全部发送的。对方也全部接收。

RxBuf[]接收数组,用于存放对方发来的数据。

SetRX_Mode();

nRF24L01_RxPacket(RxBuf);

当主程序中包含这两个子函数时,且这时某个数据被发送过来,则会被接收到。且被存放到了RxBuf[];

反之包含nRF24L01_TxPacket(TxBuf);且TxBuf[]已经存入你想要的数据的时候,这个数据将被发送。

程序部分:下面给出程序,由于收发双方程序是完全一样的,所以只粘贴一份。

程序虽然不是自己写的,但是经过实际测试的,没有任何诡异的问题。

#include

#include

typedef unsigned char uchar;

typedef unsigned char uint;

//****************************************NRF24L01端口定义***************************************

sbit MISO =P1^3;

sbit MOSI =P1^4;

sbit SCK =P1^2;

sbit CE =P1^1;

sbit CSN =P3^2;

sbit IRQ =P3^3;

//************************************按键***************************************************

sbit KEY1=P3^6;

sbit KEY2=P3^7;

//************************************数码管位选*********************************************

sbit led3=P2^0;