STM32实现NRF24L01通信

简介: 笔记

一. 简介


在各个无线通信模块中,由于NRF24L01价格便宜,而且体积小,以及不需要外接天线,传输距离约为10-20米,深受大家的喜爱。在遥控汽车,四轴飞行器中较为常见,在这里给大家分享其具体的使用。


模块共用8个引脚

通信方式为SPI接口,速率不能太高,最好在10M以内。

30.png

IRQ : 中断输出,例如发送完成,或者接收完成。默认为高电平。

CE : 芯片的使能引脚

CSN:SPI协议的使能引脚


二. 数据传输过程


从图中可以看出,数据传输的一些特征。CSN默认为高电平,SCK默认为低电平。数据在SCK的下降沿送出,在SCK的上升沿读取数据,先发送高位,再发送低位。如果使用硬件SPI的话,就可以基于这个来设置SPI极性的相关参数了。

先发送指令(在发送指令的同时,nrf会返回状态值),然后后面就是写数据,或者是读数据了。


31.png

三. 协议实现


由于这里的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命令详解



32.png

通过上图,可以看到一共只有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

33.png


公众号:FPGA之旅

目录
相关文章
|
5月前
|
监控
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
424 0
|
5月前
stm32f407探索者开发板(十六)——串行通信原理讲解-UART
stm32f407探索者开发板(十六)——串行通信原理讲解-UART
315 0
|
7月前
STM32--SPI通信与W25Q64(2)
STM32--SPI通信与W25Q64(2)
105 0
|
7月前
|
存储 传感器 芯片
STM32--SPI通信与W25Q64(1)
STM32--SPI通信与W25Q64(1)
219 0
|
7月前
|
存储 传感器
【STM32基础 CubeMX】uart串口通信
【STM32基础 CubeMX】uart串口通信
419 0
|
芯片
STM32速成笔记(五)—串口通信
本文介绍了串口通信的概念,用途以及一些相关概念。介绍了如何进行printf重定向,如何根据接收到的特定信息,执行特定操作。此外,本文以通过上位机发送特殊指令控制LED亮灭的小项目,给出了详细的配置方法和程序设计。
223 0
STM32速成笔记(五)—串口通信
|
定位技术
激光雷达A1M8与STM32通信
激光雷达A1M8与STM32通信
207 0
14 STM32之IIC通信(软件模拟篇)
14 STM32之IIC通信(软件模拟篇)
|
缓存 数据格式
STM32串口通信配置(USART1+USART2+USART3+UART4)
STM32串口通信配置(USART1+USART2+USART3+UART4)
310 0
|
芯片 开发者
16 玩转STM32之SPI通信
16 玩转STM32之SPI通信