stm32nrf为什么接收不到数据的问题!!!

2019-07-14 21:29发布

这是接收程序,就是接收不到数据,求各位大神一看!!
#include "nrf24l01.h"
#include "sys.h"
#include "delay.h"
#define uchar unsigned char
#define uint unsigned int
uchar TX_DATA[4];
uint8_t NRF24L01_RXDATA[RX_PLOAD_WIDTH];//nrf24l01½ÓÊÕµ½µÄÊý¾Ý
uint8_t NRF24L01_TXDATA[RX_PLOAD_WIDTH];//nrf24l01ÐèÒª·¢Ë͵ÄÊý¾Ý
u8  TX_ADDRESS[TX_ADR_WIDTH]= {0xE1,0xE2,0xE3,0xE4,0xE5};        //±¾µØµØÖ·
u8  RX_ADDRESS[RX_ADR_WIDTH]= {0xE1,0xE2,0xE3,0xE4,0xE5};        //½ÓÊÕµØÖ·
/*
*****************************************************************
* д¼Ä´æÆ÷
*****************************************************************
*/
uint8_t NRF_Write_Reg(uint8_t reg, uint8_t value)
{
        uint8_t status;
        SPI_CSN_L();                                          /* ѡͨÆ÷¼þ */
        status = Spi_RW(reg);  /* д¼Ä´æÆ÷µØÖ· */
        Spi_RW(value);                  /* дÊý¾Ý */
        SPI_CSN_H();                                          /* ½ûÖ¹¸ÃÆ÷¼þ */
  return         status;
}
/*
*****************************************************************
* ¶Á¼Ä´æÆ÷
*****************************************************************
*/
uint8_t NRF_Read_Reg(uint8_t reg)
{
        uint8_t reg_val;
        SPI_CSN_L();                                          /* ѡͨÆ÷¼þ */
        Spi_RW(reg);                          /* д¼Ä´æÆ÷µØÖ· */
        reg_val = Spi_RW(0);          /* ¶ÁÈ¡¸Ã¼Ä´æÆ÷·µ»ØÊý¾Ý */
        SPI_CSN_H();                                          /* ½ûÖ¹¸ÃÆ÷¼þ */
    return         reg_val;
}
/*
*****************************************************************
*
* д»º³åÇø
*
*****************************************************************
*/
uint8_t NRF_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uchars)
{
        uint8_t i;
        uint8_t status;
        SPI_CSN_L();                                        /* ѡͨÆ÷¼þ */
        status = Spi_RW(reg);        /* д¼Ä´æÆ÷µØÖ· */
        for(i=0; i<uchars; i++)
        {
                Spi_RW(pBuf[i]);                /* дÊý¾Ý */
        }
        SPI_CSN_H();                                                /* ½ûÖ¹¸ÃÆ÷¼þ */
    return         status;       
}
/*
*****************************************************************
* ¶Á»º³åÇø
*****************************************************************
*/
uint8_t NRF_Read_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uchars)
{
        uint8_t i;
        uint8_t status;
        SPI_CSN_L();                                                /* ѡͨÆ÷¼þ */
        status = Spi_RW(reg);        /* д¼Ä´æÆ÷µØÖ· */
        for(i=0; i<uchars; i++)
        {
                pBuf[i] = Spi_RW(0); /* ¶ÁÈ¡·µ»ØÊý¾Ý */        
        }
        SPI_CSN_H();                                                /* ½ûÖ¹¸ÃÆ÷¼þ */
    return         status;
}
/*
*****************************************************************
* дÊý¾Ý°ü
*****************************************************************
*/
void NRF_TxPacket(uint8_t * tx_buf, uint8_t len)
{       
        SPI_CE_L();                 //StandBy Iģʽ       
        NRF_Write_Buf(WR_TX_PLOAD, tx_buf, len);                          // ×°ÔØÊý¾Ý       
        SPI_CE_H();                 //ÖøßCE£¬¼¤·¢Êý¾Ý·¢ËÍ
}
void NRF_TxPacket_AP(uint8_t * tx_buf, uint8_t len)
{       
        SPI_CE_L();                 //StandBy Iģʽ       
        NRF_Write_Buf(0xa8, tx_buf, len);                          // ×°ÔØÊý¾Ý
        SPI_CE_H();                 //ÖøßCE
}
u8 Nrf24l01_Check(void)
{
        u8 buf1[5];
        u8 i;
        /*дÈë5¸ö×ֽڵĵØÖ·. */
        NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,5);
        /*¶Á³öдÈëµÄµØÖ· */
        NRF_Read_Buf(TX_ADDR,buf1,5);
        /*±È½Ï*/
        for(i=0;i<5;i++)
        {
                if(buf1[i]!=TX_ADDRESS[i])
                        break;
        }
        if(i==5)
                return SUCCESS ; //MCUÓëNRF³É¹¦Á¬½Ó
        else
                return ERROR ; //MCUÓëNRF²»Õý³£Á¬½Ó
}
void Nrf24l01_Init(u8 model)
{         
        SPI_CE_L();
        NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH);        //дRX½ÚµãµØÖ·
        NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);                 //дTX½ÚµãµØÖ·  
        NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x00);                                                                                                         //ʹÄÜͨµÀ0µÄ×Ô¶¯Ó¦´ð
        NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);                                                                                        //ʹÄÜͨµÀ0µÄ½ÓÊÕµØÖ·
        NRF_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x00);                                                                                        //ÉèÖÃ×Ô¶¯ÖØ·¢¼ä¸ôʱ¼ä:500us;×î´ó×Ô¶¯ÖØ·¢´ÎÊý:10´Î        
        NRF_Write_Reg(NRF_WRITE_REG+RF_CH,40);                                                                                                                //ÉèÖÃRFͨµÀΪCHANAL
        NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);                                                                                                 //ÉèÖÃTX·¢Éä²ÎÊý,0dbÔöÒæ,2Mbps,µÍÔëÉùÔöÒæ¿ªÆô
        if(model==1)                                //RX
        {
                NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);                                                                //Ñ¡ÔñͨµÀ0µÄÓÐЧÊý¾Ý¿í¶È
                NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0f);                    // IRQÊÕ·¢Íê³ÉÖжϿªÆô,16λCRC,Ö÷½ÓÊÕ
        }
        else if(model==2)                //TX
        {
                NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);                                                                //Ñ¡ÔñͨµÀ0µÄÓÐЧÊý¾Ý¿í¶È
                NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e);                    // IRQÊÕ·¢Íê³ÉÖжϿªÆô,16λCRC,Ö÷·¢ËÍ
        }
        else if(model==3)                //RX2
        {
                NRF_Write_Reg(FLUSH_TX,0xff);
                NRF_Write_Reg(FLUSH_RX,0xff);
                NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0f);                    // IRQÊÕ·¢Íê³ÉÖжϿªÆô,16λCRC,Ö÷½ÓÊÕ
               
                Spi_RW(0x50);
                Spi_RW(0x73);
                NRF_Write_Reg(NRF_WRITE_REG+0x1c,0x01);
                NRF_Write_Reg(NRF_WRITE_REG+0x1d,0x06);
        }
        else                                                                //TX2
        {
                NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e);                    // IRQÊÕ·¢Íê³ÉÖжϿªÆô,16λCRC,Ö÷·¢ËÍ
                NRF_Write_Reg(FLUSH_TX,0xff);
                NRF_Write_Reg(FLUSH_RX,0xff);
               
                Spi_RW(0x50);
                Spi_RW(0x73);
                NRF_Write_Reg(NRF_WRITE_REG+0x1c,0x01);
                NRF_Write_Reg(NRF_WRITE_REG+0x1d,0x06);
        }
        SPI_CE_H();
}
u8 NRF24L01_RxPacket(u8 *rxbuf)                         
{
          u8 state,flag;               
    state=NRF_Read_Reg(NRF_READ_REG+NRFRegSTATUS);
          NRF_Write_Reg(NRF_WRITE_REG+NRFRegSTATUS,state);
    if(NRFRegSTATUS&RX_DR)                                // ÅжÏÊÇ·ñ½ÓÊÕµ½Êý¾Ý
    {
           NRF_Read_Buf(RD_RX_PLOAD ,rxbuf,RX_PLOAD_WIDTH);// ´ÓRXFIFO¶ÁÈ¡Êý¾Ý ½ÓÊÕ4λ¼´¿É£¬ºóһλλ½áÊøÎ»                  
                 NRF_Write_Reg(FLUSH_RX,0xff);//ÓÃÓÚÇå¿ÕFIFO £¡£¡¹Ø¼ü£¡£¡²»È»»á³öÏÖÒâÏë²»µ½µÄºó¹û£¡£¡£¡´ó¼Ò¼Çס£¡
                 flag=1;
                return flag;
                }                
}
u8 rx_buf[32];       
extern unsigned char TX_DATA[4];
u8 NRF_Get_State(void)
{
u8 status;
status=NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS);
return status;
}
u8 NRF_Get_FIFOState(void)
{
u8 FIFO_status;
FIFO_status=NRF_Read_Reg(NRF_READ_REG + FIFO_STATUS);
return FIFO_status;
}
int main()
{         
  u8 sta,Flag;
  u8 FIFO_sta;       
        RCC_Init(); // ʱÖÓÅäÖÃ
        timer3_Init(); //¶¨Ê±Æ÷3³õʼ»¯
        USART1_Init();                // USART1³õʼ»¯
        Spi3_Init();
        Nrf24l01_Init(MODEL_RX);
        GPIO_Config();                       
        while(1)
        {       
                NRF24L01_RxPacket(rx_buf);
                sta=NRF_Get_State();
                FIFO_sta=NRF_Get_FIFOState();
                if (sta==0x40 || Flag==NRF24L01_RxPacket(rx_buf))
                {
                GPIO_SetBits(GPIOD, GPIO_Pin_13);       
                Delay_ms(500);
                GPIO_ResetBits(GPIOD, GPIO_Pin_13);
                Delay_ms(500);
          }
                if(rx_buf[0]==2||rx_buf[1]==1||rx_buf[2]==15)                                       
          {
   
                GPIO_ResetBits(GPIOG, GPIO_Pin_14);
                Delay_ms(500);
                GPIO_SetBits(GPIOG, GPIO_Pin_14);
                Delay_ms(500);
          }       
}
}
下面是发送程序,statue的值为0x2e,fifostatus的值为0x11
#include "nrf24l01.h"
#include "sys.h"
#include "delay.h"
#include "RCC_config.h"
#define uchar unsigned char
#define uint unsigned int
uchar TX_DATA[4];
uint8_t NRF24L01_RXDATA[RX_PLOAD_WIDTH];//nrf24l01½ÓÊÕµ½µÄÊý¾Ý
uint8_t NRF24L01_TXDATA[RX_PLOAD_WIDTH];//nrf24l01ÐèÒª·¢Ë͵ÄÊý¾Ý
u8  TX_ADDRESS[TX_ADR_WIDTH]= {0xE1,0xE2,0xE3,0xE4,0xE5};        //±¾µØµØÖ·
u8  RX_ADDRESS[RX_ADR_WIDTH]= {0xE1,0xE2,0xE3,0xE4,0xE5};        //½ÓÊÕµØÖ·
/*
*****************************************************************
* д¼Ä´æÆ÷
*****************************************************************
*/
uint8_t NRF_Write_Reg(uint8_t reg, uint8_t value)
{
        uint8_t status;
        SPI_CSN_L();                                          /* ѡͨÆ÷¼þ */
        status = Spi_RW(reg);  /* д¼Ä´æÆ÷µØÖ· */
        Spi_RW(value);                  /* дÊý¾Ý */
        SPI_CSN_H();                                          /* ½ûÖ¹¸ÃÆ÷¼þ */
  return         status;
}
/*
*****************************************************************
* ¶Á¼Ä´æÆ÷
*****************************************************************
*/
uint8_t NRF_Read_Reg(uint8_t reg)
{
        uint8_t reg_val;
        SPI_CSN_L();                                          /* ѡͨÆ÷¼þ */
        Spi_RW(reg);                          /* д¼Ä´æÆ÷µØÖ· */
        reg_val = Spi_RW(0);          /* ¶ÁÈ¡¸Ã¼Ä´æÆ÷·µ»ØÊý¾Ý */
        SPI_CSN_H();                                          /* ½ûÖ¹¸ÃÆ÷¼þ */
    return         reg_val;
}
/*
*****************************************************************
*
* д»º³åÇø
*
*****************************************************************
*/
uint8_t NRF_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uchars)
{
        uint8_t i;
        uint8_t status;
        SPI_CSN_L();                                        /* ѡͨÆ÷¼þ */
        status = Spi_RW(reg);        /* д¼Ä´æÆ÷µØÖ· */
        for(i=0; i<uchars; i++)
        {
                Spi_RW(pBuf[i]);                /* дÊý¾Ý */
        }
        SPI_CSN_H();                                                /* ½ûÖ¹¸ÃÆ÷¼þ */
    return         status;       
}
/*
*****************************************************************
* ¶Á»º³åÇø
*****************************************************************
*/
uint8_t NRF_Read_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uchars)
{
        uint8_t i;
        uint8_t status;
        SPI_CSN_L();                                                /* ѡͨÆ÷¼þ */
        status = Spi_RW(reg);        /* д¼Ä´æÆ÷µØÖ· */
        for(i=0; i<uchars; i++)
        {
                pBuf[i] = Spi_RW(0); /* ¶ÁÈ¡·µ»ØÊý¾Ý */        
        }
        SPI_CSN_H();                                                /* ½ûÖ¹¸ÃÆ÷¼þ */
    return         status;
}
/*
*****************************************************************
* дÊý¾Ý°ü
*****************************************************************
*/
void NRF_TxPacket(uint8_t * tx_buf, uint8_t len)
{       
        SPI_CE_L();                 //StandBy Iģʽ       
        NRF_Write_Buf(WR_TX_PLOAD, tx_buf, len);                          // ×°ÔØÊý¾Ý       
        SPI_CE_H();                 //ÖøßCE£¬¼¤·¢Êý¾Ý·¢ËÍ
}
void NRF_TxPacket_AP(uint8_t * tx_buf, uint8_t len)
{       
        SPI_CE_L();                 //StandBy Iģʽ       
        NRF_Write_Buf(0xa8, tx_buf, len);                          // ×°ÔØÊý¾Ý
        SPI_CE_H();                 //ÖøßCE
}
u8 Nrf24l01_Check(void)
{
        u8 buf1[5];
        u8 i;
        /*дÈë5¸ö×ֽڵĵØÖ·. */
        NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,5);
        /*¶Á³öдÈëµÄµØÖ· */
        NRF_Read_Buf(TX_ADDR,buf1,5);
        /*±È½Ï*/
        for(i=0;i<5;i++)
        {
                if(buf1[i]!=TX_ADDRESS[i])
                        break;
        }
        if(i==5)
                return SUCCESS ; //MCUÓëNRF³É¹¦Á¬½Ó
        else
                return ERROR ; //MCUÓëNRF²»Õý³£Á¬½Ó
}
void Nrf24l01_Init(u8 model)
{         
        SPI_CE_L();
        NRF_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,TX_ADDRESS,RX_ADR_WIDTH);        //дRX½ÚµãµØÖ·
        NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);                 //дTX½ÚµãµØÖ·  
        NRF_Write_Reg(NRF_WRITE_REG+EN_AA,0x00);                                                                                                         //ʹÄÜͨµÀ0µÄ×Ô¶¯Ó¦´ð
        NRF_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x00);                                                                                        //ʹÄÜͨµÀ0µÄ½ÓÊÕµØÖ·
        NRF_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x00);                                                                                        //ÉèÖÃ×Ô¶¯ÖØ·¢¼ä¸ôʱ¼ä:500us;×î´ó×Ô¶¯ÖØ·¢´ÎÊý:10´Î        
        NRF_Write_Reg(NRF_WRITE_REG+RF_CH,40);                                                                                                                //ÉèÖÃRFͨµÀΪCHANAL
        NRF_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);                                                                                                 //ÉèÖÃTX·¢Éä²ÎÊý,0dbÔöÒæ,2Mbps,µÍÔëÉùÔöÒæ¿ªÆô
        if(model==1)                                //RX
        {
                NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);                                                                //Ñ¡ÔñͨµÀ0µÄÓÐЧÊý¾Ý¿í¶È
                NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0f);                    // IRQÊÕ·¢Íê³ÉÖжϿªÆô,16λCRC,Ö÷½ÓÊÕ
        }
        else if(model==2)                //TX
        {
                NRF_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);                                                                //Ñ¡ÔñͨµÀ0µÄÓÐЧÊý¾Ý¿í¶È
                NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e);                    // IRQÊÕ·¢Íê³ÉÖжϿªÆô,16λCRC,Ö÷·¢ËÍ
        }
        else if(model==3)                //RX2
        {
                NRF_Write_Reg(FLUSH_TX,0xff);
                NRF_Write_Reg(FLUSH_RX,0xff);
                NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0f);                    // IRQÊÕ·¢Íê³ÉÖжϿªÆô,16λCRC,Ö÷½ÓÊÕ
               
                Spi_RW(0x50);
                Spi_RW(0x73);
                NRF_Write_Reg(NRF_WRITE_REG+0x1c,0x01);
                NRF_Write_Reg(NRF_WRITE_REG+0x1d,0x06);
        }
        else                                                                //TX2
        {
                NRF_Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e);                    // IRQÊÕ·¢Íê³ÉÖжϿªÆô,16λCRC,Ö÷·¢ËÍ
                NRF_Write_Reg(FLUSH_TX,0xff);
                NRF_Write_Reg(FLUSH_RX,0xff);
               
                Spi_RW(0x50);
                Spi_RW(0x73);
                NRF_Write_Reg(NRF_WRITE_REG+0x1c,0x01);
                NRF_Write_Reg(NRF_WRITE_REG+0x1d,0x06);
        }
        SPI_CE_H();
}
u8 NRF24L01_RxPacket(u8 *rxbuf)                         
{
          u8 state,flag;               
    state=NRF_Read_Reg(NRF_READ_REG+NRFRegSTATUS);
          NRF_Write_Reg(NRF_WRITE_REG+NRFRegSTATUS,state);
    if(NRFRegSTATUS&RX_DR)                                // ÅжÏÊÇ·ñ½ÓÊÕµ½Êý¾Ý
    {
           NRF_Read_Buf(RD_RX_PLOAD ,rxbuf,RX_PLOAD_WIDTH);// ´ÓRXFIFO¶ÁÈ¡Êý¾Ý ½ÓÊÕ4λ¼´¿É£¬ºóһλλ½áÊøÎ»                  
                 NRF_Write_Reg(FLUSH_RX,0xff);//ÓÃÓÚÇå¿ÕFIFO £¡£¡¹Ø¼ü£¡£¡²»È»»á³öÏÖÒâÏë²»µ½µÄºó¹û£¡£¡£¡´ó¼Ò¼Çס£¡
                 flag=1;
                return flag;
                }                
                return 0;
}
u8 rx_buf[32];       
u8 send[32]={2,1,15,3,6,4,7,8,9,0};
extern unsigned char TX_DATA[4];
u8 NRF_Get_State(void)
{
u8 status;
status=NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS);
return status;
}
u8 NRF_Get_FIFOState(void)
{
u8 FIFO_status;
FIFO_status=NRF_Read_Reg(NRF_READ_REG + FIFO_STATUS);
return FIFO_status;
}
int main()
{         
        u8 sta;
  u8 FIFO_sta;       
        RCC_Init(); // ʱÖÓÅäÖÃ
        Timer3_Init(); //¶¨Ê±Æ÷3³õʼ»¯
        USART1_Init();                // USART1³õʼ»¯       
        GPIO_Config();
        Spi2_Init();       
        Nrf24l01_Init(MODEL_TX);       
        while(1)
        {       
                while (1)
                {
                        if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_RESET)
                        {
                                NRF_TxPacket(send,10);
                                GPIO_ResetBits(GPIOF, GPIO_Pin_7);        /* µãÁÁLED0 */
                                Delay_ms(500);
                                Delay_ms(500);
                                break;
                        }               
                }
                while (1)
                {
                        if ((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET))                       
                        {
                                GPIO_SetBits(GPIOF, GPIO_Pin_7);        /* ¹Ø±ÕLED0 */                       
                                break;
                        }
                }
                sta=NRF_Get_State();
                FIFO_sta=NRF_Get_FIFOState();
                if (sta==0x2e)
                {
                         GPIO_ResetBits(GPIOF, GPIO_Pin_8);
                         Delay_ms(500);
                         GPIO_SetBits(GPIOF, GPIO_Pin_8);
                         Delay_ms(500);
                         GPIO_ResetBits(GPIOF, GPIO_Pin_9);
                         Delay_ms(500);
                         GPIO_SetBits(GPIOF, GPIO_Pin_9);
                         Delay_ms(500);
                }               
                if (FIFO_sta==0x11)
    {
                         int i;
                   for (i=0;i<100;i++)
                        {
                         GPIO_ResetBits(GPIOF, GPIO_Pin_6);
                         Delay_ms(100);
                         GPIO_SetBits(GPIOF, GPIO_Pin_6);
                         Delay_ms(100);
                         }
        }
0条回答

一周热门 更多>