NRF24L01调试方法及经验总结.docx

上传人:b****3 文档编号:4673882 上传时间:2022-12-07 格式:DOCX 页数:16 大小:24.63KB
下载 相关 举报
NRF24L01调试方法及经验总结.docx_第1页
第1页 / 共16页
NRF24L01调试方法及经验总结.docx_第2页
第2页 / 共16页
NRF24L01调试方法及经验总结.docx_第3页
第3页 / 共16页
NRF24L01调试方法及经验总结.docx_第4页
第4页 / 共16页
NRF24L01调试方法及经验总结.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

NRF24L01调试方法及经验总结.docx

《NRF24L01调试方法及经验总结.docx》由会员分享,可在线阅读,更多相关《NRF24L01调试方法及经验总结.docx(16页珍藏版)》请在冰豆网上搜索。

NRF24L01调试方法及经验总结.docx

NRF24L01调试方法及经验总结

NRF24L01:

在通信中的应用方法,经验总结〔1〕

2021-07-3113:

15

首先说一下:

单片射频收发器件,工作于2.4GHz~2.5GHzISM频段。

内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型ShockBurst技术,其中输出功率和通信频道可通过程序进行配置。

nRF24L01功耗低,在以-6dBm的功率发射时,工作电流也只有9mA;接收时,工作电流只有12.3mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。

是想将这个IC调通,首先要多读一下技术文档:

下载技术文档

以下C51驱动nRF24.L01 的源代码库〔nRF24.L01.h〕

此库文件适合发送端使用,在接收端会有所不同,请看第2局部的分析

在使用过程中,需要引用

//****************************************NRF24L01端口定义***************************************

sbit CE    =P2^0;

sbit CSN  =P2^1;

sbit SCK    =P2^2;

sbit MOSI =P2^3;

sbit MISO =P2^4;

sbit IRQ  =P2^5;

//*********************************************NRF24L01*************************************

#defineTX_ADR_WIDTH   5   //接收地址宽度,一般设置为5不要动它

#defineRX_ADR_WIDTH   5   //接收地址宽度,一般设置为5不要动它

#defineTX_PLOAD_WIDTH 1  //接收数据的数据宽度〔最大为32字节〕,这里我设置为最小的1字节,方便调试

#defineRX_PLOAD_WIDTH 1  //发送数据的数据宽度〔最大为32字节〕,这里我设置为最小的1字节,方便调试

     

ucharconstTX_ADDRESS[TX_ADR_WIDTH]={0x35,0x43,0x10,0x10,0x03}; // 这里就是设置了5个字节的 本地地址

/*

此处的地址:

在IC内部真实地址是反过来的。

即:

address=0310104334

在数据发送时,发送到对方去的数据包括:

数据本身+本地地址。

与接收地址无关。

*/

ucharconstRX_ADDRESS[RX_ADR_WIDTH]={0xEF,0xEF,0xEF,0xEF,0xEF}; //接收地址

/*

是指接受来自于发送方的地址〔指发送方的本地地址〕,但在自动模式下,得到的应答信息中,包含的不是返回应答信息的对方的〔本地地址〕

而是由发送方〔也就是发送原信息的机子一方〕的本地地址

*/

ucharTxBuf[1]; //

//***************************************NRF24L01存放器指令*******************************************************

#defineREAD_REG       0x00  //读存放器指令

#defineWRITE_REG      0x20 //写存放器指令

#defineRD_RX_PLOAD    0x61  //读取接收数据指令

#defineWR_TX_PLOAD    0xA0  //写待发数据指令

#defineFLUSH_TX       0xE1 //冲洗发送FIFO指令

#defineFLUSH_RX       0xE2  //冲洗接收FIFO指令

#defineREUSE_TX_PL    0xE3  //定义重复装载数据指令

#defineNOP            0xFF  //保存

//*************************************SPI(nRF24L01)存放器地址****************************************************

#defineCONFIG         0x00 //配置收发状态,CRC校验模式以及收发状态响应方式

#defineEN_AA          0x01 //自动应答功能设置

#defineEN_RXADDR      0x02 //可用信道设置

#defineSETUP_AW       0x03 //收发地址宽度设置

#defineSETUP_RETR     0x04 //自动重发功能设置

#defineRF_CH          0x05 //工作频率设置

#defineRF_SETUP       0x06 //发射速率、功耗功能设置

#defineSTATUS         0x07 //状态存放器

#defineOBSERVE_TX     0x08 //发送监测功能

#defineCD             0x09 //地址检测          

#defineRX_ADDR_P0     0x0A //频道0接收数据地址

#defineRX_ADDR_P1     0x0B //频道1接收数据地址

#defineRX_ADDR_P2     0x0C //频道2接收数据地址

#defineRX_ADDR_P3     0x0D //频道3接收数据地址

#defineRX_ADDR_P4     0x0E //频道4接收数据地址

#defineRX_ADDR_P5     0x0F //频道5接收数据地址

#defineTX_ADDR        0x10 //发送地址存放器

#defineRX_PW_P0       0x11 //接收频道0接收数据长度

#defineRX_PW_P1       0x12 //接收频道0接收数据长度

#defineRX_PW_P2       0x13 //接收频道0接收数据长度

#defineRX_PW_P3       0x14 //接收频道0接收数据长度

#defineRX_PW_P4       0x15 //接收频道0接收数据长度

#defineRX_PW_P5       0x16 //接收频道0接收数据长度

#defineFIFO_STATUS    0x17 //FIFO栈入栈出状态存放器设置

//**************************************************************************************

voidDelay(unsignedints);

voidinerDelay_us(unsignedcharn);

voidinit_NRF24L01(void);

uintSPI_RW(uintuchar);

ucharSPI_Read(ucharreg);

voidSetRX_Mode(void);

uintSPI_RW_Reg(ucharreg,ucharvalue);

uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars);

uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars);

ucharnRF24L01_RxPacket(unsignedchar*rx_buf);

voidnRF24L01_TxPacket(unsignedchar*tx_buf);

//*****************************************长延时*****************************************

voidDelay(unsignedints)

{

 unsignedinti;

 for(i=0;i

 for(i=0;i

}

//******************************************************************************************

uchar bdatasta;  //状态标志

sbit RX_DR =sta^6;

sbit TX_DS =sta^5;

sbit MAX_RT =sta^4;

/******************************************************************************************

/*延时函数

/******************************************************************************************/

voidinerDelay_us(unsignedcharn)

{

 for(;n>0;n--)

  _nop_();

}

//****************************************************************************************

/*NRF24L01初始化

//***************************************************************************************/

voidinit_NRF24L01(void)

{

   inerDelay_us(100);

  CE=0;    

  CSN=1;   

  SCK=0;   

 SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);   //写本地地址 

 SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//写接收端地址

 SPI_RW_Reg(WRITE_REG+EN_AA,0x01);     // 频道0自动 ACK应答允许 

 SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01); // 允许接收地址只有频道0 

 SPI_RW_Reg(WRITE_REG+RF_CH,0);       //  设置信道工作为2.4GHZ,收发必须一致

 SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//设置接收数据长度,本次设置为32字节

 SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);    //设置发射速率为1MHZ,发射功率为最大值0dB

 CE=1;  //网上很多地方这里的CE=1都没有设置,不过也能正常工作。

}

/****************************************************************************************************

/*函数:

uintSPI_RW(uintuchar)

/*功能:

NRF24L01的SPI写时序

/****************************************************************************************************/

uintSPI_RW(uintuchar)

{

 uintbit_ctr;

   for(bit_ctr=0;bit_ctr<8;bit_ctr++) 

    {

  MOSI=(uchar&0x80);        

  uchar=(uchar<<1);           

  SCK=1;                     

  uchar|=MISO;          

  SCK=0;               

    }

   return(uchar);              

}

/****************************************************************************************************

/*函数:

ucharSPI_Read(ucharreg)

/*功能:

NRF24L01的SPI时序

/****************************************************************************************************/

ucharSPI_Read(ucharreg)

{

 ucharreg_val;

 

 CSN=0;                

 SPI_RW(reg);            

 reg_val=SPI_RW(0);    

 CSN=1;                 

 return(reg_val);       

}

/****************************************************************************************************/

/*功能:

NRF24L01读写存放器函数

/****************************************************************************************************/

uintSPI_RW_Reg(ucharreg,ucharvalue)

{

 uintstatus;

 

 CSN=0;                   

 status=SPI_RW(reg);     

 SPI_RW(value);             

 CSN=1;                   

 return(status);           

}

/****************************************************************************************************/

/*函数:

uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars)

/*功能:

用于读数据,reg:

为存放器地址,pBuf:

为待读出数据地址,uchars:

读出数据的个数

/****************************************************************************************************/

uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars)

{

 uintstatus,uchar_ctr;

 

 CSN=0;                     //SetCSNlow,initSPItranaction

 status=SPI_RW(reg);        //Selectregistertowritetoandreadstatusuchar

 

 for(uchar_ctr=0;uchar_ctr

  pBuf[uchar_ctr]=SPI_RW(0);   //

 

 CSN=1;                          

 

 return(status);                   //returnnRF24L01statusuchar

}

/*********************************************************************************************************

/*函数:

uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)

/*功能:

用于写数据:

reg为存放器地址,pBuf:

为待写入数据地址,uchars:

写入数据的个数

/*********************************************************************************************************/

uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)

{

 uintstatus,uchar_ctr;

 

 CSN=0;           //SPI使能      

 status=SPI_RW(reg);  

 for(uchar_ctr=0;uchar_ctr

  SPI_RW(*pBuf++);

 CSN=1;          //关闭SPI

 return(status);   //

}

/****************************************************************************************************/

/*函数:

voidSetRX_Mode(void)

/*功能:

数据接收配置

/****************************************************************************************************/

voidSetRX_Mode(void)

{

 CE=0;

 SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);    //IRQ收发完成中断响应,16位CRC ,主接收

 CE=1;

 inerDelay_us(130);

}

/******************************************************************************************************/

/*函数:

unsignedcharnRF24L01_RxPacket(unsignedchar*rx_buf)

/*功能:

数据读取后放如rx_buf接收缓冲区中

/******************************************************************************************************/

ucharnRF24L01_RxPacket(unsignedchar*rx_buf)

{

   unsignedcharrevale=0;

 sta=SPI_Read(STATUS); //读取状态存放其来判断数据接收状况

 if(RX_DR)    //判断是否接收到数据

 {

    CE=0;   //SPI使能

  SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//readreceivepayloadfromRX_FIFObuffer

  revale=1;   //读取数据完成标志

 }

 SPI_RW_Reg(WRITE_REG+STATUS,sta);  //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志

 returnrevale;

}

/***********************************************************************************************************

/*函数:

voidnRF24L01_TxPacket(unsignedchar*tx_buf)

/*功能:

发送tx_buf中数据

/**********************************************************************************************************/

voidnRF24L01_TxPacket(unsignedchar*tx_buf)

{

 CE=0;   //StandByI模式 

 SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//装载接收端地址

 SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);   //装载数据 

 SPI_RW_Reg(WRITE_REG+CONFIG,0x0e);  //IRQ收发完成中断响应,16位CRC,主发送

 SPI_RW_Reg(WRITE_REG+STATUS,0X7E);  //清除中断,以便开始发送数据

 CE=1;  //置高CE,激发数据发送

 inerDelay_us(10);

}

NRF24L01:

在通信中的应用方法,经验总结〔2〕

2021-07-3113:

30

接着说上一节

在前面我说,库文件只适合在发送端使用,下面是接收端库文件,关键是对6通道的设置,以到达6个通道可以同时接收数据的能力

以下是接收端库文件。

当然这个库也可以用于发送端局部。

在接收端中,有几处不太一样的地方〔标记为蓝色〕,请结合发送端局部比拟分析

//////////////////////////////////////////////////////////////接收端库文件〔NRF24L01.h〕////////////////////////////////////////////////////////////////////////////////////////////////////

//****************************************NR

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

当前位置:首页 > 初中教育 > 语文

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

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