一. 简介
在各个无线通信模块中,由于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个命令。其中常用的有前六个命令
R/W_REGISTER: 读写寄存器命令,对同一个寄存器进行读写,命令只有第六位不一样,为1就是写,为0就是读。A就是具体的寄存器的地址了。这里有一点要注意,写寄存器是有要求的,只有在掉电或者待机模块下可写。可以简单理解为CE为0,就可以写。
R_RX_PAYLOAD : 读取接收到的数据
W_RX_PAYLOAD:将需要发送的数据写入fifo中,等待发送
FLUSH_TX/RX: 清空发送/接收数据的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
公众号:FPGA之旅