NRF24L01 怎么不能连续接收数据?

成钧 2014-06-02 10:42:17
问题:如果将SetRX_Mode(),放在while循环之外 只能接收一个数据, 且就是在上电那一刻。 求同行帮忙分析一下,
/***************主程序******************/
void main(void)
{
unsigned char tf =0;
unsigned char TxBuf[32]="WangChengJunWangChengJunWangChen"; //
unsigned char RxBuf[32]={0};
UART_init();
init_NRF24L01();
//SetTX_Mode();
while(1)
{
SetRX_Mode(); //如果将次语句放在while循环之外就不能连续接收数据,只会在上电接收一次数据
// nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data
Delay(6000);
led = ~led;
if(nRF24L01_RxPacket(RxBuf))
{
RxBuf[31] ='\0';
Printf(RxBuf); // 串口发送数据
BufSet(RxBuf,32,0); //清除缓存区
}
}
}

/*****************************************************************************************************/
void SetRX_Mode(void)
{
CE=0;
SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); //选择通道0的有效数据宽度
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收
CE = 1;
inerDelay_us(130);
}
/****************************************************************************************************/
/*函数:void SetTX_Mode(void)
/*功能:数据发送配置
/****************************************************************************************************/
void SetTX_Mode(void)
{
CE=0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址
SPI_RW_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
SPI_RW_Reg(WRITE_REG+CONFIG,0x0e); //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
CE = 1;
inerDelay_us(130);
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0;//待机模式Ⅰ (写寄存器之前一定要进入待机模式或掉电模式)
CSN=1;
SCK=0;
IRQ=1;

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,如果需要多频道可以参考Page21
SPI_RW_Reg(WRITE_REG + RF_CH,40); // 设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x0f); //设置发射速率为1MHZ,发射功率为最大值0dB

CE = 1;
}
/******************************************************************************************************/
/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
/*功能:数据读取后放如rx_buf接收缓冲区中
/******************************************************************************************************/
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char revale=0;
sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
if(RX_DR) // 判断是否接收到数据
{
CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
SPI_RW_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
revale =1; //读取数据完成标志
}
return revale;
}
/***********************************************************************************************************
/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
/*功能:发送 tx_buf中数据
/**********************************************************************************************************/
void nRF24L01_TxPacket(unsigned char * tx_buf)
{
CE=0; //StandBy I模式
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据
CE=1; //置高CE,激发数据发送
while(IRQ!=0);//等待发送完成
sta=SPI_Read(STATUS); //读取状态寄存器的值
SPI_RW_Reg(WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志

inerDelay_us(10);
}

/*****************************************END FILE***************************************************/
...全文
1143 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fga333 2015-08-07
  • 打赏
  • 举报
回复
问题:这个问题是项目换单片机的时候出现的问题,刚开始的版本,nrf24L01发送接收都正常,现在改版,发送端不变,接收端换了个单片机,有20引脚的换到44引脚的,发现收到数据。 问题排除: 第一步:首先确认收发端的配置一样. 因为以前都可以正常通信,所以配置没问题! 第二步:收发地址一致。经检查,地址也一致! 第四步:判断接收端是否可以对无线模块进行读写。 经检查,可以读无线模块进行读写,写进去的和读出来的参数一样! 最后发现,原来是电源问题: 以前的可以正常接收端的电源纹波为80mv,而现在的电源纹波为120mV!将现在的电源纹波减小到80mV一下,问题顺利解决! 中国嵌入式爱好者群24386694 与你分享!
Keres_ 2015-02-07
  • 打赏
  • 举报
回复
能给份你的源代码吗?最近我也在做这个,头都是疼的。
Hyjal 2014-12-23
  • 打赏
  • 举报
回复
原因就是如2楼所说吗?
成钧 2014-06-04
  • 打赏
  • 举报
回复
恩!谢谢! 我也找到原因了
追梦的魂影 2014-06-03
  • 打赏
  • 举报
回复
你读取一帧数据后CE=0,没有将CE恢复到1
基于NRF24L01的PID电机转速控制器,采用51单片机控制,有发送端和接收端的完整图纸和程序代码 实物图: 原理图: 项目介绍: 在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制器(亦称PID调节器)是应用最为广泛的一种自动控制器。它具有原理简单,易于实现,适用面广,控制参数相互独立,参数的选定比较简单等优点;而且在理论上可以证明,对于过程控制的典型对象──“一阶滞后+纯滞后”与“二阶滞后+纯滞后”的控制对象,PID控制器是一种最优控制。PID调节规律是连续系统动态品质校正的一种有效方法,它的参数整定方式简便,结构改变灵活(PI、PD、PID)。 然而PID算法在工业发展中也占据不小的地位,例如,液位,压力,温度,流量的控制都能利用PID算法进行精准控制。本项目将PID的算法用在了直流电机的控制当中,用于精准控制电机转速,简化电机控制难度。为了使操作者能够简单,方便,实时,快捷的控制电机的转速,我又在此基础上加上了无线模块,使得操作者能够更加简单的操作本产品,操作者只需简单改变主控板的设定值,接收机即可将电机转速控制在设定值以内,误差范围控制在正负20r/s(转/秒)。 功能设计要点 1.控制核心:接收和发射核心控制部分均采用STC12C5A60S2单片机进行控制 2.显示部分:接收机显示采用普通的12864液晶显示,发射部分为了减小其体积采用OLED液晶,功耗低,体积小,显示效果好 3.电机驱动部分:采用的是L298N电机驱动模块,价格低,抗干扰能力强,安全性高,可靠性强,大大提高了电机的效率。 4.速度检测部分:采用44E开关型霍尔传感器,成本低,电路简单,可与单片机IO口直接连接,操作方便。 5.无线数据传输采用NRF24L01无线模块,工作在 2.4~2.5GHz 世界通用 ISM 频段,工作电流只有 10.5mA, 接收时工作电流只有 18mA, 多种低功率工作模式, 功耗低。 6.核心控制算法PID:此电路采用的是PID算法里的增量式算法, pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last); 增量式算法不需做累加, 计算误差和计算精度问题对控制量的计算影响较小; 系统工作原理方框图:
一、5G技术的发展简介2018年6月,5G NR独立组网标准冻结,标志着5G时代的来临。5G仅仅是比4G的网速更快吗?绝非如此。5G不仅提供了极高的网速,而且将网络时延、可靠性、容量等性能大幅提升,使得5G成为一个万物互联的平台,从而可以极大地推动大量相关产业的发展。中国信息通信研究院在其研究报告中称:“第五代移动通信技术(5G)正在阔步前行,它将以全新的网络架构,提供至少十倍于4G 的峰值速率、毫秒级的传输时延和千亿级的连接能力,开启万物广泛互联、人机深度交互的新时代。”中国电信在其《5G技术白皮书》中也写道:“5G将是引领科技创新、实现产业升级、发展新经济的基础性平台”。  由此可以看到,5G技术的应用,将不再局限于用户间的通信联系以及个人用户的信息获取,而是渗透到了诸多行业,满足各种行业应用的通信需求,从而推动整个社会的智能化进程,这将是一场广泛而深刻的通信变革。二、本课程的特色这门课程,是我花费了大量的时间,在阅读了大量的资料的基础上,精心编写、录制而成的。这门课程的目标人群是那些已经有了一定的移动通信知识,但对5g网络尚未有系统了解和掌握的朋友们。在编写课件的过程中,我力争做到深入浅出,既能把技术问题探讨到一定的深度,不流于肤浅,又能易于理解,避免晦涩难懂。从内容的选择上,我力争做到全面而系统,对于5G的组网策略、核心网、接入网、承载网、网络切片技术、大规模MIMO和移动边缘计算等内容都纳入了课程内容。如果各位认真地学完这门课程,我想您会对5G移动通信技术有一个相当程度的了解和掌握,您会感到“课有所值”。三、本课程主要内容本课程包括八个方面的内容:1、从1G到5G在这一部分主要讲述了蜂窝移动通信系统的基本概念,1G、2G、3G、4G和5G移动通信系统的特点、发展演变的过程,以及5G的三大应用场景—eMBB(增强移动宽带)、mMTC(海量大连接)、URLLC(低时延高可靠),并以VR/AR(虚拟现实/增强现实)、智能家居、农业传感、智能制造、自动驾驶等具体应用来说明5G在垂直行业的应用场景。2、5G的独立组网和非独立组网模式主要讲述5G的组网方案,包括独立组网的2种模式和非独立组网的3个系列8种模式。课程中对各种组网方式的网络结构、优缺点、对业务的支持情况等进行了详细的分析,讲解了双连接、用户面、控制面、锚点等概念,并且对目前5G网络运营商如何选择各种组网模式进行了介绍。3、5G核心网解析主要讲述5G核心网SBA(基于服务的架构)、网络功能虚拟化、微服务、NF的调用、CUPS(控制面和用户面分离)、网络切片等内容,课程中对5G核心网的总体结构和各个NF(NSSF、NEF、NRF、PCF、UDM、AUSF、AMF、SMF、UPF)的作用都进行了讲解。4、5G接入网架构在这一部分,首先为大家回顾了从2G到4G接入网的发展过程,简述了它们各自的结构和特点。接下来,重点讲解了5G接入网的总体架构,CU、DU、AAU的作用,以及它们之间的功能划分。最后介绍了5G标准支持的多种接入网设备部署方案,包括CU/DU合设的两种方案和CU/DU分设的两种方案,以及它们各自的特点和适用场景。5、5G承载网作为移动通信网的三大子网之一,5G时代的承载网同样需要向前演进。这部分课程首先讲解了5G网络对承载网在带宽、时延、时间同步和网络切片等方面的性能需求。在参考大量文献资料的基础上,我尽量将这些性能需求量化,以期达到能够对实际工作起到指导和参考的作用。在带宽需求方面,针对前传、中传和回传网,分别给出了带宽需求的范围。接下来,课程讲解了5G承载网的技术实现方案,包括前传网的三种技术方案:光纤直连、无源WDM和有源OTN,以及中传和回传网络的通用分层结构、PAM4技术、FLEX-E技术、SR技术等,并介绍了中国移动、中国电信和中国联通的5G中、回传网技术方案:SPN(切片分组网络)、M-OTN(面向移动承载优化的OTN)和IP RAN增强,讲解了这三种技术的发展由来和技术特点。6、MIMO及大规模MIMO技术这一章包括四个部分的内容。第一部分是MIMO技术的原理,主要讲述了MIMO技术的基本概念、历史发展、对网络性能的改善(提高系统容量、对抗多经衰落、降低系统内干扰)等。第二部分讲MIMO技术的应用,主要包括MIMO技术的三种应用方式—空间复用、传输分集和波束成形的技术特点和优势,以及MIMO技术在WLAN、3G、B3G和4G系统的应用。第三部分讲解大规模MIMO技术的原理,包括它的技术特点、对系统性能的改善(信道容量大幅增加、波束更窄、系统内干扰更低、可实现3D波束赋形)以及它的缺点(算法复杂度高等)。第四部分是大规模MIMO技术的应用,主要介绍了它在4G和5G网络的应用,分析了大规模MIMO技术对4G网络容量提升的实测结果。7、5G网络切片技术这一章首先介绍了在5G网络中引入网络切片技术的必要性,以及网络切片技术的定义等内容,然后讲解了实现网络切片的技术基础。网络切片的实现,需要两个主要的技术来支撑,一个是NFV(网络功能虚拟化),另外一个是SDN(软件定义网络),课程中对这两项技术进行了比较详细的介绍。最后讲述了5G网络切片的实现,内容包括核心网切片、接入网切片以及承载网切片的实现,涉及到网络切片的选择、GROUP A、B、C三种切片构成方式、子载波间隔的选择等内容。8、5G与移动边缘计算这一章首先介绍了MEC(移动边缘计算)的起源和发展,追溯了IBM与诺基亚西门子开发的最早的MEC,ETSI在MEC方面的工作,以及3GPP在4G和5G标准中关于MEC的相关内容。接下来,讲解了MEC在5G网络的部署,包括边缘级、区域级和地区级MEC三种部署方式以及它们的适用场景。最后列举了一些具体的应用场景来说明MEC的应用情况,包括视频优化加速、车联网、VR直播和视频优化分析。四、讲师简介老铁于1991年毕业于南开大学电子系。从1994年开始,进入移动通信行业,先后在摩托罗拉公司、中国联通和中国电信的省级公司工作。2011年进入高校,从事移动通信相关课程的教学工作。       在联通和电信工作期间,老铁从事过移动通信网络的建设、规划、优化等工作,可以说在移动通信网络技术方面积累了比较丰富的知识和经验。在联通工作期间,参加过许多技术项目,也获得了一些奖项,包括中国通信标准化协会颁发的科学技术奖一等奖、信息产业部颁发的“CDMA网络创新贡献”奖,以及中国联通的“科技进步奖”三等奖。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧