要想24L01多通道通訊成功,務必先單通道調試成功,並且懂得這塊芯片通訊的一些基本知識。
一、基本的通訊條件
1、接收端的接收地址(RX_ADDR_Px)等於發射端的發射送地址(TX_ADDR)
2、收發端的頻道一致(RF_CH)
3、收發端的發射參數一致(RF_SETUP)
2、收發端的頻道一致(RF_CH)
3、收發端的發射參數一致(RF_SETUP)
二、收發模式初始化的基本步驟
Rx端初始化步驟:
1)寫 Rx 節點的地址 RX_ADDR_Px
2)使能 AUTO ACK EN_AA
3)使能通道的接收地址 EN_RXADDR
4)選擇通信頻率 RF_CH
5 ) 選擇通道有效數據寬度 Rx_Pw_Px
6)配置發射參數(低噪放大器增益、發射功率、無線速率) RF_SETUP
7)配置 24L01 的基本參數以及切換工作模式 CONFIG
1)寫 Rx 節點的地址 RX_ADDR_Px
2)使能 AUTO ACK EN_AA
3)使能通道的接收地址 EN_RXADDR
4)選擇通信頻率 RF_CH
5 ) 選擇通道有效數據寬度 Rx_Pw_Px
6)配置發射參數(低噪放大器增益、發射功率、無線速率) RF_SETUP
7)配置 24L01 的基本參數以及切換工作模式 CONFIG
Tx端初始化步驟:
1)寫 Tx 節點的地址 TX_ADDR
2)寫 RX通道P0 的地址 用ACK應答 RX_ADDR_P0
3)使能自動應答 EN_AA
4)使能通道接收地址 EN_RXADDR
5)配置自動重發次數 SETUP_RETR
6)選擇通信頻率 RF_CH
7)配置發射參數(低噪放大器增益、發射功率、無線速率) RF_SETUP
8 ) 選擇通道有效數據寬度 Rx_Pw_Px
9)配置 24L01 的基本參數以及切換工作模式 CONFIG
1)寫 Tx 節點的地址 TX_ADDR
2)寫 RX通道P0 的地址 用ACK應答 RX_ADDR_P0
3)使能自動應答 EN_AA
4)使能通道接收地址 EN_RXADDR
5)配置自動重發次數 SETUP_RETR
6)選擇通信頻率 RF_CH
7)配置發射參數(低噪放大器增益、發射功率、無線速率) RF_SETUP
8 ) 選擇通道有效數據寬度 Rx_Pw_Px
9)配置 24L01 的基本參數以及切換工作模式 CONFIG
三、多通道通訊關鍵代碼
接收端:
const u8 RX_ADDRESS0[] = {0xff,0xff,0xff,0xff,0x00};//通道0地址
const u8 RX_ADDRESS1[] = {0xff,0xff,0xff,0xff,0x01};//通道1地址
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節點地址
//設置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);
} 1234567891011121314151617181920212223
發送端0:
const u8 TX_ADDRESS0[TX_ADR_WIDTH]={0xff,0xff,0xff,0xff,0x00}; //發送地址
//**發送端0初始化代碼,使用通道0進行通訊:**
//設置TX地址,寫TX數據寬度,設置RX自動應答的地址,填充TX發送數據,選擇RF頻道
void NRF24L01_TX_Mode(void)
{
NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS0,TX_ADR_WIDTH);//寫TX節點地址
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)TX_ADDRESS0,RX_ADR_WIDTH); //設置RX_ADDR_P0的地址,為了使能ACK
{
NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS0,TX_ADR_WIDTH);//寫TX節點地址
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)TX_ADDRESS0,RX_ADR_WIDTH); //設置RX_ADDR_P0的地址,為了使能ACK
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f); //使能所有通道自動應答
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f); //使能所有通道的接收地址
NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//設置自動重發間隔時間:500us + 86us;最大自動重發次數:10次
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //設置RF通道為40
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); //配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
NRF24L01_CE=1;//CE為高,10us后啟動發送
delay_us(10);
}123456789101112131415161718192021
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f); //使能所有通道的接收地址
NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//設置自動重發間隔時間:500us + 86us;最大自動重發次數:10次
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //設置RF通道為40
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); //配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
NRF24L01_CE=1;//CE為高,10us后啟動發送
delay_us(10);
}123456789101112131415161718192021
發送端1:
const u8 TX_ADDRESS1[TX_ADR_WIDTH]={0xff,0xff,0xff,0xff,0x01}; //發送地址
//**發送端1初始化代碼,使用通道1進行通訊:**
//設置TX地址,寫TX數據寬度,設置RX自動應答的地址,填充TX發送數據,選擇RF頻道
//設置TX地址,寫TX數據寬度,設置RX自動應答的地址,填充TX發送數據,選擇RF頻道
void NRF24L01_TX_Mode(void)
{
NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS1,TX_ADR_WIDTH);//寫TX節點地址
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)TX_ADDRESS1,RX_ADR_WIDTH); //設置RX_ADDR_P0的地址,為了使能ACK
{
NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS1,TX_ADR_WIDTH);//寫TX節點地址
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)TX_ADDRESS1,RX_ADR_WIDTH); //設置RX_ADDR_P0的地址,為了使能ACK
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f); //使能所有通道的自動應答
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f); //使能所有通道的接收地址
NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//設置自動重發間隔時間:500us + 86us;最大自動重發次數:10次
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //設置RF通道為40
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); //配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
NRF24L01_CE=1;//CE為高,10us后啟動發送
delay_us(10);
}1234567891011121314151617181920
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f); //使能所有通道的接收地址
NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//設置自動重發間隔時間:500us + 86us;最大自動重發次數:10次
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //設置RF通道為40
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); //配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
NRF24L01_CE=1;//CE為高,10us后啟動發送
delay_us(10);
}1234567891011121314151617181920
四、多通道通訊關鍵點
1、發送端數據通道0被用做接收應答信號,因此不同通道發射端都要必須使能RX_ADDR_P0,因此需要把發送端地址寫入里面。(當然除非關掉應答)
2、使能第N個的通道,前N個通道也必須被使能。
3、2~5通道與通道1共用高32位(4字節)地址,只有低8位(1字節)可以改變,且絕不能一樣,如下:
2、使能第N個的通道,前N個通道也必須被使能。
3、2~5通道與通道1共用高32位(4字節)地址,只有低8位(1字節)可以改變,且絕不能一樣,如下:
const u8 RX_ADDRESS0[] = {0xff,0xff,0xff,0xff,0x00};//通道0地址
const u8 RX_ADDRESS1[] = {0xff,0xff,0xff,0xff,0x01};//通道1地址
const u8 RX_ADDRESS2[] = {0x02,0xff,0xff,0xff,0x01};//通道2地址
const u8 RX_ADDRESS3[] = {0x03,0xff,0xff,0xff,0x01};//通道3地址
const u8 RX_ADDRESS4[] = {0x04,0xff,0xff,0xff,0x01};//通道4地址
const u8 RX_ADDRESS5[] = {0x05,0xff,0xff,0xff,0x01};//通道5地址123456
const u8 RX_ADDRESS1[] = {0xff,0xff,0xff,0xff,0x01};//通道1地址
const u8 RX_ADDRESS2[] = {0x02,0xff,0xff,0xff,0x01};//通道2地址
const u8 RX_ADDRESS3[] = {0x03,0xff,0xff,0xff,0x01};//通道3地址
const u8 RX_ADDRESS4[] = {0x04,0xff,0xff,0xff,0x01};//通道4地址
const u8 RX_ADDRESS5[] = {0x05,0xff,0xff,0xff,0x01};//通道5地址123456
PS:如果地址寬度是2(16位),那么高8位(1字節)共用,低8位(1字節)不同。
4、接收端寫各通道地址時候,必須先從低通道(通道0開始)開始寫,使能地址寬度也是。
NRF24L01作為一塊低價格、入門級無線通訊芯片,自身限制還是挺多的,穩定組網還是有一定的難度,還不夠成熟於物聯網領域,做點小作品還是可以的。
NRF24L01模塊----6通道通訊測試
---------------------
作者:愛面條的可達
來源:CSDN
原文:https://blog.csdn.net/haha1fan/article/details/78843080
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!