标题：nrf2401
简介
  nRF2401[1]（最新版本为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与5V单片机的连接（只适用于高阻口）
  nRF2401接线图
芯片结构
nRF2401内置地址解码器、先入先出堆栈区、解调处理器、时钟处理器、GFSK滤波器、低噪声放大器、频率合成器，功率放大器等功能模块，需要很少的外围元件，因此使用起来非常方便。QFN24引脚封装，外形尺寸只有5×5mm。
工作模式
nRF2401有工作模式有四种：收发模式、配置模式、空闲模式和关机模式。nRF2401的工作模式由PWR_UP 、CE、TX_EN和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 丠伀伥 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<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;//
}
//////////////////第三维编辑/////////////////////////////////////////////////////