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 ...
随机推荐
- 【Linux】【通信】1.ping不通
关于为什么ping不通有很多种原因,但直接的表象就网络之间没有成功进行通讯: 在构建虚拟机和win之间的交互时,主要使用了3种网络模式: 桥接bridge VMnet0 主机host VMne ...
- wxPython入门练习代码 三
DoubleEventFrame.py: #!/usr/bin/env/ python import wx class DoubleEventFrame(wx.Frame): def __init__ ...
- IE下new Date不支持传参数的解决
在FF gloogle浏览器中 用js实例化Date对象时 各种参数都可以换传啊. var date = new Date("2014-10-1 10:24:31"); var d ...
- Codeforces Round #284 (Div. 2) C题(计算几何)解题报告
题目地址 简要题意: 给出两个点的坐标,以及一些一般直线方程Ax+B+C=0的A.B.C,这些直线作为街道,求从一点走到另一点需要跨越的街道数.(两点都不在街道上) 思路分析: 从一点到另一点必须要跨 ...
- Android studio 提示:Can't use Subversion command line client: svn Probably the path to Subversion executable is wrong. Fix it.
1.参考来源:http://my.oschina.net/fyyy/blog/519353 按照下图,svn相关选项不要选.
- C# 数据类型
1.整数类型: int 只能 存储证书,不能存储小数. 2.小数类型: doubie 机能存储整数,也能存储小数,小数点后面的额 15-16位. 3.金钱类型: decimal:用来存储金钱, ...
- Linux学习 : 自己写bootloader
一.bootloader 目标:启动内核 基本功能: ①初始化硬件:关看门狗.设置时钟.设置SDRAM.初始化NAND FLASH ②image比较大需要重定位到SDRAM ②将内核从NAND FLA ...
- SQL查询关于相对路径、矢代、绝对路径、递归、计算列的速度对比跟优化-SOD群记录
1秒查原本递归的查询. 适用于:上下级.多层查询 -- Get childs by parent id WITH Tree AS ( SELECT Id,ParentId FROM dbo.Node ...
- c++ 中的sort用法
别人写的,我拿来做做笔记 sort函数的用法 做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错.ST ...
- oracle 11g dmp文件导入10g
需要导表的时候死活进不去, 现在没需求了.试了一把,一点问题都没.无语.下次遇到问题解决下吧. 导入导出命令:imp abc/abc123@ORCL file='d:\脚本\new\t_adverti ...