nrf24l01一对一通信.docx

上传人:b****6 文档编号:8386538 上传时间:2023-01-31 格式:DOCX 页数:20 大小:21.28KB
下载 相关 举报
nrf24l01一对一通信.docx_第1页
第1页 / 共20页
nrf24l01一对一通信.docx_第2页
第2页 / 共20页
nrf24l01一对一通信.docx_第3页
第3页 / 共20页
nrf24l01一对一通信.docx_第4页
第4页 / 共20页
nrf24l01一对一通信.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

nrf24l01一对一通信.docx

《nrf24l01一对一通信.docx》由会员分享,可在线阅读,更多相关《nrf24l01一对一通信.docx(20页珍藏版)》请在冰豆网上搜索。

nrf24l01一对一通信.docx

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

pBuf[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;i

SPIRW(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1