nrf24l01一对一通信Word文件下载.docx
- 文档编号:21522799
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:20
- 大小:21.28KB
nrf24l01一对一通信Word文件下载.docx
《nrf24l01一对一通信Word文件下载.docx》由会员分享,可在线阅读,更多相关《nrf24l01一对一通信Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
RFchannel'
#defineRF_SETUP0x06//'
RFsetup'
#defineSTATUS0x07//'
Status'
#defineOBSERVE_TX0x08//'
ObserveTX'
#defineCD0x09//'
CarrierDetect'
registeraddress载波检测
#defineRX_ADDR_P00x0A//'
RXaddresspipe0'
#defineRX_ADDR_P10x0B//'
RXaddresspipe1'
#defineRX_ADDR_P20x0C//'
RXaddresspipe2'
#defineRX_ADDR_P30x0D//'
RXaddresspipe3'
#defineRX_ADDR_P40x0E//'
RXaddresspipe4'
#defineRX_ADDR_P50x0F//'
RXaddresspipe5'
#defineTX_ADDR0x10//'
TXaddress'
#defineRX_PW_P00x11//'
RXpayloadwidth,pipe0'
#defineRX_PW_P10x12//'
RXpayloadwidth,pipe1'
#defineRX_PW_P20x13//'
RXpayloadwidth,pipe2'
#defineRX_PW_P30x14//'
RXpayloadwidth,pipe3'
#defineRX_PW_P40x15//'
RXpayloadwidth,pipe4'
#defineRX_PW_P50x16//'
RXpayloadwidth,pipe5'
#defineFIFO_STATUS0x17//'
FIFOStatusRegister'
#endif/*_API_DEF_*/
/**********************************************************
NRF24L01无线发送程序
**********************************************************/
#include<
api.h>
#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;
TX_BUF[3]=byte3;
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拉高,结束数据传输
return(status);
//返回状态寄存器
SPIRead()
从reg寄存器读一字节
ucharSPIRead(ucharreg)
ucharreg_val;
CSN=0;
SPIRW(reg);
//选择寄存器
reg_val=SPIRW(0);
//然后从该寄存器读数据
return(reg_val);
//返回寄存器数据
SPIReadBuf()
从reg寄存器读出bytes个字节,通常用来读取接收通道
数据或接收/发送地址
ucharSPIReadBuf(ucharreg,uchar*pBuf,ucharbytes)
ucharstatus,i;
bytes;
i++)
pBuf[i]=SPIRW(0);
//逐个字节从nRF24L01读出
SPIWriteBuf()
把pBuf缓存中的数据写入到nRF24L01,通常用来写入发
射通道数据或接收/发送地址
ucharSPIWriteBuf(ucharreg,uchar*pBuf,ucharbytes)
SPIRW(pBuf[i]);
//逐个字节写入nRF24L01
TXMode()
这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),
130us后启动发射,数据发送结束后,发送模块自动转入接收
模式等待应答信号。
voidTXMode(uchar*BUF)
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>
y--);
reg52.h>
#include"
NRF24L01.h"
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头文件
RXaddress
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- nrf24l01 一对一 通信