1. 程式人生 > >NRF24L01 使用小結-1

NRF24L01 使用小結-1

nrf24L01被設定為接收模式後,可通過6個不同的資料通道(data pipe)接收資料。

每個資料通道都有一個唯一的地址但是各資料通道的頻率是相同的。這意味著可以有6個被配置成傳送狀態的nRF24L01可以和一個配置成接收狀態的nRF24L01通訊,並且接收方可以區分(通過判斷狀態暫存器的1-3位即可達到區分的目的)。

資料通道0有一個唯一的40bit的可設定的地址。其餘的通道1到通道5則地址前32位相同,而後8位不同。所有的資料通道都可以實現Enhanced ShockBurst模式。

在傳送端,資料通道0被用來接收確認資訊,因此傳送端的資料通道0的地址必須等於傳送地址,這樣才能收到應答資訊。

當一個24L01傳送結束後,它會開啟接收器並等待確認。如果沒有收到確認,則重發,直到收到確認。當重發超過一定次數則發出中斷並改變狀態暫存器。重發次數的限制在SETUP_RETR_ARC暫存器中設定。

無論何時收到確認,都會認為上一個資料包傳送成功,這個資料包將被從傳送緩衝區清除,並且把TX_DS IRQ置為高。

每次開始spi寫,讀回來的都是狀態字。

 

增強型ShockBurst包格式

前置域1byte

地址域3-5byte

包控制域9bit

載荷0-32位元組

CRC1-2位元組

地址域是接收機地址

包控制域

載荷長度6bit

Pid2bit

NO_ACK1bit

載荷長度:6bit說明最多32位元組

Pid:用於包編號,用於確定是重發包還是新包

NO_ACK:用於表示是否自動應答,如為1則表示無需自動應答

自動應答的延時和重發次數是可程式設計的。

 

24L01的工作模式和暫存器及IO口的關係如下

CE引腳的作用

一個ESB(Enhanced ShockBurst)週期,傳送一個位元組連帶收到ACK大約339us

從powerdown狀態需要先進入standyby狀態,該狀態轉換需要1.5ms延遲,從standyby狀態進入rx/tx狀態,需要130us

置高CE維持最少10us,啟動Enhanced ShockBurst傳送。

 

Enhanced ShockBurst™模式下發送資料流程

1.配置config暫存器,將PRIM_RX置為0,表示傳送模式

2. 當需要傳送資料時,首先需要配置地址TX_ADDR,這個地址應該是接收端地址(即應該是接收端6個data pipe地址中的一個即可保證對方收到)。如果要使用自動應答,因為應答訊息由傳送端的datapipe0接收,所以傳送的datapipe0的地址應等於TX_ADDR(若是和上一次傳送是相同地址,則可不用重寫地址)。

3.配置資料負載長度TX_PLD,將需要傳送的資料送入nrf24L01,通過SPI連續寫入資料載荷時,nrf24L01將自動對位元組數計數。(資料載荷必須在cs為低的時候連續寫入)

4.將CE置高並維持最少10us,這個脈衝將啟動ShockBurst傳送

5.NRF24L01:

    a)開啟射頻

    b)啟動晶振

    c)資料打包

    d)傳送資料

6.如果啟動了自動應答(且重傳次數未達到最大值),NRF24L01將自動轉入接收狀態。

  1:若在規定時間內收到了應答包,則這是一次成功的傳送,TX FIFO中的資料被清除,同時置高status暫存器中的TX_DS位。

  2:如果在規定時間內未收到應答包則自動重傳(當啟用自動重傳時,由SETUP_RETR暫存器中的ARC位指定重傳次數)。

  3:當重傳次數到達最大值依然沒有收到應答,則status暫存器中的MAX_RT被置高,TX FIFO緩衝區中的資料並不被移除。

MAX_RT或TX_DS被置高都會在IRQ引腳上引起中斷(低電平有效,重寫status暫存器中的對應位可清除)。在到達最大重傳次數並引發中斷後,在沒有清除MAX_RT之前,任何資料都不能傳送。每次發生MAX_RT中斷,PLOS_CNT計數器都會加1,用於統計丟包數。

7.CE置低以後,裝置進入STANDBY_I狀態。否則TX FIFO緩衝區中的下一個資料載荷將被髮送。如果資料緩衝區空,而CE仍然為高,裝置將進入STANDBY-II模式。

8.如果裝置處於STANDBY-II模式,當CE置低後,裝置將進入STANDBY-I模式。
(STANDBY模式可減少電流的消耗,在該模式下,SPI通訊仍然可以完成)

 

Enhanced ShockBurst™模式下接收資料流程

1.設定config暫存器中的PRIM_RX為1,且置CE為高

2.130us之後,NRF24L01開始監視射頻訊號

3. 當合法的包被接收到(地址匹配),資料被儲存到RX-FIFO緩衝區中,status暫存器中的RX_DR被置高,IRQ引腳同時發出中斷訊號(如果未遮蔽該訊號)。Status暫存器中的RX_P_NO指示這個應該接收該資料的DATA PIPE號。

4.如果自動應答啟用的話,一個應答訊號將被髮出

5.MCU將CE置為低將進入STANDBY-I模式

6.MCU可通過SPI讀出接收到的資料

 

另外:關於24L01組網想說明幾點應注意的地方:

(1)注意地址的分配

文件中明確說明只有通道0具有5個位元組的可配置地址,其他的5個節點都只有1位元組可自由配置地址,

比如可以在接收節點這樣配置:uint const RXADR0[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};   //接收地址

uint const RXADR1[RX_ADR_WIDTH]= {0xc2,0xc2,0xc2,0xc2,0xc1};     //通道1地址

uint const RXADR2[1]= {0xc2};         //通道2地址

uint const RXADR3[1]= {0xc3};         //通道3地址

uint const RXADR4[1]= {0xc4};         //通道4地址

uint const RXADR5[1]= {0xc5};         //通道5地址

然後將各發送節點地址與接收端相應通道地址設定相同即可

(2)接收節點對各發送節點進行區分

這個就是判斷狀態暫存器的1-3位即可達到區分的目的

 

//---------------------------------------------------------------------------------------------------------------------------------------