根據網上的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才可以通訊。