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

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