我在做毕业设计的过程中用到了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 &