根据网上的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才可以通信。