基本介紹
nRF2401 (最新版本為nRF2401A,nRF2401AG為無鉛工藝版本)是由Nordic公司出品的單晶片無線收發晶片,工作於2.4GHz~2.5GHz的全球免申請(ISM)頻率。晶片包括一個完全集成的頻率合成器,功率放大器,晶體振盪器和調製器。發射功率和工作頻率等工作參數可以很容易的通過3線SPI連線埠完成。極低的電流消耗,在-5dBm的輸出功率時僅為10.5mA,在接收模式時僅為18mA。掉電模式可以很容易的實現低功耗需求。
性能參數
◆小體積,QFN24 5x5mm封裝
◆寬電壓工作範圍,1.9V~3.6V
◆工作溫度範圍,-40℃~+80℃
◆工作頻率範圍,2.400GHz~2.524GHz
◆數據傳輸速率,250Kbps、1Mbps
◆低功耗設計,接收時工作電流18mA,0dBm功率發射時13mA,掉電模式時僅為400uA
◆多通道工作模式,125個數據通道,通道切換時間≤200us,滿足多點通訊和調頻需要
◆硬體的CRC校驗和點對多點的地址控制
◆SPI通訊連線埠,適合與各種MCU連線,編程簡單
◆可通過軟體設定工作頻率、通訊地址、傳輸速率和數據包長度
◆MCU可通過接收完成引腳快判斷是否完成數據接收
兼容性
nRF2401是nRF2401A的早期型號,nRF2401AG是無鉛工藝型號。它們完全兼容,硬體可直接替換,代碼也可相互使用。
原理圖
電路原理
nRF2401電路原理圖
引腳定義
nRF2401引腳定義
接線圖
nRF2401與5V單片機的連線(只適用於高阻口)
晶片結構
nRF2401內置地址解碼器、先入後出堆疊區、解調處理器、時鐘處理器、GFSK濾波器、低噪聲放大器、頻率合成器,功率放大器等功能模組,需要很少的外圍元件,因此使用起來非常方便。QFN24引腳封裝,外形尺寸只有5×5mm。
工作模式
nRF2401有工作模式有四種:收發模式、配置模式、空閒模式和關機模式。nRF2401的工作模式由PWR_UP 、CE、CS三個引腳決定。
收發模式
nRF2401的收發模式有ShockBurstTM收發模式和直接收發模式兩種,收發模式由器件配置字決定,具體配置將在器件配置部分詳細介紹。
ShockBurstTM收發模式
ShockBurstTM收發模式下,使用片內的先入先出堆疊區,數據低速從微控制器送入,但高速(1Mbps)發射,這樣可以儘量節能,因此,使用低速的微控制器也能得到很高的射頻數據發射速率。與射頻協定相關的所有高速信號處理都在片內進行,這種做法有三大好處:儘量節能;低的系統費用(低速微處理器也能進行高速射頻發射);數據在空中停留時間短,抗干擾性高。nRF2401的ShockBurstTM技術同時也減小了整個系統的平均工作電流。
在ShockBurstTM收發模式下,nRF2401自動處理字頭和CRC校驗碼。在接收數據時,自動把字頭和CRC校驗碼移去。在傳送數據時,自動加上字頭和CRC校驗碼,當傳送過程完成後,數據準備好引腳通知微處理器數據發射完畢。
ShockBurstTM發射流程
接口引腳為CE,CLK1,DATA
A. 當微控制器有數據要傳送時,其把CE置高,使nRF2401工作;
B. 把接收機的地址和要傳送的數據按時序送入nRF2401;
C. 微控制器把CE置低,激發nRF2401進行ShockBurstTM發射;
D. nRF2401的ShockBurstTM發射
給射頻前端供電;
射頻數據打包(加字頭、CRC校驗碼);
高速發射數據包;
發射完成,nRF2401進入空閒狀態。
ShockBurstTM接收流程
接口引腳CE、DR1、CLK1和DATA(接收通道1)
A. 配置本機地址和要接收的數據包大小;
B. 進入接收狀態,把CE置高;
C. 200us後,nRF2401進入監視狀態,等待數據包的到來;
D. 當接收到正確的數據包(正確的地址和CRC校驗碼),nRF2401自動把字頭、地址和CRC校驗位移去;
E. nRF2401通過把DR1(這個引腳一般引起微控制器中斷)置高通知微控制器;
F. 微控制器把數據從nRF2401移出;
G. 所有數據移完,nRF2401把DR1置低,此時,如果CE為高,則等待下一個數據包,如果CE為低,開始其它工作流程。
直接收發模式
在直接收發模式下,nRF2401如傳統的射頻收發器一樣工作。
直接傳送模式
接口引腳為CE、DATA
A. 當微控制器有數據要傳送時,把CE置高;
B. nRF2401射頻前端被激活;
C. 所有的射頻協定必須在微控制器程式中進行處理(包括字頭、地址和CRC校驗碼)。
直接接收模式
接口引腳為CE、CLK1和DATA
A. 一旦nRF2401被配置為直接接收模式,DATA引腳將根據天線接收到的信號開始高低變化(由於噪聲的存在);
B. CLK1引腳也開始工作;
C. 一旦接收到有效的字頭,CLK1引腳和DATA引腳將協調工作,把射頻數據包以其被發射時的數據從DATA引腳送給微控制器;
D. 這頭必須是8位;
E. DR引腳沒用上,所有的地址和CRC校驗必須在微控制器內部進行。
配置模式
在配置模式,15位元組的配置字被送到nRF2401,這通過CS、CLK1和DATA三個引腳完成,具體的配置方法請參考本文的器件配置部分。
空閒模式
nRF2401的空閒模式是為了減小平均工作電流而設計,其最大的優點是,實現節能的同時,縮短晶片的起動時間。在空閒模式下,部分片內晶振仍在工作,此時的工作電流跟外部晶振的頻率有關,如外部晶振為4MHz時工作電流為12uA,外部晶振為16MHz時工作電流為32uA。在空閒模式下,配置字的內容保持在nRF2401片內。
關機模式
在關機模式下,為了得到最小的工作電流,一般此時的工作電流小於1uA。關機模式下,配置字的內容也會被保持在nRF2401片內,這是該模式與斷電狀態最大的區別。
器件配置
nRF2401的所有配置工作都是通過CS、CLK1和DATA三個引腳完成,把其配置為ShockBurstTM收發模式需要15位元組的配置字,而如把其配置為直接收發模式只需要2位元組的配置字。由上文對nRF2401工作模式的介紹,我們可以知道,nRF2401一般工作於ShockBurstTM收發模式,這樣,系統的程式編制會更加簡單,並且穩定性也會更高,因此,下文著重介紹把nRF2401配置為ShockBurstTM收發模式的器件配置方法。
ShockBurstTM的配置字使nRF2401能夠處理射頻協定,在配置完成後,在nRF2401工作的過程中,只需改變其最低一個位元組中的內容,以實現接收模式和傳送模式之間切換。ShockBurstTM的配置字可以分為以下四個部分:
數據寬度:聲明射頻數據包中數據占用的位數。這使得nRF2401能夠區分接收數據包中的數據和CRC校驗碼;
地址寬度:聲明射頻數據包中地址占用的位數。這使得nRF2401能夠區分地址和數據;
地址:接收數據的地址,有通道1的地址和通道2的地址;
CRC:使nRF2401能夠生成CRC校驗碼和解碼。
當使用nRF2401片內的CRC技術時,要確保在配置字中CRC校驗被使能,並且傳送和接收使用相同的協定。
在配置模式下,注意保證PWR_UP引腳為高電平,CE引腳為低電平。配置字從最高位開始,依次送入nRF2401。在CS引腳的下降沿,新送入的配置字開始工作。
PCB設計
PCB設計對nRF2401的整體性能影響很大,所以PCB設計在nRF2401收發系統的開發過程中主要的工作之一,在PCB設計時,必須考慮到各種電磁干擾,注意調整電阻、電容和電感的位置,特別要注意電容的位置。
nRF2401的PCB一般都是雙層板,底層一般不放置元件,為地層,頂層的空餘地方一般都敷上銅,這些敷銅通過過孔與底層的地相連。直流電源及電源濾波電容儘量靠近VDD引腳。nRF2401的供電電源應通過電容隔開,這樣有利於給nRF2401提供穩定的電源。在PCB中,儘量多打一些通孔,使頂層和底層的地能夠充分接觸。
nRF2401通過ShockBurstTM收發模式進行無線數據傳送,收發可靠,其外形尺寸小,需要的外圍元器件也少,因此,使用方便,在工業控制、消費電子等各個領域都具有廣闊的套用前景。
參考程式
#include<reg51.h>
//<nRF2401_Pins 對應引腳>
//只需要把自己單片機的I/O 口接上對應
sbit MISO = P1^3;
sbit MOSI = P1^4;
sbit CK = P1^5;
sbit CE = P1^6;
sbit CSN = P3^7;
sbit IRQ = P1^2;
sbit LED2 = P3^5;
sbit LED1 = P3^4;
sbit KEY1 = P3^0;
sbit KEY2 = P3^1;
//SPI(nRF24L01)commands
#define EAD_REG 0x00 //Definereadcommandtoregister
#define ITE_REG 0x20 //Definewritecommandtoregister
#define D_RX_PLOAD 0x61 //DefineRXpayloadregisteraddress
#define LOAD 0xA0 //DefineTXpayloadregisteraddress
#define FLUSH_TX 0xE1 //DefineflushTXregistercommand
#define FLUSH_RX 0xE2 //DefineflushRXregistercommand
#define EUSE_TX_PL 0xE3 //DefinereuseTXpayloadregistercommand
#define Nop0xFF //DefineNoOperation,mightbeusedtoreadstatusregister
//***************************************************//
//SPI(nRF24L01)registers(addresses)
#define CONFIG 0x00 //'Config' registeraddress
#define EN_AA 0x01 //'Enable AutoAcknowledgment'registeraddress
#define EN_RXADDR 0x02 //'Enabled RXaddresses'registeraddress
#define ETUP_AW 0x03 //'Setup addresswidth'registeraddress
#define ETUP_RETR 0x04 //'Setup Auto.Retrans'registeraddress
#define F_CH 0x05 //'RF channel'registeraddress
#define F_SETUP 0x06 //'RF setup'registeraddress
#define ATUS 0x07 //'Status' registeraddress
#define BSERVE_TX 0x08 //'Observe TX'registeraddress
#define CD 0x09 //'Carrier Detect'registeraddress
#define ADDR_P0 0x0A //'RX addresspipe0'registeraddress
#define ADDR_P1 0x0B //'RX addresspipe1'registeraddress
#define ADDR_P2 0x0C //'RX addresspipe2'registeraddress
#define ADDR_P3 0x0D //'RX addresspipe3'registeraddress
#define ADDR_P4 0x0E //'RX addresspipe4'registeraddress
#define ADDR_P5 0x0F //'RX addresspipe5'registeraddress
#define ADDR 0x10 //'TX address'registeraddress
#define 0x11 //'RX payloadwidth,pipe0'registeraddress
#define 1 0x12 //'RX payloadwidth,pipe1'registeraddress
#define 2 0x13 //'RX payloadwidth,pipe2'registeraddress
#define 3 0x14 //'RX payloadwidth,pipe3'registeraddress
#define 4 0x15 //'RX payloadwidth,pipe4'registeraddress
#define 5 0x16 //'RX payloadwidth,pipe5'registeraddress
#define FIFO_STATUS 0x17 //'FIFO StatusRegister'registeraddress
//------------------------------------------------------------// 寫一個位元組到24L01,同時讀出一個位元組
uchar SPI_RW(ucharbyte)
{
uchar ;
for (bit_ctr=0;bit_ctr<8;bit_ctr++) //output8-bit
{
MOSI = (byte&0x80);//output'byte', MSBtoMOSI
byte = (byte<<1);//shiftnextbitintoMSB..
SCK = 1;//SetSCKhigh..
byte |= MISO;//capturecurrentMISObit
SCK = 0;//..then setSCKlowagain
}
return(byte);//returnreadbyte
}
// 向暫存器reg寫一個位元組,同時返回狀態位元組
uchar SPI_RW_Reg(BYTEreg,BYTEvalue)
{
uchar status;
CSN = 0;//CSNlow, initSPItransaction
status = SPI_RW(reg);//selectregister
SPI_RW(value);//..and writevaluetoit..
CSN = 1;//CSNhighagain
return(status);//returnnRF24L01statusbyte
}
// 讀出bytes位元組的數據
uchar SPI_Read_Buf(BYTEreg,BYTE*pBuf,BYTEbytes)
{
uchar status,byte_ctr;
CSN = 0;//SetCSNlow,initSPItranaction
status = SPI_RW(reg);//Selectregistertowritetoandreadstatusbyte
for (byte_ctr=0;byte_ctr<bytes;byte_ctr++)
pBuf[byte_ctr] = SPI_RW(0);//
CSN = 1;
return(status);//returnnRF24L01statusbyte
}
// 寫入bytes位元組的數據
uchar SPI_Write_Buf(BYTEreg,BYTE*pBuf,BYTEbytes)
{
uchar status,byte_ctr;
CSN = 0;
status = SPI_RW(reg);
for (byte_ctr=0;byte_ctr<bytes;byte_ctr++)//
SPI_RW(*pBuf++);
CSN = 1;//SetCSNhighagain
return(status);//
}
// 接收函式,返回1表示有數據收到,否則沒有數據接受到
unsigned char nRF24L01_RxPacket(unsignedchar*rx_buf)
{
unsigned char revale=0;
//setinRXmode
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//SetPWR_UPbit,enableCRC(2bytes)&
Prim:RX.RX_DRenabled..
CE = 1;//SetCEpinhightoenableRXdevice
dalay130us();
sta = SPI_Read(STATUS);//readregisterSTATUS'svalue
if (RX_DR)//ifreceivedataready(RX_DR)interrupt
{
CE = 0;//standbymode
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//readreceivepayloadfrom
RX_FIFObuffer
revale = 1;
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);//clearRX_DRorTX_DSorMAX_RTinterrupt flag
return revale;
}
// 傳送函式
voidn RF24L01_TxPacket(unsignedchar*tx_buf)
{
CE = 0;
//SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);//Writes
TX_AddresstonRF24L01
//SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//
RX_Addr0sameasTX_AdrforAuto.Ack
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);//WritesdatatoTXpayload
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);//SetPWR_UPbit,enableCRC(2bytes)&
Prim:TX.MAX_RT&TX_DSenabled..
CE = 1;
dalay10us();
CE = 0;
}
// 配置函式
void nRF24L01_Config(void)
{
//initialio
CE = 0;//chipenable
CSN = 1;//Spidisable
SCK = 0;//Spiclockline inithigh
CE = 0;
SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//SetPWR_UPbit,enableCRC(2bytes)&
Prim:RX.RX_DRenabled..
SPI_RW_Reg(WRITE_REG+EN_AA,0x01);
SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//EnablePipe0
SPI_RW_Reg(WRITE_REG+SETUP_AW,0x02);//Setupaddresswidth=5bytes
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x1a);//500us+86us,10retrans...
SPI_RW_Reg(WRITE_REG+RF_CH,0);
SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//TX_PWR:0dBm,Datarate:1Mbps,
LNA:HCURR
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);CE=1;//
}
//////////////////第三維編輯/////////////////////////////////////////////////////