nrf24l01一对一通信.docx
《nrf24l01一对一通信.docx》由会员分享,可在线阅读,更多相关《nrf24l01一对一通信.docx(20页珍藏版)》请在冰豆网上搜索。
nrf24l01一对一通信
发送
#ifndef_API_DEF_
#define_API_DEF_
//DefineinterfacetonRF24L01
//SPI(nRF24L01)commands
#defineREAD_REG0x00//Definereadcommandtoregister
#defineWRITE_REG0x20//Definewritecommandtoregister
#defineRD_RX_PLOAD0x61//DefineRXpayloadregisteraddress
#defineWR_TX_PLOAD0xA0//DefineTXpayloadregisteraddress
#defineFLUSH_TX0xE1//DefineflushTXregistercommand
#defineFLUSH_RX0xE2//DefineflushRXregistercommand
#defineREUSE_TX_PL0xE3//DefinereuseTXpayloadregistercommand
#defineNOP0xFF//DefineNoOperation,mightbeusedtoreadstatusregister
//SPI(nRF24L01)registers(addresses)
#defineCONFIG0x00//'Config'registeraddress
#defineEN_AA0x01//'EnableAutoAcknowledgment'registeraddress
#defineEN_RXADDR0x02//'EnabledRXaddresses'registeraddress
#defineSETUP_AW0x03//'Setupaddresswidth'registeraddress
#defineSETUP_RETR0x04//'SetupAuto.Retrans'registeraddress
#defineRF_CH0x05//'RFchannel'registeraddress
#defineRF_SETUP0x06//'RFsetup'registeraddress
#defineSTATUS0x07//'Status'registeraddress
#defineOBSERVE_TX0x08//'ObserveTX'registeraddress
#defineCD0x09//'CarrierDetect'registeraddress载波检测
#defineRX_ADDR_P00x0A//'RXaddresspipe0'registeraddress
#defineRX_ADDR_P10x0B//'RXaddresspipe1'registeraddress
#defineRX_ADDR_P20x0C//'RXaddresspipe2'registeraddress
#defineRX_ADDR_P30x0D//'RXaddresspipe3'registeraddress
#defineRX_ADDR_P40x0E//'RXaddresspipe4'registeraddress
#defineRX_ADDR_P50x0F//'RXaddresspipe5'registeraddress
#defineTX_ADDR0x10//'TXaddress'registeraddress
#defineRX_PW_P00x11//'RXpayloadwidth,pipe0'registeraddress
#defineRX_PW_P10x12//'RXpayloadwidth,pipe1'registeraddress
#defineRX_PW_P20x13//'RXpayloadwidth,pipe2'registeraddress
#defineRX_PW_P30x14//'RXpayloadwidth,pipe3'registeraddress
#defineRX_PW_P40x15//'RXpayloadwidth,pipe4'registeraddress
#defineRX_PW_P50x16//'RXpayloadwidth,pipe5'registeraddress
#defineFIFO_STATUS0x17//'FIFOStatusRegister'registeraddress
#endif/*_API_DEF_*/
/**********************************************************
NRF24L01无线发送程序
**********************************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
/***************************************************/
#defineTX_ADR_WIDTH5//5字节宽度的发送/接收地址
#defineTX_PLOAD_WIDTH8//数据通道有效数据宽度
ucharcodeTX_ADDRESS[TX_ADR_WIDTH]={0x11,0x13,0x15,0x17,0x19};//定义一个静态发送地址
ucharRX_BUF[TX_PLOAD_WIDTH];//收到的数据就在这里
ucharTX_BUF[TX_PLOAD_WIDTH];//发送的数据就在这里
ucharflag;//接受数据后flag置1,执行相应程序
ucharbdatasta;
//DefineSPIpins
sbitCE=P0^0;//ChipEnablepinsignal(output)
sbitCSN=P0^1;//SlaveSelectpin,(outputtoCSN,nRF24L01)
sbitSCK=P0^2;//MasterOut,SlaveInpin(output)
sbitMOSI=P0^3;//SerialClockpin,(output)
sbitMISO=P0^4;//MasterIn,SlaveOutpin(input)
sbitIRQ=P0^5;//Interruptsignal,fromnRF24L01(input)
sbitRX_DR=sta^6;
sbitTX_DS=sta^5;
sbitMAX_RT=sta^4;
/**************************************************/
/**************************************************/
voidInitNRF24L01(void);
voidSendData(uchar,uchar,uchar,uchar,uchar,uchar,uchar,uchar);
voidDelay1ms(uintz);
ucharSPIRW(ucharbyte);
ucharSPIRead(ucharreg);
ucharSPIRWReg(ucharreg,ucharvalue);
ucharSPIReadBuf(ucharreg,uchar*pBuf,ucharbytes);
ucharSPIWriteBuf(ucharreg,uchar*pBuf,ucharbytes);
ucharCheckACK();
voidRXMode(void);
voidTXMode(uchar*BUF);
/**************************************************
函数:
InitNRF24L01()
描述:
初始化IO
/**************************************************/
voidInitNRF24L01(void)
{
CE=0;//待机
CSN=1;//SPI禁止
SCK=0;//SPI时钟置低
IRQ=1;//中断复位
}
/**************************************************
函数:
SendData()
描述:
发送数据,byte为要发的数据
/**************************************************/
voidSendData(ucharbyte0,ucharbyte1,ucharbyte2,ucharbyte3,ucharbyte4,ucharbyte5,ucharbyte6,ucharbyte7)
{
TX_BUF[0]=byte0;//数据0送到缓存
TX_BUF[1]=byte1;//数据1送到缓存
TX_BUF[2]=byte2;//数据0送到缓存
TX_BUF[3]=byte3;//数据1送到缓存
TX_BUF[4]=byte4;
TX_BUF[5]=byte5;
TX_BUF[6]=byte6;
TX_BUF[7]=byte7;
TXMode(TX_BUF);//把nRF24L01设置为发送模式并发送数据
while(CheckACK());//等待发送完毕,清除TXFIFO
}
/**************************************************
函数:
SPIRW()
描述:
根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01
读出一字节
/**************************************************/
ucharSPIRW(ucharbyte)
{
uchari;
for(i=0;i<8;i++)//循环8次
{
MOSI=(byte&0x80);//byte最高位输出到MOSI
byte<<=1;//低一位移位到最高位
SCK=1;//拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
byte|=MISO;//读MISO到byte最低位
SCK=0;//SCK置低
}
return(byte);//返回读出的一字节
}
/**************************************************
函数:
SPIRWReg()
描述:
写数据value到reg寄存器
/**************************************************/
ucharSPIRWReg(ucharreg,ucharvalue)
{
ucharstatus;
CSN=0;//CSN置低,开始传输数据
status=SPIRW(reg);//选择寄存器,同时返回状态字
SPIRW(value);//然后写数据到该寄存器
CSN=1;//CSN拉高,结束数据传输
return(status);//返回状态寄存器
}
/**************************************************
函数:
SPIRead()
描述:
从reg寄存器读一字节
/**************************************************/
ucharSPIRead(ucharreg)
{
ucharreg_val;
CSN=0;//CSN置低,开始传输数据
SPIRW(reg);//选择寄存器
reg_val=SPIRW(0);//然后从该寄存器读数据
CSN=1;//CSN拉高,结束数据传输
return(reg_val);//返回寄存器数据
}
/**************************************************
函数:
SPIReadBuf()
描述:
从reg寄存器读出bytes个字节,通常用来读取接收通道
数据或接收/发送地址
/**************************************************/
ucharSPIReadBuf(ucharreg,uchar*pBuf,ucharbytes)
{
ucharstatus,i;
CSN=0;//CSN置低,开始传输数据
status=SPIRW(reg);//选择寄存器,同时返回状态字
for(i=0;ipBuf[i]=SPIRW(0);//逐个字节从nRF24L01读出
CSN=1;//CSN拉高,结束数据传输
return(status);//返回状态寄存器
}
/**************************************************
函数:
SPIWriteBuf()
描述:
把pBuf缓存中的数据写入到nRF24L01,通常用来写入发
射通道数据或接收/发送地址
/**************************************************/
ucharSPIWriteBuf(ucharreg,uchar*pBuf,ucharbytes)
{
ucharstatus,i;
CSN=0;//CSN置低,开始传输数据
status=SPIRW(reg);//选择寄存器,同时返回状态字
for(i=0;iSPIRW(pBuf[i]);//逐个字节写入nRF24L01
CSN=1;//CSN拉高,结束数据传输
return(status);//返回状态寄存器
}
/**************************************************
函数:
TXMode()
描述:
这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),
130us后启动发射,数据发送结束后,发送模块自动转入接收
模式等待应答信号。
/**************************************************/
voidTXMode(uchar*BUF)
{
CE=0;
SPIWriteBuf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);//写入发送地址
SPIWriteBuf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//为了应答接收设备,接收通道0地址和发送地址相同
SPIWriteBuf(WR_TX_PLOAD,BUF,TX_PLOAD_WIDTH);//写数据包到TXFIFO
SPIRWReg(WRITE_REG+EN_AA,0x01);//使能接收通道0自动应答
SPIRWReg(WRITE_REG+EN_RXADDR,0x01);//使能接收通道0
SPIRWReg(WRITE_REG+SETUP_RETR,0x0a);//自动重发延时等待250us+86us,自动重发10次
SPIRWReg(WRITE_REG+RF_CH,60);//选择射频通道60
SPIRWReg(WRITE_REG+RF_SETUP,0x07);//数据传输率1Mbps,发射功率0dBm,低噪声放大器增益
SPIRWReg(WRITE_REG+CONFIG,0x0e);//CRC使能,16位CRC校验,上电
CE=1;
}
/**************************************************
函数:
CheckACK()
描述:
检查接收设备有无接收到数据包,设定没有收到应答信
号是否重发
/**************************************************/
ucharCheckACK()
{
while(IRQ);
sta=SPIRead(READ_REG+STATUS);//返回状态寄存器
if(TX_DS||MAX_RT)//发送完毕中断(接收到应答信号或者自动重发计数溢出)
{
SPIRWReg(WRITE_REG+STATUS,0xff);//清除TX_DS或MAX_RT中断标志
CSN=0;
SPIRW(FLUSH_TX);//用于清空FIFO
CSN=1;
return(0);
}
else
{
return
(1);
}
}
voidDelay1ms(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
#include
#include"NRF24L01.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitled=P1^6;
voidmain()
{
led=0;
InitNRF24L01();
Delay1ms(500);
while
(1)
{
led=~led;
SendData(0x01,0x01,0x02,0x03,0x04,0x05,0x06,0x07);
Delay1ms(1000);
}
}
接收
Api头文件
#ifndef_API_DEF_
#define_API_DEF_
//DefineinterfacetonRF24L01
//SPI(nRF24L01)commands
#defineREAD_REG0x00//Definereadcommandtoregister
#defineWRITE_REG0x20//Definewritecommandtoregister
#defineRD_RX_PLOAD0x61//DefineRXpayloadregisteraddress
#defineWR_TX_PLOAD0xA0//DefineTXpayloadregisteraddress
#defineFLUSH_TX0xE1//DefineflushTXregistercommand
#defineFLUSH_RX0xE2//DefineflushRXregistercommand
#defineREUSE_TX_PL0xE3//DefinereuseTXpayloadregistercommand
#defineNOP0xFF//DefineNoOperation,mightbeusedtoreadstatusregister
//SPI(nRF24L01)registers(addresses)
#defineCONFIG0x00//'Config'registeraddress
#defineEN_AA0x01//'EnableAutoAcknowledgment'registeraddress
#defineEN_RXADDR0x02//'EnabledRXaddresses'registeraddress
#defineSETUP_AW0x03//'Setupaddresswidth'registeraddress
#defineSETUP_RETR0x04//'SetupAuto.Retrans'registeraddress
#defineRF_CH0x05//'RFchannel'registeraddress
#defineRF_SETUP0x06//'RFsetup'registeraddress
#defineSTATUS0x07//'Status'registeraddress
#defineOBSERVE_TX0x08//'ObserveTX'registeraddress
#defineCD0x09//'CarrierDetect'registeraddress载波检测
#defineRX_ADDR_P00x0A//'RXaddresspipe0'registeraddress
#defineRX_ADDR_P10x0B//'RXaddresspipe1'registeraddress
#defineRX_ADDR_P20x0C//'RXaddress