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

来源:互联网 发布:淘宝联盟怎么发布产品 编辑:程序博客网 时间:2024/05/19 17:48

我在做毕业设计的过程中用到了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/writeBYTE SPI_Read(BYTE reg);                               // Read one byte from nRF24L01BYTE 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 registerBYTE SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes);   // Read multiply bytes from one registerBYTE 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;sbitRX_DR=sta^6;//½ÓÊÕÊý¾Ý×¼±¸¾ÍÐ÷sbitTX_DS=sta^5; //ÒÑ·¢ËÍÊý¾ÝsbitMAX_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 & 0x80);         // output 'byte', MSB to MOSI   // ´ÓMOSI½ÅÊä³ö,´Ó¸ßλµ½µÍλ.µ±BYTE ×î¸ßλΪ1ʱÂß¼­ÔËËãΪ1,Êä³ö1.ÔËËãΪ0ʱÊä³ö0byte = (byte << 1);           // shift next bit into MSB..    // ×óÒÆ1λ.½«µÍλÏò¸ßλתÒÆ.SCK = 1;                      // Set SCK high..   // ½«SCK½ÅÀ­¸ß,byte |= MISO;         //byte=byte|MISO  capture current MISO bit // ´ÓMISO ÖжÁ³ö״̬λ´æÈëBYTEÖÐ.SCK = 0;              // ..then set SCK low again// ½«SCK½ÅÀ­µÍ.·¢ËÍһλÍê³É.}return(byte);             // return read byte  // ·µ»Ø״̬λ}/**************************************************/uchar SPI_RW__WRITE_REG(void){uchar bit_ctr;uchar byte=0xE3;for(bit_ctr=0;bit_ctr<8;bit_ctr++)   // output 8-bit    // Êä³ö 8 λ{MOSI = (byte & 0x80);         // output 'byte', MSB to MOSI   // ´ÓMOSI½ÅÊä³ö,´Ó¸ßλµ½µÍλ.µ±BYTE ×î¸ßλΪ1ʱÂß¼­ÔËËãΪ1,Êä³ö1.ÔËËãΪ0ʱÊä³ö0byte = (byte << 1);           // shift next bit into MSB..    // ×óÒÆ1λ.½«µÍλÏò¸ßλתÒÆ.SCK = 1;                      // Set SCK high..   // ½«SCK½ÅÀ­¸ß,byte |= MISO;         //byte=byte|MISO  capture current MISO bit // ´ÓMISO ÖжÁ³ö״̬λ´æÈëBYTEÖÐ.SCK = 0;              // ..then set SCK low again// ½«SCK½ÅÀ­µÍ.·¢ËÍһλÍê³É.}return(byte);             // return read byte  // ·µ»Ø״̬λ}uchar SPI_RW__0X27(void){uchar bit_ctr;uchar byte=0x27;for(bit_ctr=0;bit_ctr<8;bit_ctr++)   // output 8-bit    // Êä³ö 8 λ{MOSI = (byte & 0x80);         // output 'byte', MSB to MOSI   // ´ÓMOSI½ÅÊä³ö,´Ó¸ßλµ½µÍλ.µ±BYTE ×î¸ßλΪ1ʱÂß¼­ÔËËãΪ1,Êä³ö1.ÔËËãΪ0ʱÊä³ö0byte = (byte << 1);           // shift next bit into MSB..    // ×óÒÆ1λ.½«µÍλÏò¸ßλתÒÆ.SCK = 1;                      // Set SCK high..   // ½«SCK½ÅÀ­¸ß,byte |= MISO;         //byte=byte|MISO  capture current MISO bit // ´ÓMISO ÖжÁ³ö״̬λ´æÈëBYTEÖÐ.SCK = 0;              // ..then set SCK low again// ½«SCK½ÅÀ­µÍ.·¢ËÍһλÍê³É.}return(byte);             // return read byte  // ·µ»Ø״̬λ}uchar SPI_RW__0X0F(void){uchar bit_ctr;uchar byte=0x0F;for(bit_ctr=0;bit_ctr<8;bit_ctr++)   // output 8-bit    // Êä³ö 8 λ{MOSI = (byte & 0x80);         // output 'byte', MSB to MOSI   // ´ÓMOSI½ÅÊä³ö,´Ó¸ßλµ½µÍλ.µ±BYTE ×î¸ßλΪ1ʱÂß¼­ÔËËãΪ1,Êä³ö1.ÔËËãΪ0ʱÊä³ö0byte = (byte << 1);           // shift next bit into MSB..    // ×óÒÆ1λ.½«µÍλÏò¸ßλתÒÆ.SCK = 1;                      // Set SCK high..   // ½«SCK½ÅÀ­¸ß,byte |= MISO;         //byte=byte|MISO  capture current MISO bit // ´ÓMISO ÖжÁ³ö״̬λ´æÈëBYTEÖÐ.SCK = 0;              // ..then set SCK low again// ½«SCK½ÅÀ­µÍ.·¢ËÍһλÍê³É.}return(byte);             // return read byte  // ·µ»Ø״̬λ}uchar SPI_RW__0X61(void){uchar bit_ctr;uchar byte=0x61;for(bit_ctr=0;bit_ctr<8;bit_ctr++)   // output 8-bit    // Êä³ö 8 λ{MOSI = (byte & 0x80);         // output 'byte', MSB to MOSI   // ´ÓMOSI½ÅÊä³ö,´Ó¸ßλµ½µÍλ.µ±BYTE ×î¸ßλΪ1ʱÂß¼­ÔËËãΪ1,Êä³ö1.ÔËËãΪ0ʱÊä³ö0byte = (byte << 1);           // shift next bit into MSB..    // ×óÒÆ1λ.½«µÍλÏò¸ßλתÒÆ.SCK = 1;                      // Set SCK high..   // ½«SCK½ÅÀ­¸ß,byte |= MISO;         //byte=byte|MISO  capture current MISO bit // ´ÓMISO ÖжÁ³ö״̬λ´æÈëBYTEÖÐ.SCK = 0;              // ..then set SCK low again// ½«SCK½ÅÀ­µÍ.·¢ËÍһλÍê³É.}return(byte);             // return read byte  // ·µ»Ø״̬λ}uchar SPI_RW__0XFF(void){uchar bit_ctr;uchar byte=0xFF;for(bit_ctr=0;bit_ctr<8;bit_ctr++)   // output 8-bit    // Êä³ö 8 λ{MOSI = (byte & 0x80);         // output 'byte', MSB to MOSI   // ´ÓMOSI½ÅÊä³ö,´Ó¸ßλµ½µÍλ.µ±BYTE ×î¸ßλΪ1ʱÂß¼­ÔËËãΪ1,Êä³ö1.ÔËËãΪ0ʱÊä³ö0byte = (byte << 1);           // shift next bit into MSB..    // ×óÒÆ1λ.½«µÍλÏò¸ßλתÒÆ.SCK = 1;                      // Set SCK high..   // ½«SCK½ÅÀ­¸ß,byte |= MISO;         //byte=byte|MISO  capture current MISO bit // ´ÓMISO ÖжÁ³ö״̬λ´æÈëBYTEÖÐ.SCK = 0;              // ..then set SCK low again// ½«SCK½ÅÀ­µÍ.·¢ËÍһλÍê³É.}return(byte);             // return read byte  // ·µ»Ø״̬λ}uchar SPI_RW__0X07(void){uchar bit_ctr;uchar byte=0x07;for(bit_ctr=0;bit_ctr<8;bit_ctr++)   // output 8-bit    // Êä³ö 8 λ{MOSI = (byte & 0x80);         // output 'byte', MSB to MOSI   // ´ÓMOSI½ÅÊä³ö,´Ó¸ßλµ½µÍλ.µ±BYTE ×î¸ßλΪ1ʱÂß¼­ÔËËãΪ1,Êä³ö1.ÔËËãΪ0ʱÊä³ö0byte = (byte << 1);           // shift next bit into MSB..    // ×óÒÆ1λ.½«µÍλÏò¸ßλתÒÆ.SCK = 1;                      // Set SCK high..   // ½«SCK½ÅÀ­¸ß,byte |= MISO;         //byte=byte|MISO  capture current MISO bit // ´ÓMISO ÖжÁ³ö״̬λ´æÈëBYTEÖÐ.SCK = 0;              // ..then set SCK low again// ½«SCK½ÅÀ­µÍ.·¢ËÍһλÍê³É.}return(byte);             // return read byte  // ·µ»Ø״̬λ}uchar SPI_RW__0(void){uchar bit_ctr;uchar byte=0;for(bit_ctr=0;bit_ctr<8;bit_ctr++)   // output 8-bit    // Êä³ö 8 λ{MOSI = (byte & 0x80);         // output 'byte', MSB to MOSI   // ´ÓMOSI½ÅÊä³ö,´Ó¸ßλµ½µÍλ.µ±BYTE ×î¸ßλΪ1ʱÂß¼­ÔËËãΪ1,Êä³ö1.ÔËËãΪ0ʱÊä³ö0byte = (byte << 1);           // shift next bit into MSB..    // ×óÒÆ1λ.½«µÍλÏò¸ßλתÒÆ.SCK = 1;                      // Set SCK high..   // ½«SCK½ÅÀ­¸ß,byte |= MISO;         //byte=byte|MISO  capture current MISO bit // ´ÓMISO ÖжÁ³ö״̬λ´æÈëBYTEÖÐ.SCK = 0;              // ..then set SCK low again// ½«SCK½ÅÀ­µÍ.·¢ËÍһλÍê³É.}return(byte);             // return read byte  // ·µ»Ø״̬λ}/**************************************************Function: SPI_RW_Reg();  Description:  Writes value 'value' to register 'reg'/**************************************************/uchar SPI_RW_Reg(BYTE reg, BYTE value){uchar status;CSN = 0;                   // CSN low, init SPI transaction // CSΪµÍ,¿ªÊ¼SPI´«Êästatus = SPI_RW(reg);      // select register  // ´«ËÍÃüÁîÓëµØÖ·SPI_RW(value);             // ..and write value to it.. // д1 BYTE ÖµCSN = 1;                   // CSN high again    // Íê³ÉSPI´«Êäreturn(status);      // ·µ»Ø status        // return nRF24L01 status byte}/**************************************************/uchar SPI_RW_Reg__WRITE_REG_0X0F(void){uchar status;BYTE reg=0xE3;BYTE value=0x0F;CSN = 0;                   //status = SPI_RW(reg);     status=SPI_RW__WRITE_REG();//SPI_RW(value);      SPI_RW__0X0F();CSN = 1;                 return(status);    }uchar SPI_RW_Reg__0XEA_0XFF(void){uchar status;BYTE reg=0x27;BYTE value=0xFF;CSN = 0;                   //status = SPI_RW(reg);     status =SPI_RW__0X27();//SPI_RW(value);      SPI_RW__0XFF();CSN = 1;                 return(status);    }/**************************************************Function: SPI_Read();  Description:  Read one byte from nRF24L01 register, 'reg'/**************************************************/BYTE SPI_Read(BYTE reg){BYTE reg_val;CSN = 0;                // CSN low, initialize SPI communication...  // CSΪµÍ,¿ªÊ¼SPI´«ÊäSPI_RW(reg);            // Select register to read from..  // ÉèÖöÁµØÖ·reg_val = SPI_RW(0);    // ..then read registervalue  // ¶ÁÊý¾ÝCSN = 1;                // CSN high, terminate SPI communication   // Íê³ÉSPI´«Êäreturn(reg_val);        // return register value// ·µ»ØÊý¾Ý}/**************************************************/BYTE SPI_Read_STATUS(void){BYTE reg_val;BYTE reg=0x07;CSN = 0;                // CSN low, initialize SPI communication...  // CSΪµÍ,¿ªÊ¼SPI´«Êä//SPI_RW(reg);            // Select register to read from..  // ÉèÖöÁµØÖ·SPI_RW__0X07();//reg_val = SPI_RW(0);    // ..then read registervalue  // ¶ÁÊý¾Ýreg_val = SPI_RW__0();CSN = 1;                // CSN high, terminate SPI communication   // Íê³ÉSPI´«Êäreturn(reg_val);        // return register value// ·µ»ØÊý¾Ý}/**************************************************Function: SPI_Read_Buf();  Description:  Reads 'bytes' #of bytes from register 'reg'  Typically used to read RX payload, Rx/Tx address/**************************************************/uchar SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes){uchar status,byte_ctr;CSN = 0;                      // CSΪµÍ,¿ªÊ¼SPI´«Êä// Set CSN low, init SPI tranactionstatus = SPI_RW(reg);         // ´«Êä¶Á½ÓÊÕÊý¾ÝµÄÃüÁî.   // Select register to write to and read status bytefor(byte_ctr=0;byte_ctr<bytes;byte_ctr++)pBuf[byte_ctr] = SPI_RW(0);      // ¶Á 1 BYTEÊý¾Ý   // Perform SPI_RW to read byte from nRF24L01CSN = 1;                         // Êý¾Ý´«ËÍÍê³É. // Set CSN high againreturn(status);                    // return nRF24L01 status byte}/**************************************************/uchar SPI_Read_Buf__0x61_rx_buf_6(void){uchar status,byte_ctr;BYTE reg=0x61;BYTE *pBuf=rx_buf;  BYTE bytes=6;CSN = 0;                      // CSΪµÍ,¿ªÊ¼SPI´«Êä// Set CSN low, init SPI tranaction//status = SPI_RW(reg);         // ´«Êä¶Á½ÓÊÕÊý¾ÝµÄÃüÁî.   // Select register to write to and read status bytestatus = SPI_RW__0X61();         // ´«Êä¶Á½ÓÊÕÊý¾ÝµÄÃüÁî.   // Select register to write to and read status bytefor(byte_ctr=0;byte_ctr<bytes;byte_ctr++)pBuf[byte_ctr] = SPI_RW__0();      // ¶Á 1 BYTEÊý¾Ý   // Perform SPI_RW to read byte from nRF24L01//pBuf[byte_ctr] = SPI_RW(0);      // ¶Á 1 BYTEÊý¾Ý   // Perform SPI_RW to read byte from nRF24L01CSN = 1;                         // Êý¾Ý´«ËÍÍê³É. // Set CSN high againreturn(status);                    // return nRF24L01 status byte}/**************************************************Function: SPI_Write_Buf();  Description:  Writes contents of buffer '*pBuf' to nRF24L01  Typically used to write TX payload, Rx/Tx address/**************************************************/uchar SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes){uchar status,byte_ctr;CSN = 0;               // CSΪµÍ,¿ªÊ¼SPI´«Êä  // Set CSN low, init SPI tranactionstatus = SPI_RW(reg);  // ´«Êäд·¢ËÍÊý¾ÝµÄÃüÁî.  // Select register to write to and read status bytefor(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // ´«ËÍ·¢ËÍÊý¾Ý // then write all byte in buffer(*pBuf)SPI_RW(*pBuf++);CSN = 1;              // Êý¾Ý´«ËÍÍê³É.     // Set CSN high againreturn(status);          // return nRF24L01 status byte}//½ÓÊÕÅäÖú¯Êývoid RX_NRF24L01_Config(void){CE=0 ;//оƬʹÄÜCSN=1;//SPI½ûÄÜSCK=0;//SPIʱÖÓÏßÀ­¸ßCE=0 ;SPI_RW_Reg(WRITE_REG + EN_AA,0X01)    ;//ƵµÀ0×Ô¶¯£¬ackÓ¦´ðÔÊÐíSPI_RW_Reg(WRITE_REG + EN_RXADDR,0X01);//ÔÊÐípipe0SPI_RW_Reg(WRITE_REG +SETUP_AW,0X03)  ;//ÉèÖà 5Bytes µØÖ·¿í¶ÈSPI_RW_Reg(WRITE_REG + RF_CH, 0)      ;// ÉèÖÃÐŵÀ¹¤×÷Ϊ2.4GHZ£¬ÊÕ·¢±ØÐëÒ»ÖÂSPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);//ÉèÖ÷¢ÉäËÙÂÊΪ1MHZ£¬·¢É书ÂÊΪ×î´óÖµ0dBSPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);//ÉèÖà 5Bytes Êý¾Ý¿í¶ÈSPI_Write_Buf(WRITE_REG + RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);//д1ͨµÀ½ÓÊն˵ØÖ·SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F)  ;// IRQÊÕ·¢Íê³ÉÖжÏÏìÓ¦£¬CRCʹÄÜ¡¢16λCRC¡¢PWR_UP=1Éϵ硢PRIM_RX=1½ÓÊÕģʽCE=1;//}//½ÓÊÕÊý¾ÝBYTE NRF24L01_RxPacket(BYTE *rx_buf){uchar revale=0;SPI_RW_Reg(WRITE_REG + CONFIG,0X0F);CE=1;delay_ms(1);sta=SPI_Read(STATUS);if(RX_DR){CE=0;SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);revale=1; }SPI_RW_Reg(WRITE_REG + STATUS,sta);return revale;}void NRF24L01_RxPacket_part1(void)//111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111{//SPI_RW_Reg(WRITE_REG + CONFIG,0X0F);SPI_RW_Reg__WRITE_REG_0X0F();CE=1;}bit NRF24L01_RxPacket_part2(BYTE *rx_buf)//22222222222222222222222222222222222222222222222222222222222222222222222222222222222{bit r_sta=0;uchar bit_ctr;uchar byte=0xEA;uchar status;BYTE reg=0xEA;BYTE value=0xFF;sta=SPI_Read(STATUS);//sta=SPI_Read_STATUS();if(RX_DR){CE=0;                                           SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);//SPI_Read_Buf__0x61_rx_buf_6();r_sta=1; }//SPI_RW_Reg(WRITE_REG + STATUS,sta);//ÖжϺ¯ÊýÀstaÐβÎÎÞ·¨´«È뺯Êý£¡£¡£¡¹Ö£¡£¡£¡SPI_RW_Reg__0XEA_0XFF();return r_sta;}


0 0