TI中文支持网
TI专业的中文技术问题搜集分享网站

关于NRF24L01模块的bug

nrf24l01.c

#include "NRF24L01.h"
#include "delay.h"
unsigned char  sta;   //״̬±êÖ¾
unsigned char  TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //±¾µØµØÖ·
unsigned char  RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //½ÓÊÕµØÖ·
unsigned char  Tx_Buf[TX_PLOAD_WIDTH]= {0x00}; //·¢ËÍÊý¾Ý
unsigned char  Rx_Buf[RX_PLOAD_WIDTH]= {0x00}; //½ÓÊÕÊý¾Ý
void NrfInit(void)
{
ROM_SysCtlPeripheralEnable(Nrf24l01Per1);
// ROM_SysCtlPeripheralEnable(Nrf24l01Per2);
ROM_SysCtlPeripheralEnable(Nrf24l01Per3);
/***************************ÊäÈëÅäÖÃ******************************/
ROM_GPIODirModeSet(Nrf24l01PORT1,Nrf24l01MISO,GPIO_DIR_MODE_IN);
GPIOPadConfigSet(Nrf24l01PORT1, Nrf24l01MISO, GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD_WPU);     
/***************************Êä³öÅäÖÃ******************************/
ROM_GPIODirModeSet(Nrf24l01PORT1, Nrf24l01SCK|Nrf24l01SS|Nrf24l01MOSI, GPIO_DIR_MODE_OUT);
GPIOPadConfigSet  (Nrf24l01PORT1, Nrf24l01SCK|Nrf24l01SS|Nrf24l01MOSI, GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD); 
ROM_GPIODirModeSet(Nrf24l01PORT3, Nrf24l01CE, GPIO_DIR_MODE_OUT);
GPIOPadConfigSet  (Nrf24l01PORT3, Nrf24l01CE, GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD); 
    Hign_24L01_CSN;
    Low_24L01_CE;
    Low_24L01_SCK;
    delayms(250);
}
/************************************IO ¿ÚÄ£ÄâSPI×ÜÏß ´úÂë************************************************/
unsigned char SPI_RW(unsigned char byte)
{
    unsigned char bit_ctr;
    for(bit_ctr=0; bit_ctr<8; bit_ctr++)
    {
        // MOSI=(byte&0x80);
        if(byte&0x80)
        {
            Hign_24L01_MOSI;
        }
        else
        {
            Low_24L01_MOSI;
        }
        //delayus(10);
        byte=(byte<<1);
        Hign_24L01_SCK;        //ÉÏÉýÑØ
        //delayus(10);
        if(Read_24L01_MISO)        //MISO
            byte+=1;          //ͬʱÓÃÒ»¸ö±äÁ¿À´Íê³ÉÊպͷ¢¡£
        Low_24L01_SCK;      //ϽµÑØ
        //delayus(10);
    }
    return(byte);         //·µ»ØÊÕµ½µÄÊý¾Ý
}
unsigned char SPI_RW_Reg  (unsigned char  reg,unsigned char value) // Ïò¼Ä´æÆ÷REGдһ¸ö×Ö½Ú£¬Í¬Ê±·µ»Ø״̬×Ö½Ú
{
    unsigned char status;
// CSN=0;
    Low_24L01_CSN;
    status=SPI_RW(reg);
    SPI_RW(value);
// CSN=1;
    Hign_24L01_CSN;
    return(status);
}
unsigned char SPI_Read (unsigned char  reg )
{
    unsigned char reg_val;
    //CSN=0;
    Low_24L01_CSN;
    SPI_RW(reg);
    reg_val=SPI_RW(0);
    //CSN=1;
    Hign_24L01_CSN;
    return(reg_val);
}
unsigned char SPI_Write_Buf(unsigned char reg, unsigned char *pBuf, unsigned char bytes)
{
    unsigned char status,byte_ctr;
    //CSN = 0;                   // Set CSN low, init SPI tranaction
    Low_24L01_CSN;
    status = SPI_RW(reg);    // Select register to write to and read status byte
    for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // then write all byte in buffer(*pBuf)
        SPI_RW(*pBuf++);
    //CSN = 1;
    Hign_24L01_CSN;              // Set CSN high again
    return(status);          // return nRF24L01 status byte
}
/*******************************½Ó*****ÊÕ*****Ä£*****ʽ*****´ú*****Âë*************************************/
unsigned char SPI_Read_Buf(unsigned char reg, unsigned char *pBuf, unsigned char uchars)
{
    unsigned char status,uchar_ctr;
//CSN = 0;                      // Set CSN low, init SPI tranaction
    Low_24L01_CSN;
    status = SPI_RW(reg);         // Select register to write to and read status unsigned char
    for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++)
        pBuf[uchar_ctr] = SPI_RW(0);    //
//CSN = 1;
    Hign_24L01_CSN;
    return(status);                    // return nRF24L01 status uchar
}
/******************************************************************************************************/
//º¯Êý£ºunsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
//¹¦ÄÜ£ºÊý¾Ý¶ÁÈ¡ºó·ÅÈçrx_buf½ÓÊÕ»º³åÇøÖÐ
/******************************************************************************************************/
unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
{
    unsigned char revale=0;
    sta=SPI_Read(STATUS); // ¶Áȡ״̬¼Ä´æÆäÀ´ÅжÏÊý¾Ý½ÓÊÕ×´¿ö
    if(RX_DR)    // ÅжÏÊÇ·ñ½ÓÊÕµ½Êý¾Ý
    {
        //CE = 0;    //SPIʹÄÜ
        SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
        revale =1;   //¶ÁÈ¡Êý¾ÝÍê³É±êÖ¾
        //delay(100);
    }
    SPI_RW_Reg(NRF24L01WRITE_REG+STATUS,sta);   //½ÓÊÕµ½Êý¾ÝºóRX_DR,TX_DS,MAX_PT¶¼ÖøßΪ1£¬Í¨¹ýд1À´Çå³þÖжϱêÖ¾
    return revale;
}
void TX_Mode(void)
{
//CE=0;
    Low_24L01_CE;
    SPI_RW_Reg(FLUSH_TX,0x00);
    SPI_Write_Buf(NRF24L01WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // Writes TX_Address to nRF24L01
    SPI_Write_Buf(NRF24L01WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack
    SPI_RW_Reg(NRF24L01WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0
    SPI_RW_Reg(NRF24L01WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0
    SPI_RW_Reg(NRF24L01WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans…1a
    SPI_RW_Reg(NRF24L01WRITE_REG + RF_CH, 40);        // Select RF channel 40
    SPI_RW_Reg(NRF24L01WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR
    SPI_RW_Reg(NRF24L01WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //ÉèÖýÓÊÕÊý¾Ý³¤¶È£¬±¾´ÎÉèÖÃΪ2×Ö½Ú
    SPI_RW_Reg(NRF24L01WRITE_REG + CONFIG, 0x0e);
//CE=1;
    Hign_24L01_CE;
    delayms(100);
}
void Transmit(unsigned char * tx_buf)
{
//CE=0;   //StandBy Iģʽ
    Low_24L01_CE;
    SPI_Write_Buf(NRF24L01WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // ×°ÔؽÓÊն˵ØÖ·
    SPI_RW_Reg(FLUSH_TX,0x00);
    SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // ×°ÔØÊý¾Ý
    SPI_RW_Reg(NRF24L01WRITE_REG + CONFIG, 0x0e);      // IRQÊÕ·¢Íê³ÉÖжÏÏìÓ¦£¬16λCRC£¬Ö÷·¢ËÍ
//CE=1;   //ÖøßCE£¬¼¤·¢Êý¾Ý·¢ËÍ
    Hign_24L01_CE;
delayms(10);
}
/****************************************************************************************************/
//º¯Êý£ºvoid RX_Mode(void)
//¹¦ÄÜ£ºÊý¾Ý½ÓÊÕÅäÖÃ
/****************************************************************************************************/
void RX_Mode(void)
{
//CE=0;
    Low_24L01_CE;
    SPI_RW_Reg(FLUSH_RX,0x00);
//SPI_Write_Buf(NRF24L01WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // Writes TX_Address to nRF24L01
    SPI_Write_Buf(NRF24L01WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack
    SPI_RW_Reg(NRF24L01WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0
    SPI_RW_Reg(NRF24L01WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0
    //SPI_RW_Reg(NRF24L01WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans…1a
    SPI_RW_Reg(NRF24L01WRITE_REG + RF_CH, 40);        // Select RF channel 40
    SPI_RW_Reg(NRF24L01WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //ÉèÖýÓÊÕÊý¾Ý³¤¶È£¬±¾´ÎÉèÖÃΪ2×Ö½Ú
    SPI_RW_Reg(NRF24L01WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR
    SPI_RW_Reg(NRF24L01WRITE_REG + CONFIG, 0x0F);
    Hign_24L01_CE;
    delayms(130);   //ºÃÏñûÓÐÒ²¿ÉÒÔ£¬AVR 22.1184M
}
然后是发送模块的主函数

u8 tx_Buf[32]={0x00};
int SysInit(void)
{
//  u8 dmp_status;
 SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL |SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);//Ö÷ƵÅäÖÃΪ400/2/4 = 50
 /**************************´®¿Ú³õʼ»¯*******************************/
 UART0_Init(115200);
 printf("……..UART_Success…….\r\n");
 /**************************°´¼ü³õʼ»¯*******************************/
 key_Init();
//  /**************************LCD5110³õʼ»¯*******************************/
//  LCD_init();
//  LcdPutString(0,0,"MODE:");//ģʽ2
 /**************************NRF³õʼ»¯*********************************************/
 NrfInit();
 TX_Mode();
}
int  main (void)
{
// u8 distance;
// u8 angle;
// u8 i=0;
//
SysInit();
  while (1) 
{

 tx_Buf[0] = 9;
 Transmit(tx_Buf);
 printf("·¢Ë͵ÄΪ%d\r\n",tx_Buf[0]);
 DELAY_MS(1000);

  }
  
 }   
接受端不停的发送同一个数据
接收模块

SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL |SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);//Ö÷ƵÅäÖÃΪ200/2.5=80M
/**************************´串口初始化¯*******************************/
UART0_Init(115200);
printf("……..UART_Success…….\r\n");

/**************************NRF³õʼ»¯*********************************************/
NrfInit();
RX_Mode();

while(rx_Buf[0]==0)
{ nRF24L01_RxPacket(rx_Buf);
}
printf("%d\r\n",rx_Buf[0]);
rx_Buf[0] =0;
printf("NRF24L01…success…..");

接收模块一直等待接受直到有值输入 

实际调试过程中,只有将发送模块重新上电 才有输出 。且一次输出后,接收端复位并没有输出,只能再次将发送模块断电,发送模块若只是复位不重新上电也没有用。

请问有没有人遇到过这种问题 怎么解决的?

xyz549040622:

你的接收模块和发射模块都是好的嘛?有没有经过测试呢?

赞(0)
未经允许不得转载:TI中文支持网 » 关于NRF24L01模块的bug
分享到: 更多 (0)