nRF24L01是由NORDIC生產的工作在2.4GHz~2.5GHz的ISM 頻段的單片無線收發器芯片。無線收發器包括:頻率發生器、增強型“SchockBurst”模式控制器、功率放大器、晶體振蕩器、調制器和解調器。
nrf24l01性能參數
小體積,QFN20 4x4mm封裝
寬電壓工作范圍,1.9V~3.6V,輸入引腳可承受5V電壓輸入
工作溫度范圍,-40℃~+80℃
工作頻率范圍,2.400GHz~2.525GHz
發射功率可選擇為0dBm、-6dBm、-12dBm和-18dBm
數據傳輸速率支持1Mbps、2Mbps
低功耗設計,接收時工作電流12.3mA,0dBm功率發射時11.3mA,掉電模式時僅為900nA
126個通訊通道,6個數據通道,滿足多點通訊和調頻需要
增強型“ShockBurst”工作模式,硬件的CRC校驗和點對多點的地址控制
數據包每次可傳輸1~32Byte的數據
4線SPI通訊端口,通訊速率最高可達8Mbps,適合與各種MCU連接,編程簡單
可通過軟件設置工作頻率、通訊地址、傳輸速率和數據包長度
MCU可通過IRQ引腳塊判斷是否完成數據接收和數據發送
nRF24L01原理圖
nrf24l01與51單片機的連接圖及程序
1、NRF24L01
2、NRF24L01 管腳功能
nRF24L01與5V單片機的連接(只適用于高阻口)
3、51單片機的I/O口輸出為5V,而NRF24L01的電源輸入為1.9—3.6V,如果直接接入單片機的電源會燒壞模塊,因而要對單片機的電源接口進行壓降,這里我選用二極管進行壓降,二極管型號為IN4001. 這一步完成之后就可以把引腳用杜邦線連接到單片機的I/O口,定義管腳就可以開始編程了。
4、要用NRF24L01進行通信首先知道它的發送和接收流程
發送流程:
① MCU通過SPI對NRF24L01進行基本配置,,配置自動應答通道使能,設置自動重發次數不為0(在此設置可以重發數據包)設置為發送模式,還有其他配置等等
② MCU把要發送的數據和接收數據設備的地址通過SPI寫入NRF24L01
③ CE引腳置高,啟動發送
④ 此時有兩種情況:
1.在有限時間內收到應答信號,則TX_DS置高(發送數據成功標志位),并引發IRQ中斷(引腳IRQ置低),并清除TX BUf(此為發送緩沖寄存器,自行寫代碼清除),IRQ中斷需要寫狀態寄存器進行復位(因為此處IRQ由TX_DS引發,將TX_DS復位即可使IRQ復位)
2.重發數據次數超過設定值,則MAX_RT置高(達到最多重發次數標志位),并引發IRQ中斷(引腳IRQ置低),不清除TX BUf,IRQ中斷需要寫狀態寄存器進行復位(因為此處IRQ由MAX_RT引發,將MAX_RT復位即可使IRQ復位)
⑤ 接收到應答信號產生中斷或者達到最大重發次數產生中斷后,NRF24L01繼續發下一包數據。
⑥ 當TX BUf為空時,進入待機模式二(當CE為高,TX BUf為空時,進入待機模式二;NRF24L01的工作模式圖表在最后,工作模式不需過多理會,只要在適當時候拉高CE進行發送即可,配置NRF24L01時CE置低)
接收流程:
① 與發送模式一樣,一開始MCU通過SPI對NRF24L01進行基本配置,設置數據通道自動應答使能(在EN_AA寄存器進行設置,即收到數據后,向主機發送應答信號)還有進行接收數據通道使能(在EN_RXADDR寄存器配置,即選擇六個接收通道的某一通道來接收數據,設置為接收模式,還有其他等配置。
② 拉高CE引腳(CE置高),啟動接收狀態
③ 接收到一個有效數據包后,數據存儲在RX BUf,并產生RX_DR中斷(RX_DR為接收數據成功標志位,接收成功置1),中斷和發送模式一樣,同樣需要復位。
④ 接收設備自動向發送設備發送確認信號(無需自己寫代碼)
⑤ 設置CE引腳為低,NRF24L01進入待機模式一
⑥ MCU通過SPI讀取NRF24L01收到的數據
總結為:
發送過程:
a. MCU通過SPI對NRF24L01進行基本配置,配置好NRF24L01
b. MCU將要發送的數據與接收數據設備的地址寫入NRF24L01
c. CE引腳置高,啟動發送
接收過程:
a. MCU通過SPI對NRF24L01進行基本配置,配置好NRF24L01
b. CE引腳置高,啟動接收
c. MCU對 NRF24L01進行數據讀取
5、我們在使用NRF24L01的時候有一個頭文件,是關于NRF24L01的寄存器定義和相關函數的編寫,這個文檔網上有很多,我們只需要按照它的發送和接受流程調用相關函數配置寄存器就可以了。
//===================================================================================
// 主 程 序 開 始
//===================================================================================
void main(void)
{
uchar i = 0;
uchar j = 0;
uchar a,b;
unsigned char TxBuf[12] ={2,3,1,4,0,3,1,3,0,2,1,1};
unsigned char RxBuf[12] ;
LCD_init();
init_NRF24L01();
SPI_Read_Buf(RX_ADDR_P0,RxBuf,5);
Delay(100);
SetRX_Mode();
lcd2004_pos(0,4);
dat(‘T’); dat(‘X’);
dat(‘ ’);
dat(‘ ’);
dat(‘T’);
dat(‘E’);
dat(‘X’);
dat(‘T’);
dat(‘。’);
dat(‘。’);
dat(‘。’);
status = SPI_Read(STATUS);
a=status / 10;
b=status % 10;
lcd2004_pos(1,0);
dat(‘S’);
dat(‘T’);
dat(‘A’);
dat(‘:’);
dat(0x30+a);
dat(0x30+b);
fifo = SPI_Read(FIFO_STATUS);
a=fifo / 10;
b=fifo % 10;
lcd2004_pos(1,8);
dat(‘F’); dat(‘I’);
dat(‘F’);
dat(‘O’);
dat(‘:’);
dat(0x30+a);
dat(0x30+b);
while(1)
{
//===================================================================================
// 發 送 程 序
//===================================================================================
SPI_RW_Reg(WRITE_REG+STATUS,0xFF);
SPI_Write_Buf(WR_TX_PLOAD,TxBuf,TX_PLOAD_WIDTH);
nRF24L01_TxPacket(TxBuf);
status = SPI_Read(STATUS);
a=status / 10;
b=status % 10;
lcd2004_pos(1,0);
dat(‘S’);
dat(‘T’);
dat(‘A’);
dat(‘:’);
dat(0x30+a);
dat(0x30+b);
fifo = SPI_Read(FIFO_STATUS);
a=fifo / 10;
b=fifo % 10;
lcd2004_pos(1,8);
dat(‘F’);
dat(‘I’);
dat(‘F’);
dat(‘O’);
dat(‘:’);
dat(0x30+a);
dat(0x30+b);
SPI_RW_Reg(WRITE_REG+STATUS,0xFF);
//==================================================================================
// 接 收 程 序
//==================================================================================
lcd2004_pos(0,0);
dat(‘R’);dat(‘X’);dat(‘。’);dat(‘。’);dat(‘。’);
j = SPI_Read(CD);
lcd2004_pos(0,6);
dat(‘C’);
dat(‘D’);
dat(‘:’);
lcd2004_pos(0,10);
dat(0x30+j);
Delay(1000);
if(nRF24L01_RxPacket(RxBuf)==1)
{
lcd2004_pos(1,0);
for(i=0;i《12;i++)
{
dat(0X30+RxBuf[i]);
}
}
這里只是程序的一部分,用到了1602液晶顯示。程序中通過讀取寄存器STATUS、FIFO來判斷發射部分的狀態,如果發射成功,則寄存器的數值就會發生改變。
同理,在接收端,我也讀取了寄存器CD的值。意思大概就是如果接收端收到載波,則寄存器的值就會變成1,如果沒有檢測到任何的載波信號,那么寄存器的值就為0。
通過檢測寄存器的狀態就可以判斷兩個模塊是否正常工作。舉個例子,如果發射端的兩個寄存器的值正常改變,那么說明發生端是正常工作的。再到接收端觀察,如果CD的值始終為0,那么說明接受端的模塊出現問題。就這樣可以縮小排錯的范圍。
正常情況下來說,如果發射和接收都正常的話,通過函數nRF24L01_RxPacket(RxBuf)就可以讀取接收端緩沖區的值,這個數組值的大小與你發送的數組大小一樣。
評論
查看更多