NRF24L01调试方法及经验总结Word格式文档下载.docx

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

NRF24L01调试方法及经验总结Word格式文档下载.docx

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

NRF24L01调试方法及经验总结Word格式文档下载.docx

#defineTX_ADR_WIDTH 

 

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

#defineRX_ADR_WIDTH 

#defineTX_PLOAD_WIDTH 

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

#defineRX_PLOAD_WIDTH 

//发送数据的数据宽度〔最大为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 

//配置收发状态,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 

#defineRX_PW_P2 

0x13 

#defineRX_PW_P3 

0x14 

#defineRX_PW_P4 

0x15 

#defineRX_PW_P5 

0x16 

#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<

s;

i++);

}

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

uchar 

bdatasta;

//状态标志

RX_DR 

=sta^6;

TX_DS 

=sta^5;

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写时序

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

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时序

ucharreg_val;

CSN=0;

SPI_RW(reg);

reg_val=SPI_RW(0);

CSN=1;

return(reg_val);

NRF24L01读写存放器函数

uintSPI_RW_Reg(ucharreg,ucharvalue)

uintstatus;

status=SPI_RW(reg);

SPI_RW(value);

return(status);

uintSPI_Read_Buf(ucharreg,uchar*pBuf,ucharuchars)

/*功能:

用于读数据,reg:

为存放器地址,pBuf:

为待读出数据地址,uchars:

读出数据的个数

uintstatus,uchar_ctr;

//SetCSNlow,initSPItranaction

//Selectregistertowritetoandreadstatusuchar

for(uchar_ctr=0;

uchar_ctr<

uchars;

uchar_ctr++)

pBuf[uchar_ctr]=SPI_RW(0);

//returnnRF24L01statusuchar

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

uintSPI_Write_Buf(ucharreg,uchar*pBuf,ucharuchars)

用于写数据:

reg为存放器地址,pBuf:

为待写入数据地址,uchars:

写入数据的个数

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

//SPI使能 

uchar_ctr<

uchar_ctr++)//

SPI_RW(*pBuf++);

//关闭SPI

voidSetRX_Mode(void)

数据接收配置

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中数据

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

//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,激发数据发送

inerDelay_us(10);

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

30

接着说上一节

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

以下是接收端库文件。

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

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

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

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

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

当前位置:首页 > 高中教育 > 高考

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

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