nrf24L01被設(shè)置為接收模式后,可通過6個不同的數(shù)據(jù)通道(data pipe)接收數(shù)據(jù)。
每個數(shù)據(jù)通道都有一個唯一的地址但是各數(shù)據(jù)通道的頻率是相同的。這意味著可以有6個被配置成發(fā)送狀態(tài)的nRF24L01可以和一個配置成接收狀態(tài)的nRF24L01通信,并且接收方可以區(qū)分(通過判斷狀態(tài)寄存器的1-3位即可達到區(qū)分的目的)。
數(shù)據(jù)通道0有一個唯一的40bit的可設(shè)置的地址。其余的通道1到通道5則地址前32位相同,而后8位不同。所有的數(shù)據(jù)通道都可以實現(xiàn)EnhancedShockBurst模式。
在發(fā)送端,數(shù)據(jù)通道0被用來接收確認信息,因此發(fā)送端的數(shù)據(jù)通道0的地址必須等于發(fā)送地址,這樣才能收到應(yīng)答信息。
當一個24L01發(fā)送結(jié)束后,它會打開接收器并等待確認。如果沒有收到確認,則重發(fā),直到收到確認。當重發(fā)超過一定次數(shù)則發(fā)出中斷并改變狀態(tài)寄存器。重發(fā)次數(shù)的限制在SETUP_RETR_ARC寄存器中設(shè)置。
無論何時收到確認,都會認為上一個數(shù)據(jù)包發(fā)送成功,這個數(shù)據(jù)包將被從發(fā)送緩沖區(qū)清除,并且把TX_DS IRQ置為高。
每次開始spi寫,讀回來的都是狀態(tài)字。
增強型ShockBurst包格式
前置域1byte
地址域3-5byte
包控制域9bit
載荷0-32字節(jié)
CRC1-2字節(jié)
地址域是接收機地址
包控制域
載荷長度6bit
Pid2bit
NO_ACK1bit
載荷長度:6bit說明最多32字節(jié)
Pid:用于包編號,用于確定是重發(fā)包還是新包
NO_ACK:用于表示是否自動應(yīng)答,如為1則表示無需自動應(yīng)答
自動應(yīng)答的延時和重發(fā)次數(shù)是可編程的。
24L01的工作模式和寄存器及IO口的關(guān)系如下
CE引腳的作用
一個ESB(Enhanced ShockBurst)周期,發(fā)送一個字節(jié)連帶收到ACK大約339us
從powerdown狀態(tài)需要先進入standyby狀態(tài),該狀態(tài)轉(zhuǎn)換需要1.5ms延遲,從standyby狀態(tài)進入rx/tx狀態(tài),需要130us
置高CE維持最少10us,啟動Enhanced ShockBurst發(fā)送。
Enhanced ShockBurst™模式下發(fā)送數(shù)據(jù)流程
1.配置config寄存器,將PRIM_RX置為0,表示發(fā)送模式
2. 當需要發(fā)送數(shù)據(jù)時,首先需要配置地址TX_ADDR,這個地址應(yīng)該是接收端地址(即應(yīng)該是接收端6個datapipe地址中的一個即可保證對方收到)。如果要使用自動應(yīng)答,因為應(yīng)答消息由發(fā)送端的datapipe0接收,所以發(fā)送的datapipe0的地址應(yīng)等于TX_ADDR(若是和上一次發(fā)送是相同地址,則可不用重寫地址)。
3.配置數(shù)據(jù)負載長度TX_PLD,將需要發(fā)送的數(shù)據(jù)送入nrf24L01,通過SPI連續(xù)寫入數(shù)據(jù)載荷時,nrf24L01將自動對字節(jié)數(shù)計數(shù)。(數(shù)據(jù)載荷必須在cs為低的時候連續(xù)寫入)
4.將CE置高并維持最少10us,這個脈沖將啟動ShockBurst發(fā)送
5.NRF24L01:
a)打開射頻
b)啟動晶振
c)數(shù)據(jù)打包
d)發(fā)送數(shù)據(jù)
6.如果啟動了自動應(yīng)答(且重傳次數(shù)未達到最大值),NRF24L01將自動轉(zhuǎn)入接收狀態(tài)。
1:若在規(guī)定時間內(nèi)收到了應(yīng)答包,則這是一次成功的發(fā)送,TXFIFO中的數(shù)據(jù)被清除,同時置高status寄存器中的TX_DS位。
2:如果在規(guī)定時間內(nèi)未收到應(yīng)答包則自動重傳(當啟用自動重傳時,由SETUP_RETR寄存器中的ARC位指定重傳次數(shù))。
3:當重傳次數(shù)到達最大值依然沒有收到應(yīng)答,則status寄存器中的MAX_RT被置高,TXFIFO緩沖區(qū)中的數(shù)據(jù)并不被移除。
MAX_RT或TX_DS被置高都會在IRQ引腳上引起中斷(低電平有效,重寫status寄存器中的對應(yīng)位可清除)。在到達最大重傳次數(shù)并引發(fā)中斷后,在沒有清除MAX_RT之前,任何數(shù)據(jù)都不能發(fā)送。每次發(fā)生MAX_RT中斷,PLOS_CNT計數(shù)器都會加1,用于統(tǒng)計丟包數(shù)。
7.CE置低以后,設(shè)備進入STANDBY_I狀態(tài)。否則TXFIFO緩沖區(qū)中的下一個數(shù)據(jù)載荷將被發(fā)送。如果數(shù)據(jù)緩沖區(qū)空,而CE仍然為高,設(shè)備將進入STANDBY-II模式。
8.如果設(shè)備處于STANDBY-II模式,當CE置低后,設(shè)備將進入STANDBY-I模式。
(STANDBY模式可減少電流的消耗,在該模式下,SPI通信仍然可以完成)
Enhanced ShockBurst™模式下接收數(shù)據(jù)流程
1.設(shè)置config寄存器中的PRIM_RX為1,且置CE為高
2.130us之后,NRF24L01開始監(jiān)視射頻信號
3. 當合法的包被接收到(地址匹配),數(shù)據(jù)被存儲到RX-FIFO緩沖區(qū)中,status寄存器中的RX_DR被置高,IRQ引腳同時發(fā)出中斷信號(如果未屏蔽該信號)。Status寄存器中的RX_P_NO指示這個應(yīng)該接收該數(shù)據(jù)的DATAPIPE號。
4.如果自動應(yīng)答啟用的話,一個應(yīng)答信號將被發(fā)出
5.MCU將CE置為低將進入STANDBY-I模式
6.MCU可通過SPI讀出接收到的數(shù)據(jù)
另外:關(guān)于24L01組網(wǎng)想說明幾點應(yīng)注意的地方:
(1)注意地址的分配
文檔中明確說明只有通道0具有5個字節(jié)的可配置地址,其他的5個節(jié)點都只有1字節(jié)可自由配置地址,
比如可以在接收節(jié)點這樣配置: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地址
然后將各發(fā)送節(jié)點地址與接收端相應(yīng)通道地址設(shè)置相同即可
(2)接收節(jié)點對各發(fā)送節(jié)點進行區(qū)分
這個就是判斷狀態(tài)寄存器的1-3位即可達到區(qū)分的目的
|