最近做了一个MSP430F2232+nRF24L01做无线通信的系统,为了扩展无线通信距离在nRF24L01的输出端又添加了功率放大器PA2423L,使得输出通信距离可以扩展到数百米。最初调试驱动程序时都是使用两节AA电池供电的,每次将电源接口从板子上拔下来算是断电,重新插上去就是上电了!程序写好了后,测试一切正常没有问题。
但是,将整套东西交给朋友测试后,在他那里却发现了问题!他使用的是直流稳压电源为板子供电,稳压电源的输出端与板子的电源输入接口始终保持连接。每次关掉稳压电源的算是给板子断电,打开稳压电源算是给板子上电。故障现象是:每次给板子上电后,程序启动正常,但是运行完10S倒计时部分后,就会卡死,不在继续往下执行。但是,如果保持直流电源一直处于打开状态,而将电源接口拔下来作为给板子断电的方式,将电源接口插上去作为给板子供电的方式的话,在10S倒计时后能够正常运行了,也即程序正常工作!
这是为什么呢?到底是软件的原因还是硬件的原因呢?如果是软件的原因那么为什么插拔板子的电源接口时程序能够正常运行,如果是硬件原因那么为什么直接开关直流电源时10S倒计时程序也能运行呢?这个害得我苦思冥想大半天的问题,最终还是被我解决了。
原来,最初的程序结构是这样的:上电后设置msp430的系统时钟,初始化msp430内部的SPI模块,通过SPI端口初始化nRF24L01,然后进入10S倒计时,倒计时结束后发送无线链接数据,然后读取传感器数据,显示数据。经调试发现,在倒计时结束后,发送数据时MCU进入死循环等待,为什么呢?原来MCU向nRF24L01写完发送数据后,需要等待nRF24L01返回一个发送结束标志,如果没有这个结束标志MCU就一直等待下去!所以在直接开关直流电源时出问题的原因就是nRF24L01一直没有返回发送数据结束标志!可是初始化nRF24L01后向其中写数据后它就会自动发送自动返回发送接收标志了,这个不应该有问题的,如果说nRF24L01没有返回发送结束标志,那只能说明数据没有发送出去,为什么没有发送出去呢?只能是初始化不成功了!但是初始化怎么可能会有问题呢,以前一直是好用的呀!莫非是上电时电源波动太大对MCU造成了影响,可以如果真是这样的话,MCU就不能正常工作了,那为什么还能正确执行10S倒计时程序呢?
后来,我抱着试试看的心态,将初始化nRF24L01的程序放到了10S倒计时的后面,重新编译下载测试,哇塞,10S倒计时部分后程序继续运行,液晶显示了传感器数据,一切正常了!这时候无论怎么开启和关闭直流电源都程序可以正确运行了!看来真的是开启直流电源时干扰了板子,只不过干扰的不是MCU的运行,而是MCU与nRF24L01接口的SPI总线吧!我猜测可能是上电时电源波动太大影响了SPI总线(总线时钟为4MHz)上的数据传递,导致初始化nRF24L01失败,所以当MCU试图控制nRF24L01发送数据时就会陷入永远等不到发送结束标志的死循环中了!而10S倒计时过后,电源已经稳定了,此时不会对SPI造成影响,所以这时再初始化nRF24L01就是成功的了,也就能够控制nRF24L01收发数据了!
而保持直流电源一直开启,直接插拔板子的电源接口时由于直流电源的输出是稳定的不会对SPI造成影响,所以那种情况下MCU中的程序能够正确运行!使用电池时程序正确执行也是同样的道理了!(以上分析仅为个人观点,不能保证一定正确;如有高见,欢迎交流!)
这是才想起来,以前听老工程师讲过,他们在写51单片机的程序时,上电后的第一件事通常是让MCU什么也不做,只是执行NOP循环、等待几秒钟(如果系统允许的话),然后才执行初始化和系统程序!当时一直不明白原因,现在自己遇见了才知道,上电过程中电源的不稳定对电子系统的影响是相当巨大,所以我们在设计软件程序时必须仔细考虑审慎处理上电初始化部分啊,否则可能对后面程序的执行造成重大影响呢!
用户377235 2012-11-29 19:37
用户1405829 2009-6-15 17:12
用户1411055 2009-1-6 13:46
用户204274 2008-12-20 12:33