定義通道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