NRF24L01 接收程序放中断函数函数里不生效的解决办法_nrf2401中断接收-程序员宅基地

技术标签: 中断函数  51单片机  C语言  中断  接收数据  只接收一次  NRF24L01  

我在做毕业设计的过程中用到了NRF24L01模块,需要用中断方式接受数据,而实际操作过程中我发现接受函数放中断中会出现只接受RX_DR中断无法清除中断的现像,后百度发现也有人遇到过跟我一样的问题,说是因为中断中形参没有生效,也就是OxFF并没有写进STATUS寄存器。后来又遇到配置接收寄存器也写不进的情况。苦于几天无头绪的乱打乱撞,心一横,把接收相关配置函数全部用无参数函数重新编写,再在中断函数中调用。终于可以收到数据了。之前也有看到网上大神说24L01官方数据手册给出接收配置延迟时间太短的,说要ms级别以上,而我这里发送6字节的包,发现要30ms以上收到的包才正确,不然经常会有滞后2个数据包的情况。我这里调用接收函数的方法是:设置一个30ms的定时中断,把接收配置分两部分,一部分写接收配置,一部分写取数据包,在定时中断中奇偶次地分别做这两个函数,这样中间就相当于延迟了30ms,实际接收效果很好。

以下是接收部分所有函数

只要在主函数里调用配置函数void RX_NRF24L01_Config(void),然后在中断中调用:


if((timer_cnt++)%2)
{
NRF24L01_RxPacket_part1();
}
else
{
if(NRF24L01_RxPacket_part2(rx_buf))
{
exit=0;
LED=1;//收到数据闪一下
}
else
LED=0;
}

#include "nrf24l01_RX.h"
#include "delay.h" 

uchar rx_buf[RX_PLOAD_WIDTH]={0,0,0,0,0,0};
unsigned int timer_cnt=0;

//º¯ÊýÉùÃ÷ 
BYTE SPI_RW(BYTE byte);                                // Single SPI read/write
BYTE SPI_Read(BYTE reg);                               // Read one byte from nRF24L01
BYTE SPI_RW_Reg(BYTE reg, BYTE byte);                  // Write one byte to register 'reg'
BYTE SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes);  // Writes multiply bytes to one register
BYTE SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes);   // Read multiply bytes from one register
BYTE NRF24L01_RxPacket(BYTE *rx_buf);

uchar const TX_ADDRESS[TX_ADR_WIDTH] = {0xC2,0xC2,0xC2,0xC2,0xC2};//·¢ËͶ˵ØÖ·
uchar const RX_ADDRESS[RX_ADR_WIDTH] = {0xE7,0xE7,0xE7,0xE7,0xE7};//½ÓÊն˵ØÖ·


uchar 	bdata sta;
sbit	RX_DR	=sta^6;	//½ÓÊÕÊý¾Ý×¼±¸¾ÍÐ÷
sbit	TX_DS	=sta^5;	 //ÒÑ·¢ËÍÊý¾Ý
sbit	MAX_RT	=sta^4;	  // ×î´óµÄTXÖØ´«££ÖжÏ

/**************************************************
Function: SPI_RW();

  Description:
  Writes one byte to nRF24L01, and return the byte read
  from nRF24L01 during write, according to SPI protocol
  ¼ÙÉèÏÂÃæµÄ8λ¼Ä´æÆ÷×°µÄÊÇ´ý·¢Ë͵ÄÊý¾Ý10101010£¬ÉÏÉýÑØ·¢ËÍ¡¢Ï½µÑؽÓÊÕ¡¢¸ßλÏÈ·¢ËÍ¡£
  ÄÇôµÚÒ»¸öÉÏÉýÑØÀ´µÄʱºò Êý¾Ý½«»áÊÇsdo=1£»
  ¼Ä´æÆ÷ÖеÄ10101010×óÒÆһ룬ºóÃæ²¹ÈëËÍÀ´µÄһλδ֪Êýx£¬³ÉÁË0101010x¡£
  ϽµÑص½À´µÄʱºò£¬sdiÉϵĵçƽ½«Ëø´æµ½¼Ä´æÆ÷ÖÐÈ¥£¬ÄÇôÕâʱ¼Ä´æÆ÷=0101010sdi£¬
  ÕâÑùÔÚ 8¸öʱÖÓÂö³åÒÔºó£¬Á½¸ö¼Ä´æÆ÷µÄÄÚÈÝ»¥Ïཻ»»Ò»´Î¡£ÕâÑù¾ÍÍê³ÉÀïÒ»¸öspiʱÐò
/**************************************************/
uchar SPI_RW(uchar byte)
{
	uchar bit_ctr;
	for(bit_ctr=0;bit_ctr<8;bit_ctr++)   // output 8-bit    // Êä³ö 8 λ
	{
		MOSI = (byte &
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_27426689/article/details/70318482

智能推荐

C++string类常用方法_c++ string类的常用方法-程序员宅基地

文章浏览阅读9.1w次,点赞485次,收藏3.4k次。C++string类常用方法1、string(const char *s) :将 string 对象初始化为 s 指向的字符串string str("hello");2、string(size_type n,char c) :创建一个包含 n 个元素的 string 对象,其中每个元素都被初始化为字符 cstring str(10, 'a');3、string(const string &str) :将一个 string 对象初始化为 string 对象 str(复制构造函数)str_c++ string类的常用方法

BP(Back Propagation)神经网络学习笔记_sigmoid型激活函数使得bp网络的输出及其导数呈现如下图形-程序员宅基地

文章浏览阅读6.2w次,点赞88次,收藏415次。BP神经网络算法是在BP神经网络现有算法的基础上提出的,是通过任意选定一组权值,将给定的目标输出直接作为线性方程的代数和来建立线性方程组,解得待求权,不存在传统方法的局部极小及收敛速度慢的问题,且更易理解。_sigmoid型激活函数使得bp网络的输出及其导数呈现如下图形

android中无限循环滑动的gallery实例_android 自定义无限滑动的imageview-程序员宅基地

文章浏览阅读321次。1.点击图片有变暗的效果,使用imageview.setAlpha(),并且添加ontouchListener 1 public void init() { 2 dots = new ImageView[len]; 3 for (int j = 0; j ) { 4 // 添加图片 5 final _android 自定义无限滑动的imageview

vuedraggable实现多列组件相互拖拽案例_vuedraggable多列拖拽-程序员宅基地

文章浏览阅读1.8k次。<!-- vuedraggable实现多列组件相互拖拽案例 --><template> <div> <!-- vue.draggable中文文档: https://www.itxst.com/vue-draggable/fueijmfy.html group 组名,相同组之间可以相互拖拽 animation 设置拖动时的动画效果时长oyu 组件拖拽样式基本由这三个类定义: dragCla..._vuedraggable多列拖拽

【电脑修复小知识】电脑网络正常连接,但是浏览器却无法打开网页是什么原因?三招教你修复!_电脑一切正常就是打不开网页-程序员宅基地

文章浏览阅读7.7w次,点赞96次,收藏412次。【电脑修复小知识】电脑网络正常连接,但是浏览器却无法打开网页是什么原因?三招教你修复!_电脑一切正常就是打不开网页

《数据仓库》一文读懂数据仓库建设_数仓建设-程序员宅基地

文章浏览阅读1.1w次,点赞31次,收藏144次。数据仓库建设一、数据仓库概念1.数仓架构​ 我们在谈到数据仓库,都会提到数仓架构,那么数仓架构到底是什么呢?首先,架构就是把一个整体工作按需切分成不同部分的内容,由不同角色来完成这些分工,并通过建立不同部分相互沟通的机制,使得这些部分能够有机的结合为一个整体,并完成这个整体所需要的所有活动。而数仓架构就可以理解为是构成数据仓库的组件以及之间的具有交互机制的关系。​ 如上图所示,数仓的数据源可能来自业务系统的数据,或者外部获取的数据,或者从线下文件导入的数据。通过抽取工作,将这些数据存储到数仓的原始_数仓建设

随便推点

c语言单个字符输入问题_c语言输入字符-程序员宅基地

文章浏览阅读1.9k次,点赞6次,收藏5次。而在我们输入时,其实输入了两个数据,一个是‘A’,另一个是‘\n’,而scanf在遇到(空格,换行等)停止读取数据,而‘\n’就被下一次的scanf给读走了;但是如果是一次输入多个字符的情况,当我们在屏幕上输入一个字符时,不能像输入整型那样输入一个空格再输入下一个字符,这样会将空格当成一个字符赋给下一个变量,直接输入两个字符就行(情况1)① scanf正常运行时,返回值是它读取的变量的个数,如果输入错误或停止,会返回EOF,EOF的值为-1。整型的输入:格式符相邻,输入时中间可以加上空格或回车。_c语言输入字符

浪潮服务器U盘安装系统无法识别到电脑硬盘问题的解决_there is no sata device-程序员宅基地

文章浏览阅读2.6w次,点赞2次,收藏44次。浪潮服务器U盘安装系统无法识别到电脑硬盘问题的解决首先说明一下,我是开发人员,不是专业的运维。公司来了一台服务器要我给他装linux系统,我呢就按正常的U盘安装系统方法操作,结果在选择安装位置指定磁盘的时候,发现只有我插入的那张U盘别检测到,服务器有一张1T的硬盘却没有被检测到。于是找了很多方法都没用,最终在联系厂家,在他们专家的指导下成功的解决了这个问题。问题如下图解决步骤:服务器开机..._there is no sata device

【数据结构】史上最好理解的红黑树讲解,让你彻底搞懂红黑树-程序员宅基地

文章浏览阅读10w+次,点赞719次,收藏3.6k次。狂肝半个月的学习笔记,最通俗易懂的红黑树讲解。带你快速掌握红黑树~_红黑树

SDUTACM 数据结构实验之图论八:欧拉回路_欧拉回路的结点个数-程序员宅基地

文章浏览阅读362次。题目描述在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来。能否走过这样的七座桥,并且每桥只走一次?瑞士数学家欧拉最终解决了这个问题并由此创立了拓扑学。欧拉通过对七桥问题的研究,不仅圆满地回答了哥尼斯堡七桥问题,并证明了更为广泛的有关一笔画的三条结论,人们通常称之为欧拉定理。对于一个连通图,通常把从某结点出发一笔画成所经过的路线叫做欧拉路。人们又通常把一_欧拉回路的结点个数

鸡兔同笼python程序怎么写_Python解决鸡兔同笼问题的方法-程序员宅基地

文章浏览阅读1.2w次。本文实例讲述了Python解决鸡兔同笼问题的方法,分享给大家供大家参考。具体分析如下:问题描述一个笼子里面关了鸡和兔子(鸡有 2 只脚,兔子有 4 只脚,没有例外)。已经知道了笼 子里面脚的总数 a,问笼子里面至少有多少只动物,至多有多少只动物输入数据第 1 行是测试数据的组数 n,后面跟着 n 行输入。每组测试数据占 1 行,包括一个正整 数 a (a < 32768)。输出要求n 行,每行输出..._鸡兔同笼python程序怎么写

“由于找不到MSVCP140.dll,无法继续执行代码,重新安装程序可能会解决此问题等”解决方案_由于找不到msvcp140.dli,无法继续执行代码。重新安装程序可能会解决此问题。-程序员宅基地

文章浏览阅读2.1w次,点赞17次,收藏20次。文章目录首先说明一下该问题:解决方案1.装VS(VC)的2.适用于所有人的良心方法首先说明一下该问题:该问题就是表示你们的操作系统中现在确实一些必要的依赖库你没有,然后,你现在要安装的这个软件正好要调用这些文件的一些函数。解决方案有两种情况,区别于编程人士与普通用户1.装VS(VC)的修复一下VS就可以了,咋修复我就不说了,编程的都懂2.适用于所有人的良心方法直接安装依赖库先下载库安装程序(链接失效的话 大家可以留言或者私信提醒)链接:https://pan.baidu.com/_由于找不到msvcp140.dli,无法继续执行代码。重新安装程序可能会解决此问题。

推荐文章

热门文章

相关标签