OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9628|回复: 7

NRF24L01+学习心得

[复制链接]

7

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
496
金钱
496
注册时间
2017-12-11
在线时间
63 小时
发表于 2017-12-11 23:45:35 | 显示全部楼层 |阅读模式
STM32控制NRF24L01+学习心得
烟台汽车工程职业学院 电子工程系电子创新协会 王承飞  2017.12.11
为什么要写?(以下均为个人看法,如有不当还请饶恕)
起初是想找一个低功耗、成本低的无线传输方案。就我知道的来说常用的无线有蓝牙、无线串口、WIFINRF24L01等。并且我也都买来实验过,蓝牙模块买的是亿佰特公司的E104-BT02价格是22/块(不包邮),其控制起来比较简单,使用时需要配置从机主机,配置好后便自动配对。数据传输(双向)上也是预留了串口,只要在相应的IO口上按说明书加上适当的电平便可以工作在想要的模式,通过串口接受发射数据,很是方便。功耗为1mW,使用不当的话可能要多一点。传输距离厂家提供的是空旷100米,实际上出门一道墙再走个十米多,距离也算可以,相对于淘宝上一些其他的串口蓝牙模块(标的传输距离只有10米)还算可以。
无线串口模块,泽耀公司促销的一款AS32-TTL-100(半双工433MHz)价格在12/块,性能非常稳定,操作也非常简单,只要是会串口就会使用。其传输距离和穿透能力非常好,一个在5楼实验室发送数据,拿着另一个从5楼跑到一楼并且走到红旗广场数据接收无异常。功耗在100mW,但是由于考虑成本(原价35左右吧)最终只是把他列为稳定无线传输方案等待以后合适再用。
WIFI原先在创新作品上用过一款,集成度很高,也是预留了串口,控制起来比较容易,但考虑项目中不用手机电脑等上位机程序,所以也排除了。
针对低功耗在亿佰特买了42.4GNRF24L01+无线模块价格在9/块,其配置、指令均为SPI接口。我用的单片机是STM32F103RCT6,板子是正点原子的MINI板。刚接触NRF24L01+的时候看他的例程和视频一头雾水。尤其是地址把我弄得我够呛。正点原子讲的是NRF24L01而我的是NRF24L01+,后者在一定程度上是兼容前者的。增强型ShockBurst TM模式下几乎就没有什么区别。通信距离空旷我只在实验室里(90平方左右)试过,基本上还好吧。
经过了十多天断断续续的学习,使我对这款芯片的了解更深了一步。以下是我的一些总结,希望对和我一样的新手能够有用。如果是大神还请多多指教。
NRF24L01NRFL01+
1. NRF24L01+NRF24L01的升级版本NRF24L01+相对于老版本的传输速率多了一个250Kbps,数据量小的话,传输距离更远。在配置地址为0x06的寄存器时要注意,数据传输率的位与NRF24L01有所不同。
2. 同样可以工作在增强ShockBurst TM模式下。增强ShockBurst TM的特点是自动包事物处理,很容易实现双向数据链接。
说一下自动包事物处理,在增强ShockBurst TM模式中我们设置一个NRF24L01+为主发射器,后面我们简称PTX。设置一个NRF24L01+为接收器,后面我们简称为PRX
PTXPRX传送一包数据开始一个新事物。发送完后PTX等待ACK(应答包)。
如果PRX接收到了PTX发来的数据包无误后,会向PTX发送一个ACK包。
如果PTX没有在规定的时间内收到ACK,在一个程序延时后自动将原先的数据重新发送,继续等待ACK
包事物处理包括自动应答和自动发送。
在增强型ShockBurst TM模式中可以配置参数,如允许重发最大次数和从一个传输到下一次重发的延时时间。所有的自动处理不需要我们的MCU参与,在使用中增强ShockButrst TM模式最为常用。
3. NRF24L01+增强型ShockBurst TM提供两种选择来出处理载荷长度:静态和动态。
默认情况下是静态载荷长度(要发送的数据长度)。
动态载荷长度(DPL)是相对于静态载荷长度的另一种选择。DPL使的收发器发送给接收器的数据具有可变载荷长度。这就意味着发送时没有必要去规定其最大载荷长度。在使用该功能时要注意使能。
弄清楚地址(NRF24L01/NRF24L01+)增强型ShockBurst TM:
捕获5.PNG
TX_ADDR(发送地址)只有一个,是发送数据包中要发送的地址(3-5字节,通过设置SETUP_AW寄存器修改地址的长度),这个地址就指定了接收端的某个通道的地址。所以接收端的的6个接收通道地址中必须要有一个与发送端的TX_ADDR一样。
发送端把数据发送给接收端,接收端在确定收到了数据后自动记录发送端的地址,并以此地址为目标向发送端发送ACK(应答信号),就是说接收端收到数据后TX_ADDR的地址就自动变成了发送端的TX_ADDR地址,并且发送应答信号。但如果发送端想要接收到接收端返回来的应答信号,发送端需要将自己的通道0接收地址(发送端只有通道0能接收应答信号)设置成接收端的TX_ADDR,又因为接受端的TX_ADDR等于发送端的TX_ADDR所以在两个模块实现收发时各模块的地址设置:
发送端  TX5:TX_ADDR=0xB3B4B5B605;
TX5:RX_ADDR_P0=0xB3B4B5B605;
接收端  RX:RX_ADDR_Px(任意一个通道)=0xB3B4B5B605;
        RX:TX_ADDR(会根据接收到数据的该通道地址返回应答信号)
注意:每个NRF都只有一个发送通道,用来指示向接收端的哪个NRF的接收通道发送数据。上面的TX5是指第5NRF模块,但一个模块有六个接收通道,每个接收通道都有自己的地址。所以一个NRF可以接收6NRF发来的数据。发送端的NRF会用自己的接收通道0来接收接收端发送来的应答信号。但是接收端的NRF发送应答信号的时候,会根据当前接收通道的地址为TX_ADDR(发送地址)向发送端发送应答信号。所以对应的发送端的通道0接受地址(RX_ADDR_P0)要设置成这个地址。
NRF的中断引脚IRQ:
STATUS(状态)寄存器(地址为0x07)中的RX_DRTX_DSMAX_RT任意一位置1时,触发中断,IRQ脚上变为低电平。
RX_DR在接收到有效数据后置1
TX_DS在发送数据完成后。如果工作在自动应答模式中,只有接收到应答信号后才置1
MAX_RT达到最大重发次数后置1(发送端发送一次数据收不到应答信号,将根据SETUP_RETR寄存器的设置情况,进行重发,直至达到重发上限次数)。
清除中断就向该位写1,不要写0IRQ引脚恢复高电平。该IRQ引脚的中断信号可以屏蔽,就是RX_DRTX_DSMAX_RT任意一位置1时,该引脚将不产生低电平。屏蔽设置CONFIG寄存器(地址为0x00)。该引脚可以用来触发单片机的外部中断,快速对数据进行处理。
STM32操控NRF24L01+
在这里我用的是STM32F103RCT6芯片有串行外设接口(SPI),对于一些没有SPI 接口的单片机可以用I/O口模拟。通常SPI通过SPI通过4个引脚一外部相连:
MISO:主设备输入引脚/从设备输出引脚。
MOSI:主设备输出引脚/从设备输入引脚。
SCK:串口时钟,作为主设备的输出,从设备的输入。
NSS:从设备选择引脚。
捕获3.PNG
NSS可以设置为软件模式和硬件模式,原子的教程里是软件模式,有点不明白为什么不选硬件模式,使其NSS引脚与从机(NRF24L01)的片选引脚相连不就好了,放着NSS引脚不用却又定义了一个端口来控制来控制从机的CS引脚,还有NSS引脚另作它用,用来控制NRF24L01CE引脚。
捕获2.PNG
由这张图可以看出NRF24L01/NRF24L01+的时钟在空闲的时候为低电平,并且在第一个跳变沿开始对数据位采样。在说明书中也提出了最大数据传输速率为10Mbps。所以我们在初始化SPI的时候要注意。
Stm32SPI外设IO口的设置可以根据数据手册配置,如下
捕获1.PNG
这是我结合原子的例程、NRF24L01NRF24L01+数据手册写的一个收发程序,发送端按键0发送一个5字节的数据,发送成功、失败串口提示。接收端接收成功串口提示,并显示接收到的数据。两个MINI板子。 STM32RCT6_NRF24L01 .zip (6.17 MB, 下载次数: 1134)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

156

帖子

0

精华

高级会员

Rank: 4

积分
883
金钱
883
注册时间
2017-8-7
在线时间
200 小时
发表于 2017-12-12 09:45:32 | 显示全部楼层
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2016-3-13
在线时间
36 小时
发表于 2017-12-13 23:09:51 | 显示全部楼层
清除STATUS的时候要不要把CE = 0;因为手册说写寄存器需要进入待机模式,只好把ce拉低,但是不拉低同样可以请STATUS。
回复 支持 反对

使用道具 举报

7

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
496
金钱
496
注册时间
2017-12-11
在线时间
63 小时
 楼主| 发表于 2017-12-14 08:17:11 | 显示全部楼层
givemefive 发表于 2017-12-13 23:09
清除STATUS的时候要不要把CE = 0;因为手册说写寄存器需要进入待机模式,只好把ce拉低,但是不拉低同样可以 ...

那你一定是在发送端发送成功后没拉低CE,然后对寄存器操作。
因为当发送端 TX FIFO 寄存器为空并且 CE 为高电平时进入待机模式II。
手册上说发送端只要收到确认信号,nRF24L01 就认为最后一包数据已经发送成功(接收方已经收到数据),把 TX FIFO中的数据清除掉并产生 TX_DS 中断(IRQ 引脚置高)。


回复 支持 反对

使用道具 举报

34

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
857
金钱
857
注册时间
2018-9-16
在线时间
240 小时
发表于 2019-10-2 10:25:03 | 显示全部楼层
楼主我能问下你,我每次调用发送函数,总是返回发送达到最大值是为啥,我就是用了两个103核心板做这个实验的,分别给每个核心板上电,然后按下按键发送buff
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2018-9-18
在线时间
30 小时
发表于 2019-12-3 16:10:15 | 显示全部楼层
楼主你好,如果两个相同信道和地址相同的接收机放在一起,另外放一个发射机发送数据,两个接收机会互相干扰吗?
回复 支持 反对

使用道具 举报

4

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2020-2-3
在线时间
23 小时
发表于 2020-4-25 23:39:48 | 显示全部楼层
有没有什么好的方法解决模式切换时同时处于发送态,同处于发送态会断开连接,mcu会自己刷新 就很烦
回复 支持 反对

使用道具 举报

34

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
912
金钱
912
注册时间
2019-7-5
在线时间
189 小时
发表于 2020-8-14 14:45:24 | 显示全部楼层
jinwj 发表于 2020-4-25 23:39
有没有什么好的方法解决模式切换时同时处于发送态,同处于发送态会断开连接,mcu会自己刷新 就很烦

不要开启自动应答
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-10 15:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表