nrf24L01被設置為接收模式后,可通過6個不同的數據通道(data pipe)接收數據。
每個數據通道都有一個唯一的地址但是各數據通道的頻率是相同的。這意味著可以有6個被配置成發送狀態的nRF24L01可以和一個配置成接收狀態的nRF24L01通信,并且接收方可以區分(通過判斷狀態寄存器的1-3位即可達到區分的目的)。
數據通道0有一個唯一的40bit的可設置的地址。其余的通道1到通道5則地址前32位相同,而后8位不同。所有的數據通道都可以實現EnhancedShockBurst模式。
在發送端,數據通道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個datapipe地址中的一個即可保證對方收到)。如果要使用自動應答,因為應答消息由發送端的datapipe0接收,所以發送的datapipe0的地址應等于TX_ADDR(若是和上一次發送是相同地址,則可不用重寫地址)。
3.配置數據負載長度TX_PLD,將需要發送的數據送入nrf24L01,通過SPI連續寫入數據載荷時,nrf24L01將自動對字節數計數。(數據載荷必須在cs為低的時候連續寫入)
4.將CE置高并維持最少10us,這個脈沖將啟動ShockBurst發送
5.NRF24L01:
a)打開射頻
b)啟動晶振
c)數據打包
d)發送數據
6.如果啟動了自動應答(且重傳次數未達到最大值),NRF24L01將自動轉入接收狀態。
1:若在規定時間內收到了應答包,則這是一次成功的發送,TXFIFO中的數據被清除,同時置高status寄存器中的TX_DS位。
2:如果在規定時間內未收到應答包則自動重傳(當啟用自動重傳時,由SETUP_RETR寄存器中的ARC位指定重傳次數)。
3:當重傳次數到達最大值依然沒有收到應答,則status寄存器中的MAX_RT被置高,TXFIFO緩沖區中的數據并不被移除。
MAX_RT或TX_DS被置高都會在IRQ引腳上引起中斷(低電平有效,重寫status寄存器中的對應位可清除)。在到達最大重傳次數并引發中斷后,在沒有清除MAX_RT之前,任何數據都不能發送。每次發生MAX_RT中斷,PLOS_CNT計數器都會加1,用于統計丟包數。
7.CE置低以后,設備進入STANDBY_I狀態。否則TXFIFO緩沖區中的下一個數據載荷將被發送。如果數據緩沖區空,而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指示這個應該接收該數據的DATAPIPE號。
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位即可達到區分的目的
|