NRF24L01参考程序.doc
文本预览下载声明
(相关人员如觉得本人水平低下,还请见谅)
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; 这个是经过实际程序测试出来的,比如
以下程序:
#includereg51.h
#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
显示全部