NRF2401P 多通道通訊

定義通道0-5的地址

明確通信機制
接收端:確認收到數據後,記錄地址,並以此地址爲目標地址發送應答信號。

官方文檔的6個通道提供了1收6發的功能。NRF24L01之所以能夠進行多對一通信是因爲:一個NRF24L01具有6個通道,每一個通道都能夠接收信息。

對於其他的6個發送端T1,T2,T3,T4,T5,T6,我們只需將他們的發送地址設置爲對應的接收端的6個通道地址,當然6個發送端的應答信號地址即發送端通道0的地址要和自身的發送地址一致。

發送端T1:
通道0配置:

void NRF24L01_RX0_Mode(void)
{
    NRF24L01_CE=0;    
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS0,RX_ADR_WIDTH);//寫P0的Rx節點地址 
	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);//寫P1的Rx節點地址 不用也要配置
	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P2,(u8*)RX_ADDRESS2,1);//寫P2的Rx節點地址 不用也要配置
	NRF24L01_Write_Reg(FLUSH_RX,0xff);   //清除RX FIFO寄存器                                                                     

    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);    //使能0通道的自動應答    
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能0通道的接收地址   
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);      //設置RF通信頻率       
    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//選擇通道0的有效數據寬度      
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//設置TX發射參數,0db增益,2Mbps,低噪聲增益開啓   
    NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的參數WR_UP,EN_CRC,16BIT_CRC,接收模式 
    NRF24L01_CE = 1; //CE爲高,進入接收模式 
}

發送端T2:
通道1配置:

void NRF24L01_RX1_Mode(void)
{
	NRF24L01_CE=0;    
	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS0,RX_ADR_WIDTH);//寫P0的Rx節點地址 不用也要配置
	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);//寫P1的Rx節點地址 
	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P2,(u8*)RX_ADDRESS2,1);//寫P2的Rx節點地址 不用也要配置
	NRF24L01_Write_Reg(FLUSH_RX,0xff);   //清除RX FIFO寄存器                                                              
	
	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x02);    //使能所有通道的自動應答    
	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x02);//使能所有通道的接收地址   
	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);      //設置RF通信頻率       
	NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);//選擇通道1的有效數據寬度        
	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//設置TX發射參數,0db增益,2Mbps,低噪聲增益開啓   
	NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的參數WR_UP,EN_CRC,16BIT_CRC,接收模式 
	NRF24L01_CE = 1; //CE爲高,進入接收模式 
}

發送端T3:
通道2配置:

void NRF24L01_RX2_Mode(void)
{
	NRF24L01_CE=0;    
	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS0,RX_ADR_WIDTH);//寫P0的Rx節點地址 不用也要配置
	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);//寫P1的Rx節點地址 不用也要配置
	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P2,(u8*)RX_ADDRESS2,1);//寫P2的Rx節點地址 
	NRF24L01_Write_Reg(FLUSH_RX,0xff);         //清除RX FIFO寄存器                                                               
	
	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x04);    //使能所有通道的自動應答    
	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x04);//使能所有通道的接收地址   
	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);      //設置RF通信頻率       
	NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P2,RX_PLOAD_WIDTH);//選擇通道1的有效數據寬度        
	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//設置TX發射參數,0db增益,2Mbps,低噪聲增益開啓   
	NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的參數WR_UP,EN_CRC,16BIT_CRC,接收模式 
	NRF24L01_CE = 1; //CE爲高,進入接收模式 
}

兩個2401的不同通道時可以互相通信的,比如主機上的1通道和從機上的0通道,只要基礎設置都一樣,就可以互相通信。
接收端:

const u8 RX_ADDRESS0[] = {0xff,0xff,0xff,0xff,0x00};//通道0地址
const u8 RX_ADDRESS1[] = {0xff,0xff,0xff,0xff,0x01};//通道1地址
//使用通道0和1通訊接收模式
//設置RX地址,寫RX數據寬度,選擇RF頻道
//當CE變高後,即進入RX模式,並可以接收數據了
void NRF24L01_RX_Mode(void)
{
    NRF24L01_CE=0;    
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS0,RX_ADR_WIDTH);//寫P0的Rx節點地址
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);//寫P1的Rx節點地址 

    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f);    //使能所有通道的自動應答    
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f);//使能所有通道的接收地址   
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);      //設置RF通信頻率       
    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//選擇通道0的有效數據寬度 
    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);//選擇通道1的有效數據寬度        
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//設置TX發射參數,0db增益,2Mbps,低噪聲增益開啓   
    NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式 
    NRF24L01_CE = 1; //CE爲高,進入接收模式 
    delay_us(130);
} 


//參考2:
void NRF24L01_RX_Mode(void)
{
    NRF24L01_CE=0;  
    /*將六個通道的地址寫進NRF*/  
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS0,RX_ADR_WIDTH);
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P2,(u8*)RX_ADDRESS2,RX_ADR_WIDTH);
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P3,(u8*)RX_ADDRESS3,RX_ADR_WIDTH);
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P4,(u8*)RX_ADDRESS4,RX_ADR_WIDTH);
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P5,(u8*)RX_ADDRESS5,RX_ADR_WIDTH);

    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);  
    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);
    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P2,RX_PLOAD_WIDTH);
    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P3,RX_PLOAD_WIDTH);
    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P4,RX_PLOAD_WIDTH);
    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P5,RX_PLOAD_WIDTH);

  NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f);    
  NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f);  
  NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);             

  NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  
  NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);
  NRF24L01_CE = 1;
}     

#define RX_ADDR_P0  0x0A      //頻道0接收數據地址
#define RX_ADDR_P1  0x0B      //頻道1接收數據地址
#define RX_ADDR_P2  0x0C      //頻道2接收數據地址
#define RX_ADDR_P3  0x0D      //頻道3接收數據地址
#define RX_ADDR_P4  0x0E      //頻道4接收數據地址
#define RX_ADDR_P5  0x0F      //頻道5接收數據地址
#define TX_ADDR     0x10      //發送地址寄存器

注意事項

1、發送端數據通道0被用做接收應答信號,因此不同通道發射端都要必須使能RX_ADDR_P0,因此需要把發送端地址寫入裏面。(當然除非關掉應答)
2、使能第N個​的通道,前N個通道也必須被使能。
3、2~5通道與通道1共用高32位(4字節)地址,只有低8位(1字節)可以改變,且絕不能一樣

參考

http://www.openedv.com/posts/list/52836.htm
https://blog.csdn.net/qq_31530791/article/details/80720102
https://blog.csdn.net/haha1fan/article/details/78843080
https://blog.csdn.net/xiaolong1126626497/article/details/43906877
https://blog.csdn.net/wstz_5461/article/details/76640325

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章