nRF24L01是由NORDIC生產(chǎn)的工作在2.4GHz~2.5GHz的ISM 頻段的單片無線收發(fā)器芯片。無線收發(fā)器包括:頻率發(fā)生器、增強(qiáng)型“SchockBurst”模式控制器、功率放大器、晶體振蕩器、調(diào)制器和解調(diào)器。
nrf24l01性能參數(shù)
小體積,QFN20 4x4mm封裝
寬電壓工作范圍,1.9V~3.6V,輸入引腳可承受5V電壓輸入
工作溫度范圍,-40℃~+80℃
工作頻率范圍,2.400GHz~2.525GHz
發(fā)射功率可選擇為0dBm、-6dBm、-12dBm和-18dBm
數(shù)據(jù)傳輸速率支持1Mbps、2Mbps
低功耗設(shè)計(jì),接收時(shí)工作電流12.3mA,0dBm功率發(fā)射時(shí)11.3mA,掉電模式時(shí)僅為900nA
126個(gè)通訊通道,6個(gè)數(shù)據(jù)通道,滿足多點(diǎn)通訊和調(diào)頻需要
增強(qiáng)型“ShockBurst”工作模式,硬件的CRC校驗(yàn)和點(diǎn)對多點(diǎn)的地址控制
數(shù)據(jù)包每次可傳輸1~32Byte的數(shù)據(jù)
4線SPI通訊端口,通訊速率最高可達(dá)8Mbps,適合與各種MCU連接,編程簡單
可通過軟件設(shè)置工作頻率、通訊地址、傳輸速率和數(shù)據(jù)包長度
MCU可通過IRQ引腳塊判斷是否完成數(shù)據(jù)接收和數(shù)據(jù)發(fā)送
nRF24L01原理圖
nrf24l01與51單片機(jī)的連接圖及程序
1、NRF24L01
2、NRF24L01 管腳功能
![nrf24l01與51單片機(jī)的連接圖及程序](/uploads/allimg/171114/2755780-1G1141531233a.jpg)
nRF24L01與5V單片機(jī)的連接(只適用于高阻口)
3、51單片機(jī)的I/O口輸出為5V,而NRF24L01的電源輸入為1.9—3.6V,如果直接接入單片機(jī)的電源會(huì)燒壞模塊,因而要對單片機(jī)的電源接口進(jìn)行壓降,這里我選用二極管進(jìn)行壓降,二極管型號為IN4001. 這一步完成之后就可以把引腳用杜邦線連接到單片機(jī)的I/O口,定義管腳就可以開始編程了。
4、要用NRF24L01進(jìn)行通信首先知道它的發(fā)送和接收流程
發(fā)送流程:
?、?MCU通過SPI對NRF24L01進(jìn)行基本配置,,配置自動(dòng)應(yīng)答通道使能,設(shè)置自動(dòng)重發(fā)次數(shù)不為0(在此設(shè)置可以重發(fā)數(shù)據(jù)包)設(shè)置為發(fā)送模式,還有其他配置等等
?、?MCU把要發(fā)送的數(shù)據(jù)和接收數(shù)據(jù)設(shè)備的地址通過SPI寫入NRF24L01
③ CE引腳置高,啟動(dòng)發(fā)送
?、?此時(shí)有兩種情況:
1.在有限時(shí)間內(nèi)收到應(yīng)答信號,則TX_DS置高(發(fā)送數(shù)據(jù)成功標(biāo)志位),并引發(fā)IRQ中斷(引腳IRQ置低),并清除TX BUf(此為發(fā)送緩沖寄存器,自行寫代碼清除),IRQ中斷需要寫狀態(tài)寄存器進(jìn)行復(fù)位(因?yàn)榇颂嶪RQ由TX_DS引發(fā),將TX_DS復(fù)位即可使IRQ復(fù)位)
2.重發(fā)數(shù)據(jù)次數(shù)超過設(shè)定值,則MAX_RT置高(達(dá)到最多重發(fā)次數(shù)標(biāo)志位),并引發(fā)IRQ中斷(引腳IRQ置低),不清除TX BUf,IRQ中斷需要寫狀態(tài)寄存器進(jìn)行復(fù)位(因?yàn)榇颂嶪RQ由MAX_RT引發(fā),將MAX_RT復(fù)位即可使IRQ復(fù)位)
?、?接收到應(yīng)答信號產(chǎn)生中斷或者達(dá)到最大重發(fā)次數(shù)產(chǎn)生中斷后,NRF24L01繼續(xù)發(fā)下一包數(shù)據(jù)。
?、?當(dāng)TX BUf為空時(shí),進(jìn)入待機(jī)模式二(當(dāng)CE為高,TX BUf為空時(shí),進(jìn)入待機(jī)模式二;NRF24L01的工作模式圖表在最后,工作模式不需過多理會(huì),只要在適當(dāng)時(shí)候拉高CE進(jìn)行發(fā)送即可,配置NRF24L01時(shí)CE置低)
接收流程:
① 與發(fā)送模式一樣,一開始MCU通過SPI對NRF24L01進(jìn)行基本配置,設(shè)置數(shù)據(jù)通道自動(dòng)應(yīng)答使能(在EN_AA寄存器進(jìn)行設(shè)置,即收到數(shù)據(jù)后,向主機(jī)發(fā)送應(yīng)答信號)還有進(jìn)行接收數(shù)據(jù)通道使能(在EN_RXADDR寄存器配置,即選擇六個(gè)接收通道的某一通道來接收數(shù)據(jù),設(shè)置為接收模式,還有其他等配置。
?、?拉高CE引腳(CE置高),啟動(dòng)接收狀態(tài)
③ 接收到一個(gè)有效數(shù)據(jù)包后,數(shù)據(jù)存儲(chǔ)在RX BUf,并產(chǎn)生RX_DR中斷(RX_DR為接收數(shù)據(jù)成功標(biāo)志位,接收成功置1),中斷和發(fā)送模式一樣,同樣需要復(fù)位。
?、?接收設(shè)備自動(dòng)向發(fā)送設(shè)備發(fā)送確認(rèn)信號(無需自己寫代碼)
⑤ 設(shè)置CE引腳為低,NRF24L01進(jìn)入待機(jī)模式一
?、?MCU通過SPI讀取NRF24L01收到的數(shù)據(jù)
總結(jié)為:
發(fā)送過程:
a. MCU通過SPI對NRF24L01進(jìn)行基本配置,配置好NRF24L01
b. MCU將要發(fā)送的數(shù)據(jù)與接收數(shù)據(jù)設(shè)備的地址寫入NRF24L01
c. CE引腳置高,啟動(dòng)發(fā)送
接收過程:
a. MCU通過SPI對NRF24L01進(jìn)行基本配置,配置好NRF24L01
b. CE引腳置高,啟動(dòng)接收
c. MCU對 NRF24L01進(jìn)行數(shù)據(jù)讀取
5、我們在使用NRF24L01的時(shí)候有一個(gè)頭文件,是關(guān)于NRF24L01的寄存器定義和相關(guān)函數(shù)的編寫,這個(gè)文檔網(wǎng)上有很多,我們只需要按照它的發(fā)送和接受流程調(diào)用相關(guān)函數(shù)配置寄存器就可以了。
//===================================================================================
// 主 程 序 開 始
//===================================================================================
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)
{
//===================================================================================
// 發(fā) 送 程 序
//===================================================================================
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來判斷發(fā)射部分的狀態(tài),如果發(fā)射成功,則寄存器的數(shù)值就會(huì)發(fā)生改變。
同理,在接收端,我也讀取了寄存器CD的值。意思大概就是如果接收端收到載波,則寄存器的值就會(huì)變成1,如果沒有檢測到任何的載波信號,那么寄存器的值就為0。
通過檢測寄存器的狀態(tài)就可以判斷兩個(gè)模塊是否正常工作。舉個(gè)例子,如果發(fā)射端的兩個(gè)寄存器的值正常改變,那么說明發(fā)生端是正常工作的。再到接收端觀察,如果CD的值始終為0,那么說明接受端的模塊出現(xiàn)問題。就這樣可以縮小排錯(cuò)的范圍。
正常情況下來說,如果發(fā)射和接收都正常的話,通過函數(shù)nRF24L01_RxPacket(RxBuf)就可以讀取接收端緩沖區(qū)的值,這個(gè)數(shù)組值的大小與你發(fā)送的數(shù)組大小一樣。
評論