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 ...
随机推荐
- MS SQLSERVER中如何快速获取表的记录总数
在数据库应用的设计中,我们往往会需要获取某些表的记录总数,用于判断表的记录总数是否过大,是否需要备份数据等.我们通常的做法是:select count(*) as c from tableA .然而对 ...
- javaIO系统----再看装饰者模式
javaIO系统拥有各种各样的类,尤其是每次要进行读写操作时,总会一层套一层的new,以前不明白为什么要这样做,不过学习了适配器模式后,对于这种做法立刻了解了:动态扩展IO的功能,使之符合使用者的习惯 ...
- output和returnvalue的作用
贴两段代码. 1> public int ExecuteNonQuery(string pro, MobileOrder or) { SqlParameter ...
- Python学习笔记-抽象
懒惰即美德.代码量少. hasattr判断函数是否可用. 创建函数. def hello(name) return 'hello,'+name+'!' 文档化函数: 加注释(#开头) 文档字符串.函数 ...
- centos设置静态ip地址
1.修改网卡配置 编辑:vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 #描述网卡对应的设备别名,例如ifcfg-eth0的文件中它为 ...
- 7月17日——高校就业信息网站功能及数据获取之python爬虫
本周我们小组在分析上周用户需求之后,确定了网站的主要框架和功能.数据收集和存储方式,以及项目任务分配. 一.网站的主要框架和功能. 网站近期将要实现的主要功能有,先重点收集高校(华东五校)就业宣讲会的 ...
- [DPDK][转]DPDK编程开发(4)—lcore
1.知识百科 返回值 操作函数 函数功能 RTE_DECLARE_PER_LCORE (unsigned, _lcore_id) RTE_DECLARE_PER_LCORE (rte_cpuset_t ...
- ubuntu 安装MTK 移动终端usb驱动
lsusbBus 001 Device 002: ID 8087:8000 Intel Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation ...
- silverlight导出excel
开发导出excel,首先需要添加项目引用. Microsoft.CSharp 这个是应用dynamic的前提. 在代码页,需要添加引用 using System.Runtime.InteropServ ...
- Linux/Unix 线程同步技术之互斥量(1)
众所周知,互斥量(mutex)是同步线程对共享资源访问的技术,用来防止下面这种情况:线程A试图访问某个共享资源时,线程B正在对其进行修改,从而造成资源状态不一致.与之相关的一个术语临界区(critic ...