资讯详情

STM32实现NRF24L01通信

一. 简介

在各种无线通信模块中,因为NRF24L01价格便宜,体积小,不需要外接天线。传输距离约10-20米,深受大家喜爱。它在遥控车和四轴飞机中很常见。在这里,我想和大家分享一下它的具体用途。

  • 共用8个引脚模块
  • 通信方式为SPI接口,速率不能太高,最好是10M以内。

在这里插入图片描述

二. 数据传输过程

  1. 从图中可以看出数据传输的一些特征。CSN默认为高电平,SCK默认为低电平。SCK在SCK上升沿读取数据,先发送高位,再发送低位。如果使用硬件SPI如果可以基于此设置SPI极性相关参数。
  2. 先发送指令(发送指令时,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 欢迎关注微信公众号哦。后面将代码整理后,会放到公众号中。

标签: aw连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台