关于2.4G(NRF24L01+)频谱仪的探讨,和移植stm32版本

首先我也不是什么大神,也只是一个刚毕业不久的菜鸟而已,有那里说的不对,大神们可以指出。
一次无意的发现了这个有趣的东西,应为之前我也使用过nrf24l01开发过一款遥控主要产品,所以我对这个东西特别感兴趣,特别想了解其中的原理,因为在我使用的过程中没有发现nrf24l01这款无线模块有RSSI(信号强度)这个功能,这就让我更加好奇了。它是怎么检测频道的占用和信号的强度。我疯狂的寻找nrf24l01频谱仪的源程序,找了好久发现有挺多这样的帖子,都是arduino的程序,而且我一直没有找到源程序,有一些找到打不开。
后来通过( http://www.moz8.com/forum.php?mo ... 2871&highlight=2.4G
这个帖子找到了(http://singlechannellersreunited.co.uk/phpbb3/viewtopic.php?f=9&t=721)
歪国朋友的帖子,下载到源程序,可惜是LCD 1602显示的,不是网上大部分的OLED屏幕,后面再经过一番折腾,终于找到了OLED版本的NRF24L01的频谱仪了。首先先上传我找到的两份源程序,稍微修改了一下,可以正常编译通过。

分析源程序之前我觉得很有必要先,再次看一下nrf24l01+的文档,可是找了好久都没找到中文版的nrf24l01+的文档,一般中文版都是nrf24l01的文档。哎,只能怪自己英文没学好。最终还是让我找到一个大神的博客是分析nrf24l01+的,写的挺不错的
这里分享给大家:http://gashero.iteye.com/blog/2333336     我认认真真的看来一遍。

发现只有一个寄存器是有关的    Received Power Detector=RPD,地址是0x09,其bit0指出接收功率是否低于-64dBm。如果接收功率低于-64dBm,RDP=0。再去分析程序,发现程序也就是通过这个寄存器来判断的。而通过使用发现,OLED屏幕显示条状的高度,其实只是该频道的占用量而已,而不是信号强度。当打开这个频谱仪,在通过大量使用路由器wifi的数据,会发现一部分频道的占用量会爆满。所以这个只能粗略的检测改频道的占用量。而不是检测信号强度。

程序的分析:通过配置nrf24l01模块为接收模式,然后按顺序切换频道,延时一段时间后读取RDP这个寄存器的值为1还是0,当为1的时候增加数组对应频道的占用量的值,当为0时减小数组对应频道的占用量的值,然后扫描一段时间后,再通过这个数组的值,来显示OLED对应频道的条状高度。通过直至循环。实现初略观察到该频道的占用情况。

后来通过我以前使用的nrf24l01的程序稍微修改,在stm32 平台上实现了和arduino平台一样的频谱仪功能,只是我没有把OLED显示也移植过来,只是通过串口检测了。
暂时不打算移植OLED显示,不打算折腾下去了。因为自己还有其他小东西需要制作。所以留着以后有空再折腾吧。

在这里把我折腾心德记录一下,因为刚发现这个东西的时候,那个心情是无比的激动,通过深入的了解,也学习到了一些东西。还是不枉折腾的,生命在于折腾嘛!


附件下载地址:http://download.csdn.net/download/jgagdwp/10231933

一、测试距离 0.软件为Keil5,不知道是否支持Keil4(如不行请手动新建Keil4工程) 1.单片机为STM32F103C8,采用硬件SPI 2.nRF24L01+采用3.3V供电,接线如下:       24L01+       STM32 CE   ——   PA3 CS   ——   PA4 SCK  ——   PA5 MISO ——   PA6 MOSI ——   PA7   IRQ未接(采用查询方式,如须用自加外部中断程序) 3.led灯为PC13控制,低电平亮(在User\led.c中修改GPIO);按键为PA0,按下后(接地)才开始发送,默认注释了,如需要可在程序中加上 4.My24L01_Tx为发送端程序,My24L01_Rx为接收端程序; 5.发送端约100ms发送一次,不要ACK;接收端每接收到一次led反转;将程序下载到单片机后可看到接收端led快速闪动,可将接收端的24L01在一定范围内走动,若led闪动变慢,则说明有丢包;led不闪,说明没有收到数据;因此大致可测得发送距离 6.24L01采用0频道,2Mbps, 0dBm, Address 3Bytes,实测距离大于10米(在不同的房间) 二、测试速率 0.软件为Keil5,不知道是否支持Keil4(如不行请手动新建Keil4工程) 
1.单片机为STM32F103C8,采用硬件SPI
 2.nRF24L01+采用3.3V供电,接线如下:
      24L01+       STM32
 CE   ——   PA3
 CS   ——   PA4
 SCK  ——   PA5
 MISO ——   PA6
 MOSI ——   PA7  
 IRQ未接(采用查询方式,如须用自加外部中断程序) 

3.led灯为PC13控制,低电平亮(在User\led.c中修改GPIO);按键为PA0,按下后(接地)才开始发送!!! 

4.My24L01_Tx为发送端程序,My24L01_Rx为接收端程序;

 5.接收端先上电,发送端上电后按下按键后才发送50KB(32B一帧 共32*50帧 32*32=1024=1K),发送端收到ACK后才发下一帧,发完后进入死循环,如须再发要先复位或重新上电;接收端每收到一次led反转;(如未反转说明未成功发送,发送端接收端重新复位后再试)时间可看在接收程序中tim3Count(单位ms 16进制,定时器1ms中断)在Watch1中

 6.发送端我用的是延时等待查询STATUS寄存器,用外部中断IRQ应该会更好(未测试) 

7.24L01采用0频道,2Mbps, 0dBm, Address 3Bytes,实测速率约为50KB/s
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值