天线|RF射频
直播中

郝汉

7年用户 182经验值
私信 关注
[问答]

NRF24L01+的学习心得分享

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

回帖(3)

陈勇

2020-6-16 16:26:37
顶顶
举报

李林松

2020-6-16 16:37:30
清除STATUS的时候要不要把CE = 0;因为手册说写寄存器需要进入待机模式,只好把ce拉低,但是不拉低同样可以请STATUS。
举报

程傍纯

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

更多回帖

发帖
×
20
完善资料,
赚取积分