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位即可達到區分的目的
//---------------------------------------------------------------------------------------------------------------------------------------