打印
[其他ST产品]

stm32驱动NRF24L01_原理+代码解析

[复制链接]
1517|64
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
概念
废话篇(24L01简介)
NRF24L01是NORDIC公司生产的一款无线通信通信芯片,采用FSK 调制,集成NORDIC自家的Enhanced Short Burst协议。可以实现点对点或是1对6的无线通信。无线通信速度最高可达到2Mbps。

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

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

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

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

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

引脚分配

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时序图

控制24L01的流程其实就是确定要干什么(读、写、清除。。。)哪一个寄存器(确定地址)要实现什么样的配置(写或读的内容)

使用特权

评论回复
板凳
自动化陈稳|  楼主 | 2023-7-8 16:28 | 只看该作者
注意:要求初始化SPI时,空闲状态SCK为0,CPOL=0;数据在时钟第一个时间边沿采集,CPHA=0

SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                //空闲时SCK低电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        //数据捕获于第一个时钟沿

使用特权

评论回复
地板
自动化陈稳|  楼主 | 2023-7-8 16:29 | 只看该作者
工作模式


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

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

                             ShockBurstTM  收发模式

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

通常使用Enhanced模式。因为无线电信号的传输显然具有相当多的不确定因素,在Enhanced模式下,要求终端设备在接收到数据后有应答信号,以便发送方检测有无数据丢失,一旦丢失则重发数据。

使用特权

评论回复
5
自动化陈稳|  楼主 | 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任意一个,这个不定。

使用特权

评论回复
6
自动化陈稳|  楼主 | 2023-7-8 16:29 | 只看该作者
所以讲到这里,有三个地址是一样的

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

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

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

使用特权

评论回复
7
自动化陈稳|  楼主 | 2023-7-8 16:30 | 只看该作者
关于地址设置,TX_ADDR和RX_ADDR_P0可以独立设置任意40位地址

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

地址这里迷惑了我一段时间,看完过几天回过头就通了

使用特权

评论回复
8
自动化陈稳|  楼主 | 2023-7-8 16:30 | 只看该作者
原理分析
个人觉得从代码角度直接看可能直观一些(仅供参考)

寄存器赏析
寄存器操作指令
写寄存器之前一定要进入待机模式或掉电模式

使用特权

评论回复
9
自动化陈稳|  楼主 | 2023-7-8 16:30 | 只看该作者
把这些指令以宏定义在nrf24l01.h中定义好
//NRF24L01寄存器操作命令
#define NRF_READ_REG    0x00  //读配置寄存器,低5位为寄存器地址
#define NRF_WRITE_REG   0x20  //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
#define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
#define NOP             0xFF  //空操作,可以用来读状态寄存器         

使用特权

评论回复
10
自动化陈稳|  楼主 | 2023-7-8 16:31 | 只看该作者
配置寄存器(CONFIG,位置:0X00)

使用特权

评论回复
11
自动化陈稳|  楼主 | 2023-7-8 16:31 | 只看该作者
自动应答使能寄存器(EN_AA,0X01)

使用特权

评论回复
12
自动化陈稳|  楼主 | 2023-7-8 16:31 | 只看该作者
RX地址使能寄存器(EN_RXADDR,0X02)

使用特权

评论回复
13
自动化陈稳|  楼主 | 2023-7-8 16:31 | 只看该作者
1使能,0关闭

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

使用特权

评论回复
14
自动化陈稳|  楼主 | 2023-7-8 16:32 | 只看该作者
射频频率设置寄存器(RF_CH,0X05)

使用特权

评论回复
15
自动化陈稳|  楼主 | 2023-7-8 16:32 | 只看该作者
频率计算公式:2400+RF_CH(MHz)

*射频配置寄存器(RF_SETUP,0X06)

使用特权

评论回复
16
自动化陈稳|  楼主 | 2023-7-8 16:32 | 只看该作者
*状态寄存器(STATUS,0X07)

使用特权

评论回复
17
自动化陈稳|  楼主 | 2023-7-8 16:32 | 只看该作者
数据通道0接收地址寄存器(RX_ADDR_P0,0X0A)

使用特权

评论回复
18
自动化陈稳|  楼主 | 2023-7-8 16:32 | 只看该作者
SETUP_AW的复位值默认是5字节

使用特权

评论回复
19
自动化陈稳|  楼主 | 2023-7-8 16:32 | 只看该作者
发送地址设置寄存器(TX_ADDR,0X10)

使用特权

评论回复
20
自动化陈稳|  楼主 | 2023-7-8 16:33 | 只看该作者
接收通道0有效数据宽度设置寄存器(RX_PW_P0,0X11)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

1200

帖子

1

粉丝