2.4G无线射频通信模块nRF24L01+开发笔记(基于MSP430RF6989与STM32f0308)(1.(2)有错误,详见更正)
根据网上的nRF24L01+例程和TI提供的MSP430RF6989的硬件SPI总线例程编写程序,对硬件MSP-EXP430RF6989 Launch Pad+nRF24L01P射频模块(淘宝购买)进行调试。
1. nRF24L01+初始化寄存器配置失败的原因(2015年12月20日)(第2点是错误的)
(1) SPI总线的配置要和配对设备一致,详见《MSP430中SPI总线的两种实现方式》。
(2) 在nRF24L01+初始化寄存器配置的过程中,部分寄存器总出现写入失败(ENAA、RF_CH、CONFIG),保持缺省值的情况,而且情况不稳定,有时候可以成功。论坛里的网友反映是电源电压不稳造成的,为射频模块提供独立电源供电可以解决。
(本段结论错误)进一步测试发现,如果把CONFIG寄存器的配置放在其他nRF24L01+初始化寄存器配置之前,寄存器配置都可以成功,(林新华的《nRF24L01 试用实录》中的例程是这样的顺序,这样做功耗略大,但是并不明显)。研究Datasheet提供的nRF24L01+状态机发现,CONFIG寄存器不同于其他寄存器,它与CE信号可以共同控制nRF24L01+的工作模式。原参考例程中初始化配置的最后一步配置CONFIG使nRF24L01+工作在Standby-1模式下,而之前其他寄存器的配置都是在Power Down模式下完成的,而林新华例程的寄存器配置都是在Standby-1模式下完成的。由Datasheet可知,Power Down模式的工作电流是0.9uA,而Standby-1的模式工作电流是26uA。初步判断,在单片机和射频模块共用电源的情况下,Power Down模式的微弱工作电流极容易被单片机影响(或电源纹波本身影响),所以容易出现寄存器写入失败的情况。有待进一步在射频模块独立供电的状态下进行测试。
2、nRF24L01+初始化寄存器配置失败的原因(2015年12月22日)(更正)
进一步测试发现,一、2的结论是错误的。寄存器配置不成功的真正原因是MSP430的SPI总线的配置与nRF24L01+的规定不符。根据nRF24L01+的Datasheet中的SPI总线时序图,时钟信号在非活动状态下为低电平,而MSP430错误地设置为了非活动状态高电平。只要改写USCI_A的控制寄存器的对应控制位就可以改变这个设置。对于MSP430RF6989,USCI_A控制寄存器为UCA0CTLW0,控制位为UCCKPL,置0代表非活动状态低电平。
3、STM32下载失败( 报错There were warnings during download)的原因(2015年12月22日)
现象:STM32下载报错:There were warnings during download. 调试无法进入函数,程序在HAL_Tick程序中执行while循环。
原因:Flash loader未使能。之前调试中为了进行软件仿真,将Debugger->Setup选择为Simulator,之后再选回ST-LINK后,Flash loader使能自动取消了。
解决方法:IAR->Project option->Debugger->Download->"Use flash loade6r" 钩上。
4. IAR的C/C++ Compiler中的Optimization设置
程序编译优化选项,当希望程序不被优化时把Level选为None。
不希望被优化的情况:1)通过赋值语句精确延时 2)监控可能被优化的变量 3)停在可能被优化的断点。
5. RX_IRQ置位的时候STATUS寄存器读取的值保持0,原因未知。
6. 关于MSP430的IO口配置
(1)概述
After a BOR reset, all port pins are high-impedance with Schmitt triggers and their module functions
disabled to prevent any cross currents. The application must initialize all port pins including unused ones
(Section 10.3.2) as input high impedance, input with pulldown, input with pullup, output high, or output low
according to the application needs by configuring PxDIR, PxREN, PxOUT, and PxIES accordingly.
(2) 配置结束后的“PM5CTL0 &= ~LOCKLPM5; ”语句功能
This initialization takes effect as soon as the LOCKLPM5 bit in the PM5CTL register (described in the PMM
chapter) is cleared; until then, the I/Os remain in their high-impedance state with Schmitt trigger inputs
disabled.
Note that this is usually the same I/O initialization that is required after a wake-up from LPMx.5.
After clearing LOCKLPM5 all interrupt flags should be cleared (note, this is different to the wake-up from
LPMx.5 flow). Then port interrupts can be enabled by setting the corresponding PxIE bits.
(3) 配置时机
After a POR or PUC reset all port pins are configured as inputs with their module function being disabled.
Also here to prevent floating inputs all port pins including unused ones (Section 10.3.2) should be
configured according to the application needs as early as possible during the initialization procedure.
7. Watch窗口数组有一些元素显示为空
可能是Watch窗口没有刷新的原因,右键对应数组→任意切换Format,解决。(由于怀疑是数组没有赋值Debug了半天最终竟然是这个原因,心中一万只草泥马奔腾而过。)
8. nRF24L01+对电源的要求
经测试发现,nRF24L01+对电源要求比较高,要求电源电压噪声小。测试中使用MSP430FR6989的3.3V电源供电,在接收状态下出现将近一半概率的误码,在发送状态下可以成功发送。分析可能是接收状态下信号弱,解调过程中要求电源噪声小。在nRF24L01+模块的电源和地之间加一个1uf的电容可以大大改善,但是在5包32Bytes数据连续发送的情况下还是会偶然出现1~3个Bytes的误码,误码一般只有一位错误。使用独立电源供电(STM32的电源)可以完全解决。实际应用中应重点考虑nRF24L01+的供电电压噪声。
9. CRC校验
在10米左右的通信距离进行测试,打开CRC校验后,误码率为0,丢包率为3%左右。但打开CRC校验后发送一包的数据的时间比原来有所增加,大于600us,未进行详细测试。
10. 状态机+定时器模式
程序中采用定时器置位状态机标志位TimeFrame,再有main函数中的if语句轮询各个TimeFrame的值。这种模式下,如果主程序下某TimeFrame取值分支中的程序执行时间大于状态机时间,会产生错误。
11. USB串口底板+NRF24L01P与MCU+NRF24L01P通信的问题
由于USB串口底板的底层代码并不是开放的,所以应用了许多缺省设置,MCU程序中对NRF24L01P的设置必须完全一致才可以。比如我用的这一款底板把NRF24L01P设置为ACK使能,即EN_AA=0x01才可以通信。
2.4G无线射频通信模块nRF24L01+开发笔记(基于MSP430RF6989与STM32f0308)(1.(2)有错误,详见更正)的更多相关文章
- IOS开发笔记 - 基于SDWebImage的网络图片加载处理
前言: 在IOS下通过URL读一张网络图片并不像Asp.net那样可以直接把图片路径放到图片路径的位置就ok, 而是需要我们通过一段类似流的方式去加载网络图片,接着才能把图片放入图片路径显示. 这里找 ...
- Yocto开发笔记之《Tip-stdlib库函数strtod返回nan错误》(QQ交流群:519230208)
2015.04-imx_v2015.04_3.14.38_6ul_ga+g5d63276 (Jan 04 2016 - 18:07:08) FSL Community BSP : https://co ...
- iOS开发笔记 基于wsdl2objc调用asp.net WebService
1.准备 先下载待会要用到的工具 WSDL2ObjC-0.6.zip WSDL2ObjC-0.7-pre1.zip 我用的是WSDL2ObjC-0.6.zip 1.1搭建asp.net WebServ ...
- IOS开发笔记 - 基于wsdl2objc调用webservice
为了方便在ios下调用webserivce,找来了wsdl2objc这样一个开源的框架来解析webservice方便在ios下引用. 下面做个小例子. 1.首先是用Asp.net搭建一个测试的webs ...
- RF无线射频电路设计干货分享
1.概述:射频(RF)PCB设计,在目前公开出版的理论上具有很多不确定性,常被形容为一种“黑色艺术”.通常情况下,对于微波以下频段的电路(包括低频和低频数字电路),在全面掌握各类设计原则前提下的仔细规 ...
- [Openwrt 项目开发笔记]:Openwrt平台搭建(一)
[Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...
- 安卓开发笔记——自定义广告轮播Banner(实现无限循环)
关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...
- [Openwrt 项目开发笔记]:Openwrt平台搭建(一)补遗
[Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 昨晚上熬夜写了[Openwrt项目开发笔记]:O ...
- Hi3516开发笔记(一):海思HI3516DV300芯片介绍,入手开发板以及Demo测试
前言 目前主流国产芯片为RV11XX.RK33XX.Hi35XX系列,本系列开启Hi3516系列的开发教程. Hi3516DV300芯片介绍 Hi3516DV300为专业行Smart IP ...
随机推荐
- app上传到App Store的快捷方法及步骤
跳过证书的申请及配置概要文件的设置, 现在根据已有的配置概要文件及发布证书开始: 1.先在Xcode上的PROJECT和TARGETS->Build Setting->Code Signi ...
- ObReferenceObjectByName函数调用WIN7下的解决
<寒江独钓 Windows内核安全编程>第4章键盘的过滤ctrl2cap代码中,ObReferenceObjectByName函数调用: [1]extern POBJECT_TYPE Io ...
- android 通过WiFi进行adb调试
第一种方式: 1.把Android SDK的下的 platform-tools 目录 加入到系统的path变量中 打开cmd命令行 输入adb 显示如下图则为设置成功 2.打开手机 下载一个叫WiFi ...
- Javascript练习
1.时钟 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...
- 【转】Swift之 ? 和 !
原文地址:http://joeyio.com/ios/2014/06/04/swift---/ Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会 ...
- win环境 yii2 框架 overtrue/wechat 包 由 sys_get_temp_dir 引发的 the directory "c:\Windows" is not writable
vendor\overtrue\wechat\src\Foundation\Application.php registerBase 方法 在初始化属性时 $this['cache'] = funct ...
- 010-Scala单例对象、伴生对象实战详解
010-Scala单例对象.伴生对象实战详解 Scala单例对象详解 函数的最后一行是返回值 子项目 Scala伴生对象代码实战 object对象的私有成员可以直接被class伴生类访问,但是不可以被 ...
- 玩转mysql-5.7.9-winx64.zip解压版
解压zip文件,放到D盘 追加\bin到Path环境变量 修改my-default.ini,# basedir =D:\mysql_5.7.9_winx64# datadir =D:\mysql_5. ...
- 学习Find函数和select
Find函数其实就类似于在excel按下Ctrl+F出现的查找功能:在某个区域中查找你要找的字符,一旦找到就定位到第一个对应的单元格.所以Find函数的返回值是个单元格,也就是个range值.举例,s ...
- jQuery原生框架-----------------属性操作
// 添加一个处理兼容获取样式的静态方法jQuery.getStyle = function( dom, styleName ) { // dom不是dom,styleName不是字符串,直接打走 i ...