×
单片机 > 单片机程序设计 > 详情

NRF24L01的使用方法和简单操作介绍(附参考程序)

发布时间:2020-06-17 发布时间:
|

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

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;

sbit              led2=P2^1;

sbit              led1=P2^2;

sbit              led0=P2^3;

//************************************蜂明器***************************************************

sbit               BELL=P3^4;

//***********************************数码管0-9编码*******************************************

uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};         //0~~9段码

//*********************************************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_ADDRES



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析