NRF24L01 接收程序放中断函数函数里不生效的解决办法

本文介绍了在使用NRF24L01无线通信模块进行中断接收时遇到的问题,即接收函数在中断中无法正常工作,只接收一次数据。作者通过分析和实验,发现中断中形参未生效且接收寄存器配置失效。为解决此问题,重新编写了无参数接收配置函数,并在30ms定时中断中交替执行接收配置和读取数据包的两个函数,有效避免了数据包滞后和接收错误。该方法成功实现了稳定的数据接收。
摘要由CSDN通过智能技术生成

我在做毕业设计的过程中用到了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 &
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值