你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32实现NRF24L01通信

[复制链接]
STMCU小助手 发布时间:2022-8-19 16:48
一. 简介
在各个无线通信模块中,由于NRF24L01价格便宜,而且体积小,以及不需要外接天线,传输距离约为10-20米,深受大家的喜爱。在遥控汽车,四轴飞行器中较为常见,在这里给大家分享其具体的使用。

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

28f4a590ceb14347a214d8554d9e7484.png

IRQ : 中断输出,例如发送完成,或者接收完成。默认为高电平。
CE : 芯片的使能引脚
CSN:SPI协议的使能引脚
二. 数据传输过程

从图中可以看出,数据传输的一些特征。CSN默认为高电平,SCK默认为低电平。数据在SCK的下降沿送出,在SCK的上升沿读取数据,先发送高位,再发送低位。如果使用硬件SPI的话,就可以基于这个来设置SPI极性的相关参数了。
先发送指令(在发送指令的同时,nrf会返回状态值),然后后面就是写数据,或者是读数据了。

75f68f0caedc46479b92b0a48c68cbae.png

三. 协议实现

由于这里的SPI的速率不能太高,所以这里就采用软件的方式来实现这个传输过程(使用硬件的话,可以将分频设置大一点),这样就可以任意选择适合的引脚了。
其中delay()是个空函数,可以加点延时,也可以不加。
Cn :命令
Data: 写入的数据
size : 数据的大小

代码的实现过程,是和上图一一对应起来的,就作详细的说明了。

  1. void SPI_Write(unsigned char Cn,unsigned char *Data,unsigned char size){
  2.         unsigned char i,j;
  3.         CSN_LOW;
  4.         /*写操作符*/
  5.         for(i = 0;i < 8; i++){
  6.                 delay();
  7.                 SCK_LOW;
  8.                 if(Cn & 0x80)
  9.                         MOSI_HIGH;
  10.                 else
  11.                         MOSI_LOW;
  12.                 SCK_HIGH;
  13.                 Cn <<= 1;
  14.         }
  15.         delay();
  16.         /*写数据*/
  17.         for(i = 0;i < size ;i++){
  18.                 delay();
  19.                 SCK_LOW;
  20.                 delay();
  21.                 delay();
  22.                 unsigned char d = Data<i>;
  23.                 for(j = 0;j < 8;j++){
  24.                         SCK_LOW;
  25.                         if(d & 0x80){        
  26.                                 MOSI_HIGH;
  27.                         }
  28.                         else{        
  29.                                 MOSI_LOW;
  30.                         }
  31.                         SCK_HIGH;
  32.                         d <<= 1;
  33.                         SCK_HIGH;               
  34.                 }
  35.         }
  36.         CSN_HIGH;
  37.         SCK_LOW;
  38. }</i>
复制代码

四. NRF24L01命令详解

20787185edcf4266bcb260e6ba1328a1.png

通过上图,可以看到一共只有8个命令。其中常用的有前六个命令
R/W_REGISTER: 读写寄存器命令,对同一个寄存器进行读写,命令只有第六位不一样,为1就是写,为0就是读。A就是具体的寄存器的地址了。这里有一点要注意,写寄存器是有要求的,只有在掉电或者待机模块下可写。可以简单理解为CE为0,就可以写。
R_RX_PAYLOAD : 读取接收到的数据
W_RX_PAYLOAD:将需要发送的数据写入fifo中,等待发送
FLUSH_TX/RX: 清空发送/接收数据的FIFO。

五. NRF24L01寄存器
一共有24个寄存器,这里就不一一列举出来了,具体对应的功能可以查看数据文档(是中文的哦)。

  1. struct Nrf24L01{
  2.         uint8_t Control;
  3.         uint8_t        EN_AA;
  4.         uint8_t EN_RXADDR;
  5.         uint8_t        SETUP_AW;
  6.         uint8_t        SETUP_RETR;
  7.         uint8_t        RF_CH;
  8.         uint8_t        RF_SETUP;
  9.         uint8_t        STATUS;
  10.         uint8_t        OBSERVE_TX;
  11.         uint8_t CD;
  12.         uint8_t RX_ADDR_P0;
  13.         uint8_t RX_ADDR_P1;
  14.         uint8_t RX_ADDR_P2;
  15.         uint8_t RX_ADDR_P3;
  16.         uint8_t RX_ADDR_P4;
  17.         uint8_t RX_ADDR_P5;
  18.         uint8_t TX_ADDR;
  19.         uint8_t RX_PW_P0;
  20.         uint8_t RX_PW_P1;
  21.         uint8_t RX_PW_P2;
  22.         uint8_t RX_PW_P3;
  23.         uint8_t RX_PW_P4;
  24.         uint8_t RX_PW_P5;
  25.         uint8_t FIFO_STATUS;
  26. };
复制代码

六. NRF24L01状态
通过下图,可以知道各个状态对应的功能。这里发送模型需要注意一下,
CE为高10us后,就开始发送数据,如果这个时候把CE拉低了,还是会停留在发送模式,直到数据发送完成,然后到待机模式1

02f0a6f5071249d180401664a03e21f5.png


收藏 评论0 发布时间:2022-8-19 16:48

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版