突破渴望

(原创)24L01收发数据函数的进一步说明

0
阅读(6538)

上一篇文章中,我对24L01的收发数据方式做了一个介绍,一些朋友跟我探讨相关的函数问题,今天我在接着上一篇的文章,对这个收发函数做一个进一步的举例说明,希望能有效果。

例:我们要设置本机地址,24L01的地址为5个字节,假设地址放在一个5字节的数组中

byte const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};   //本地地址

写寄存器的指令字为001AAAAA,   AAAAA用于表示写入的寄存器地址,各个寄存器地址可查阅数据手册

TX_ADDR寄存器在24L01中的地址为00010000,那么完整的指令字应该为00110000,可用如下定义和调用方法

//***********************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接收数据地址

#define RX_ADDR_P2      0x0C  // 频道2接收数据地址

#define RX_ADDR_P3      0x0D  // 频道3接收数据地址

#define RX_ADDR_P4      0x0E  // 频道4接收数据地址

#define RX_ADDR_P5      0x0F  // 频道5接收数据地址

#define TX_ADDR         0x10  // 发送地址寄存器

#define RX_PW_P0        0x11  // 接收频道0接收数据长度

#define RX_PW_P1        0x12  // 接收频道0接收数据长度

#define RX_PW_P2        0x13  // 接收频道0接收数据长度

#define RX_PW_P3        0x14  // 接收频道0接收数据长度

#define RX_PW_P4        0x15  // 接收频道0接收数据长度

#define RX_PW_P5        0x16  // 接收频道0接收数据长度

#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置

可用以下语句调用

SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址

 

 

 

24L01被设置为接收模式后,可通过6个不同的数据通道(data pipe)接收数据。每个数据通道都有一个唯一的地址但是各数据通道的频率是相同的。这意味着可以有6个被配置成发送状态的nRF24L01可以和一个配置成接收状态的nRF24L01通信,并且接收方可以区分。数据通道0有一个唯一的40bit的可设置的地址。其余的通道1到通道5则地址前32位相同,而后8位不同。所有的数据通道都可以实现Enhanced ShockBurst模式。

NRF24L01使用数据通道的地址对接收的包进行确认。这意味着24L01在返回ACK的时候使用相同的地址。在发送端,数据通道0被用来接收确认信息,因此通道0的地址必须等于发送地址,这样才能收到确认信息。

当一个24L01发送结束后,它会打开接收器并等待确认。如果没有收到确认,则重发,直到收到确认。当重发超过一定次数则发出中断并改变状态寄存器。重发次数的限制在SETUP_RETR_ARC寄存器中设置。

不知道童鞋么有木有理解,呵呵,我会进一步阐述这个问题。