nrf2401

nrf2401

單片射頻收發芯片
nRF2401是單片射頻收發芯片,工作于2.4~2.5GHz ISM頻段,芯片内置頻率合成器、功率放大器、晶體振蕩器和調制器等功能模塊,輸出功率和通信頻道可通過程序進行配置。芯片能耗非常低,以-5dBm的功率發射時,工作電流隻有10.5mA,接收時工作電流隻有18mA,多種低功率工作模式,節能設計更方便。其DuoCeiverTM技術使nRF2401可以使用同一天線,同時接收兩個不同頻道的數據。nRF2401适用于多種無線通信的場合,如無線數據傳輸系統、無線鼠标、遙控開鎖、遙控玩具等。[1]
    中文名:單片射頻收發芯片 外文名: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電路原理圖

引腳定義

nRF2401引腳定義

接線圖

nRF2401與5V單片機的連接(隻适用于高阻口)

芯片結構

nRF2401内置地址解碼器、先入後出堆棧區、解調處理器、時鐘處理器、GFSK濾波器、低噪聲放大器、頻率合成器,功率放大器等功能模塊,需要很少的外圍元件,因此使用起來非常方便。QFN24引腳封裝,外形尺寸隻有5×5mm。

收發模式

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

//

//隻需要把自己單片機的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 0xFF //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

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

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

}

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

相關詞條

相關搜索

其它詞條