nrf2401

nRF2401是單片射頻收發晶片,工作於2.4~2.5GHz ISM頻段,晶片內置頻率合成器、功率放大器、晶體振盪器和調製器等功能模組,輸出功率和通信頻道可通過程式進行配置。晶片能耗非常低,以-5dBm的功率發射時,工作電流只有10.5mA,接收時工作電流只有18mA,多種低功率工作模式,節能設計更方便。其DuoCeiverTM技術使nRF2401可以使用同一天線,同時接收兩個不同頻道的數據。nRF2401適用於多種無線通信的場合,如無線數據傳輸系統、無線滑鼠、遙控開鎖、遙控玩具等。

基本介紹

nrf2401 nrf2401

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原理圖

引腳定義

nRF2401引腳定義

nrf2401 nrf2401

接線圖

nRF2401與5V單片機的連線(只適用於高阻口)

nRF2401接線圖 nRF2401接線圖

晶片結構

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;//

}

//////////////////第三維編輯/////////////////////////////////////////////////////

相關詞條

相關搜尋

熱門詞條

聯絡我們