一. 简介
在各种无线通信模块中,因为NRF24L01价格便宜,体积小,不需要外接天线。传输距离约10-20米,深受大家喜爱。它在遥控车和四轴飞机中很常见。在这里,我想和大家分享一下它的具体用途。
- 共用8个引脚模块
- 通信方式为SPI接口,速率不能太高,最好是10M以内。
- IRQ : 中断输出,如发送或接收。默认为高电平。
- CE : 芯片使能引脚
- CSN:SPI协议使能引脚
二. 数据传输过程
- 从图中可以看出数据传输的一些特征。CSN默认为高电平,SCK默认为低电平。SCK在SCK上升沿读取数据,先发送高位,再发送低位。如果使用硬件SPI如果可以基于此设置SPI极性相关参数。
- 先发送指令(发送指令时,nrf会返回状态值),然后写数据或读数据。
三. 协议实现
由于这里的SPI速度不能太高,所以这里使用软件来实现这个传输过程(如果使用硬件,分频可以设置得更大),这样你就可以选择合适的引脚。 其中delay()是空函数,可以加延迟或不加。 Cn :命令 Data: 写入的数据 size : 数据的大小
代码的实现过程,是和上图一一对应起来的,就作详细的说明了。
void SPI_Write(unsigned char Cn,unsigned char *Data,unsigned char size){
unsigned char i,j; CSN_LOW; /*写操作符*/ for(i = 0;i < 8; i ){
delay(); SCK_LOW; if(Cn & 0x80) MOSI_HIGH; else MOSI_LOW; SCK_HIGH; Cn <<= 1; } delay(); /*写数据*/ for(i = 0;i < size ;i ){
delay(); SCK_LOW; delay(); delay(); unsigned char d = Data[i]; for(j = 0;j < 8;j++){
SCK_LOW;
if(d & 0x80){
MOSI_HIGH;
}
else{
MOSI_LOW;
}
SCK_HIGH;
d <<= 1;
SCK_HIGH;
}
}
CSN_HIGH;
SCK_LOW;
}
四. NRF24L01命令详解
通过上图,可以看到一共只有8个命令。其中常用的有前六个命令 : 读写寄存器命令,对同一个寄存器进行读写,命令只有第六位不一样,为1就是写,为0就是读。A就是具体的寄存器的地址了。这里有一点要注意,写寄存器是有要求的,只有在掉电或者待机模块下可写。可以简单理解为CE为0,就可以写。 : 读取接收到的数据 :将需要发送的数据写入fifo中,等待发送 : 清空发送/接收数据的FIFO。
五. NRF24L01寄存器
一共有24个寄存器,这里就不一一列举出来了,具体对应的功能可以查看数据文档(是中文的哦)。
struct Nrf24L01{
uint8_t Control;
uint8_t EN_AA;
uint8_t EN_RXADDR;
uint8_t SETUP_AW;
uint8_t SETUP_RETR;
uint8_t RF_CH;
uint8_t RF_SETUP;
uint8_t STATUS;
uint8_t OBSERVE_TX;
uint8_t CD;
uint8_t RX_ADDR_P0;
uint8_t RX_ADDR_P1;
uint8_t RX_ADDR_P2;
uint8_t RX_ADDR_P3;
uint8_t RX_ADDR_P4;
uint8_t RX_ADDR_P5;
uint8_t TX_ADDR;
uint8_t RX_PW_P0;
uint8_t RX_PW_P1;
uint8_t RX_PW_P2;
uint8_t RX_PW_P3;
uint8_t RX_PW_P4;
uint8_t RX_PW_P5;
uint8_t FIFO_STATUS;
};
六. NRF24L01状态
通过下图,可以知道各个状态对应的功能。这里, CE为高10us后,就开始发送数据,如果这个时候把CE拉低了,还是会停留在发送模式,直到数据发送完成,然后到待机模式1 欢迎关注微信公众号哦。后面将代码整理后,会放到公众号中。