[其他ST产品] stm32驱动NRF24L01_原理+代码解析

[复制链接]
 楼主| 自动化陈稳 发表于 2023-7-8 15:48 | 显示全部楼层 |阅读模式
概念
废话篇(24L01简介)
NRF24L01是NORDIC公司生产的一款无线通信通信芯片,采用FSK 调制,集成NORDIC自家的Enhanced Short Burst协议。可以实现点对点或是1对6的无线通信。无线通信速度最高可达到2Mbps。

①2.4G全球开放的ISM频段,免许可证使用。

②最高工作速率2Mbps,高校的GFSK调制,抗干扰能力强。

③126个可选的频道,满足多点通信和调频通信的需要。

④内置CRC检错和点对多点的通信地址控制。

⑤可设置自动应答,确保数据可靠传输 。

引脚分配 2851564a914be5f887.png

VCC、GND

CE:模式控制线。在 CSN为低的情况下,CE 协同CONFIG 寄存器共同决定NRF24L01 的状态(参照NRF24L01 的状态机)   

CSN:SPI片选线

SCK:SPI时钟线

MOSI:SPI数据线(主机输出,从机输入)

MISO:SPI数据线(主机输入,从机输出)

IRQ:中断信号线。中断时变为低电平

在以下三种情况变低:

Tx FIFO 发完并且收到ACK(使能ACK情况下)
Rx FIFO 收到数据
达到最大重发次数



 楼主| 自动化陈稳 发表于 2023-7-8 16:27 | 显示全部楼层
SPI时序图
768064a91dfdb3cd0.png
控制24L01的流程其实就是确定要干什么(读、写、清除。。。)哪一个寄存器(确定地址)要实现什么样的配置(写或读的内容)
 楼主| 自动化陈稳 发表于 2023-7-8 16:28 | 显示全部楼层
注意:要求初始化SPI时,空闲状态SCK为0,CPOL=0;数据在时钟第一个时间边沿采集,CPHA=0

  1. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                //空闲时SCK低电平
  2. SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        //数据捕获于第一个时钟沿
 楼主| 自动化陈稳 发表于 2023-7-8 16:29 | 显示全部楼层
工作模式
6079764a91e54763f3.png

收、发、待机、掉电 四种模式

收发模式有两种:Enhanced ShockBurstTM  收发模式(支持自动ACK和自动重发)

                             ShockBurstTM  收发模式

开启自动ACK,则默认选择Enhanced模式。

通常使用Enhanced模式。因为无线电信号的传输显然具有相当多的不确定因素,在Enhanced模式下,要求终端设备在接收到数据后有应答信号,以便发送方检测有无数据丢失,一旦丢失则重发数据。
 楼主| 自动化陈稳 发表于 2023-7-8 16:29 | 显示全部楼层
通信地址理解(个人疑难点)
当时没能立刻理解通信过程关于地址的这一部分,后来慢慢才想明白

所谓的“1对6无线通信”是指“6发1收”而不是“1对6双向通信”

因为24L01有6个接收通道,1个发送通道

给发送通道TX_ADDR赋的地址值就是接收通道RX_ADDR_Pn(n=0~5)的地址值,而为了自动应答(ACK)和重发,要求发送端的发送通道TX_ADDR的地址值与发送端的接收通道RX_ADDR_P0的地址值相同,因为接收端在收到数据后回复的自动应答信号规定由发送端的R0通道接收。要注意,接收端的接收通道可不一定是RX_ADDR_P0,可以是RX_ADDR_P0到RX_ADDR_P5任意一个,这个不定。
 楼主| 自动化陈稳 发表于 2023-7-8 16:29 | 显示全部楼层
所以讲到这里,有三个地址是一样的

发送端的发送通道TX_ADDR和接收通道RX_ADDR_P0

接收端的接收通道RX_ADDR_Pn(n=0~5)

现在下面这张图就好看多了

7988364a91e7eccde9.png
 楼主| 自动化陈稳 发表于 2023-7-8 16:30 | 显示全部楼层
关于地址设置,TX_ADDR和RX_ADDR_P0可以独立设置任意40位地址

而RX_ADDR_P1 ~ RX_ADDR_P5的地址都是8 位自身地址和32 位公用地址(由通道1设置)

地址这里迷惑了我一段时间,看完过几天回过头就通了
 楼主| 自动化陈稳 发表于 2023-7-8 16:30 | 显示全部楼层
原理分析
个人觉得从代码角度直接看可能直观一些(仅供参考)

寄存器赏析
寄存器操作指令
写寄存器之前一定要进入待机模式或掉电模式
7453464a91ea02f6be.png
 楼主| 自动化陈稳 发表于 2023-7-8 16:30 | 显示全部楼层
把这些指令以宏定义在nrf24l01.h中定义好
  1. //NRF24L01寄存器操作命令
  2. #define NRF_READ_REG    0x00  //读配置寄存器,低5位为寄存器地址
  3. #define NRF_WRITE_REG   0x20  //写配置寄存器,低5位为寄存器地址
  4. #define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
  5. #define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
  6. #define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
  7. #define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
  8. #define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
  9. #define NOP             0xFF  //空操作,可以用来读状态寄存器         
 楼主| 自动化陈稳 发表于 2023-7-8 16:31 | 显示全部楼层
配置寄存器(CONFIG,位置:0X00)
2622064a91ecd0dd52.png
 楼主| 自动化陈稳 发表于 2023-7-8 16:31 | 显示全部楼层
自动应答使能寄存器(EN_AA,0X01)
8404564a91ed80a6f4.png
 楼主| 自动化陈稳 发表于 2023-7-8 16:31 | 显示全部楼层
RX地址使能寄存器(EN_RXADDR,0X02)
1590364a91ee97dc8c.png
 楼主| 自动化陈稳 发表于 2023-7-8 16:31 | 显示全部楼层
1使能,0关闭

自动重发设置寄存器(SETUP_RETR,0X04)

7672464a91ef8189c1.png
 楼主| 自动化陈稳 发表于 2023-7-8 16:32 | 显示全部楼层
射频频率设置寄存器(RF_CH,0X05)
9642564a91f02b5165.png
 楼主| 自动化陈稳 发表于 2023-7-8 16:32 | 显示全部楼层
频率计算公式:2400+RF_CH(MHz)
8436964a91f0da6eb4.png
*射频配置寄存器(RF_SETUP,0X06)

 楼主| 自动化陈稳 发表于 2023-7-8 16:32 | 显示全部楼层
*状态寄存器(STATUS,0X07)
4546664a91f18ccb17.png
 楼主| 自动化陈稳 发表于 2023-7-8 16:32 | 显示全部楼层
数据通道0接收地址寄存器(RX_ADDR_P0,0X0A)
5503564a91f233e5d9.png
 楼主| 自动化陈稳 发表于 2023-7-8 16:32 | 显示全部楼层
SETUP_AW的复位值默认是5字节
1465764a91f2f1e599.png
 楼主| 自动化陈稳 发表于 2023-7-8 16:32 | 显示全部楼层
发送地址设置寄存器(TX_ADDR,0X10)
6530064a91f3a6cca8.png
 楼主| 自动化陈稳 发表于 2023-7-8 16:33 | 显示全部楼层
接收通道0有效数据宽度设置寄存器(RX_PW_P0,0X11)
9428764a91f453803c.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

105

主题

1379

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部