nRF24L01+如何檢測信道被佔用-RSSI寄存器實戰分享

檢測信道佔用的需求場景

在使用nRF24L01模塊作一對多或多對一的組網通訊中,你們都會擔憂一個問題就是在發送的時候,但願不要有其餘的模塊也進行發送,由於這樣就會使無線信號發生碰撞,信道被堵塞,形成通訊失敗。函數

爲了不這種狀況發生,就但願在發送前能知道當前信道是否處於空閒,若是空閒就發送,不然就等待一會,直到空閒下來再執行發送。利用這個機制,能夠很大程度上規避碰撞的發生。code

在nRF24L01+中怎樣知道信道被佔用了

在nRF24L01+中有個RSSI寄存器,地址是0x09,該寄存器的0號位是表明當前信道信號強度的。當接收信號強度小於-60dBm時0號位爲0,大於-60dBm時爲1,該寄存器7-1號位是保留位,固定爲0。這樣咱們經過直接讀取該寄存器的值是0仍是大於0就知道信道是否被佔用了。循環

下面是該寄存器在一些模塊廠家官方例程裏的定義:方法

#define RPD         0x09            //接收功率檢測寄存器

通信

#define RSSI        0x09            //接收功率檢測寄存器

下面是經過讀寄存器函數讀取該寄存器的狀態值的代碼:數據

StatusRPD = nRF24L01P_Read_Reg(RPD);        //若是定義的是RSSI,那語句中RPD換成RSSI

經過上面語句獲得的StatusRPD值,若是大於0則是信道被佔用,在邏輯代碼中經過這個判斷就能夠識別信道是否被佔用了。也能夠在發送前用循環等待這個值的變化,直到爲0時進入發送狀態。以下面的代碼:db

while(nRF24L01P_Read_Reg(RPD));

爲何用循環等待,有時候會死循環(一直返回1)

在實際應用中,使用上述方法的確能夠獲得當前的信道信號強度,達到判斷信道是否佔用的目的。可是在循環等待的時候,偶爾會出現死循環的現象。也就是讀回來的狀態值一直是1,可是的確沒有模塊在發送,已經將其餘模塊所有斷電了,周圍也沒有強信號干擾,那麼問題出在哪裏呢?while

仔細查看芯片手冊,只找到下面這段話:co

在接收模式下,能夠經過RSSI寄存器檢測接收信號功率。當接收到的信號強度大於-60dBm時,RSSI寄存器的RSSI位的值將被設置爲1。不然,RSSI=0。。RSSI寄存器的更新方法有兩種:當接收到有效的數據包後,RSSI會自動更新,此外,將芯片從RX模式換到Standby模式時RSSI也會自動更新。RSSI的值會隨溫度的變化而變化,範圍在±5dBm之內block

通過仔細分析和反覆試驗,理解了這段話所描述的具體內涵:
一、這個信號強度檢測必須在接收模式下進行,在發送模式下是不許確的。
二、並非不管什麼狀況下,這個寄存器都會被更新,只有CE由1變爲0時才更新一次;或者在接收到有效數據的時候,會自動更爲1。
三、當收到有效數據將該寄存器置1後,只有將接收FIFO寄存器的數據讀出後,纔會變爲0,不然你變化幾回CE都無效(這是手冊沒有提到的,多數會踩到這個坑)。

上面的死循環狀況通常發生在執行發送的前夕,恰好收到一個有效數據時,RSSI寄存器被置1,而代碼正在處理髮送,又沒有去讀出數據,因此就一直保持着1,因此循環條件一直知足,就成了死循環了。

解決辦法建議是在檢測到爲RSSI爲1的時候,判斷一下是否收到數據,若是收到數據先讀出來,至於讀出來的數據要不要處理,根據您本身的業務邏輯決定便可。而後操做一次CE引腳,再次更新檢測一下是否有信號佔用信道。此方法通過實際應用是有效的。

相關文章
相關標籤/搜索