problem with NRF24L01

Discussion about wireless devices

problem with NRF24L01

Postby scolioza » Tue Dec 31, 2013 6:09 am

HI all.

I am working on school project. The project consist in setting up a communication link between 2 NRF24L01. I am using 2 PIC 16F877A as uCs and the ide for programming is CCS C. I am not allowed to use any already written libs so i started to buil my own functions. And here comes the problem:
On the TX side i am able to receive the interrupt caused by MAX_RTR, and i also see the full TX_FIFO flag, but on the RX side i see nothing. It is verry frustrating beacause a read the datasheet and other tutorials and everything seems to be set corectly. I will post my code here and I will be very greatful if anyone could give some advice or hint. Thank you in advance. Here is the code:
Code: Select all

#include <main.h>
#include <nrf24l01.h>               
#define IRQ     PIN_B0
#define CSN     PIN_B1                                               
#define CE      PIN_B2                                 
#use            rs232(uart1)
#use            fast_io(B)       
 
unsigned int buffer[5];

int1 flag=0;
 //ISR RB0
 #INT_EXT
void RB0_isr(){                                                                                               
   flag=1;                                                             
   clear_interrupt(int_ext);           
  }
 //WRITE 1 BYTE REGISTER                                     
void setup_1b(int val,unsigned int reg){
   output_low(CSN);     
   spi_write(W_REGISTER|reg);             
   spi_write(val);                           
   output_high(CSN);               
}
 //READ 1 BYTE REGISTER
int read_1b(unsigned int reg){             
   unsigned int reg_val;                                         
   output_low(CSN);                       
   spi_write(R_REGISTER|reg);                                                                               
   spi_write(NOP);                               
   reg_val=spi_read();
   output_high(CSN);
   return reg_val;
}           
//WRITE 5 BYTE REGISTER
void setup_5b(unsigned int v0,unsigned int v1,unsigned int v2,unsigned int v3,unsigned int v4,int reg){
   int i;
   int values[5];
   values[0]=v0;
   values[1]=v1;                                                 
   values[2]=v2;                                     
   values[3]=v3;                                               
   values[4]=v4;
   output_low(CSN);
   spi_write(W_REGISTER|reg);   
   for(i=0;i<5;i++){
      spi_write(values[i]);
   }
   output_high(CSN); 

//READ 5 BYTE REGISTER                         
void read_5b(int reg){               
   int i;
   output_low(CSN);
   spi_write(W_REGISTER|reg);
   for(i=0;i<5;i++){     
      spi_write(NOP);
      buffer[i]=spi_read(0);
   }
}
//PRINT DATA FOR DEBUG ON SERIAL                     
void serial_out(int reg,int1 width){       
    int i;
    if(!width){
      int reg_value=read_1b(reg);
      printf("Valoarea registrului %u este %u",reg,reg_value);
      putc(13);   
    }
    else{
      read_5b(reg);
      printf("Registrului %u are valorile:",reg);
      putc(13);
      for(i=0;i<5;i++){
        printf("BYTE%d=%u",i,buffer[i]);
        putc(13);
      }                             
    }                 
    delay_ms(500);
}                                             
// SET 1 BIT FROM REGISTER
void set_1bit(int bit_to_set,int reg){
   int buff_reg=read_1b(reg);
   int test=1<<bit_to_set;
   buff_reg =buff_reg|test;                                               
   setup_1b(buff_reg,reg);                           
}
// CLEAR 1 BIT FROM REGISTER
void clear_1bit(int bit_to_clear,int reg){
   int buff_reg=read_1b(reg);
   buff_reg=((~(1<<bit_to_clear))&buff_reg);               
   setup_1b(buff_reg,reg);                                             
}                                                   
// READ 1 BIT FROM REGISTER                                     
int1 read_1bit(int bit_to_read,int reg){
   int test = 1<<bit_to_read;
   int buff_reg=read_1b(reg);           
   test=((test & buff_reg))>>bit_to_read;               
   return test;                                                 
}
// CHECK STATUS INTERRUPT
int status_int_source(){                       
   int int_source=0b01110000;
   int buff=read_1b(STATUS);
   int_source=int_source&buff;
   return int_source;
}
// SEND DATA -- TX_MODE                           
void tx_mode(int data){
   //flush tx_fifo
   output_low(CSN);
   spi_write(FLUSH_TX);             
   output_high(CSN);
   output_low(CE);                                                                                                           
   //clear status flags
   setup_1b(V_RX_DR|V_TX_DS|V_MAX_RT,STATUS);       
   // fill tx_fifo
   output_low(CSN);
   spi_write(W_TX_PAYLOAD);                     
   spi_write(data);   
   output_high(CSN);
   delay_ms(10);
   // activate tx_mode               
   setup_1b(V_EN_CRC|V_CRCO|V_PWR_UP,CONFIG);       
   delay_us(150);
   // now transmit data                     
   output_high(CE); 
   delay_us(20);   
   output_low(CE);   
   delay_ms(10);
   while(flag==0){                                 
   }
   // check STATUS 
   if(flag==1){
      int int_bit = status_int_source();         
      switch (int_bit){   
         case 32:
         printf("TX ok!!");             
         set_1bit(TX_DS,STATUS);
         flag=0;                         
         break;
         case 16:                                                                                                                 
         printf("MAX_RT!!");
         putc(13);                                     
         set_1bit(MAX_RT,STATUS);
         break;               
      }                           
   }                 
}                                               
// RECIEVE DATA -- RX_MODE
void rx_mode(){                           
   // clear STATUS
   setup_1b(V_RX_DR|V_TX_DS|V_MAX_RT,STATUS);       
   // set rx_mode
   setup_1b(V_EN_CRC|V_CRCO|V_PWR_UP|V_PRIM_RX,CONFIG);
   output_high(CE);
   delay_us(150);                                   
  // while(flag==0){                       
   //}
   if(flag==1){                             
      output_low(CE);           
      // read the payload             
      output_low(CSN);
      spi_write(R_RX_PAYLOAD);
      int data=spi_read();                                                                                                   
      output_high(CSN);
      output_high(CE);           
      //set_1bit(RX_DR,STATUS);
      output_d(data);
   }                   
}             

// SETUP PIC REGISTERS                                 
void setup_pic(){
   printf("SE SETEAZA REG PIC");
   putc(13);
   SET_TRIS_B(0b00000001);
   SET_TRIS_D(0b00000000);         
   output_d(0);                     
   output_high(CSN);                     
   setup_comparator(NC_NC_NC_NC);                   
   setup_adc(ADC_OFF);                     
   disable_interrupts(GLOBAL);               
   enable_interrupts(INT_EXT);
   ext_int_edge(H_TO_L);
   enable_interrupts(GLOBAL);
   clear_interrupt(INT_EXT);
   setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_XMIT_L_TO_H|SPI_CLK_DIV_4|SPI_SAMPLE_AT_END); //setare spi mod0 , 2MHZ     
   setup_uart(9600); // baud rate UART
   output_b(0);   
}
//SETUP NRF24L01 REGISTERS                                     
void setup_NRF24L01(){
   printf("SE SETEAZA REG NRF");
   putc(13);
   //setup EN_AA -- auto ack on pipe0                                   
   setup_1b(V_ENAA_P0, EN_AA);
   //setup EN_RXADDR -- pipe0 enabled           
   setup_1b(V_ERX_P0,EN_RXADDR);                                                                                           
   //setup SETUP_AW -- 5 bytes width in pipe0
   setup_1b(V_AW,SETUP_AW);
   //setup SETUP_RETR -- 15 retries, wait 500us before retransmit ;
   int V_ARC=15 ,V_ARD =16;           
   setup_1b(V_ARC|V_ARD,SETUP_RETR);
   //setup RF_CH -- channel 100;
   int V_RF_CH = 87;
   setup_1b(V_RF_CH,RF_CH);                                                   
   //setup RF_SETUP -- max. power, 250Kb rate
   setup_1b(V_RF_DR|V_RF_PWR,RF_SETUP);
   //setup RX_ADDR_P0 -- 0xB1B1B1B1B1                                                                                 
   setup_5b(0XB1,0XB1,0XB1,0XB1,0XB1,RX_ADDR_P0);
   //setup TX_ADDR -- 0xB1B1B1B1B1
   setup_5b(0XB1,0XB1,0XB1,0XB1,0XB1,TX_ADDR);
   //setup RX_PW_P0 -- 1 byte         
   int V_RX_PW_P0=1;                         
   setup_1b(V_RX_PW_P0,RX_PW_P0);
}                                                                                                                               
 //                                                             
                                       
void read_all(){
  serial_out(CONFIG,0);                                       
  serial_out(EN_AA ,0);           
  serial_out(EN_RXADDR,0);
  serial_out(SETUP_AW,0);                             
  serial_out(RF_CH,0);
  serial_out(RX_PW_P0,0);           
                       
                                       
}                             
                                                                                                                                   
void main()                                     
{                                                           
setup_pic();                                                                                                                   
setup_NRF24L01();                         
read_all();                           
                                                                           
   while(TRUE)                                       
   {               
     
     flag=0;                               
     tx_mode(129);                                     
     //rx_mode();
     clear_1bit(0,CONFIG);
     read_all();
     delay_us(150);
     
   }                                 
                                           
}                                       


and here is the header for the 24L01:
Code: Select all


/* Memory Map */
#define CONFIG      0x00
#define EN_AA       0x01
#define EN_RXADDR   0x02
#define SETUP_AW    0x03
#define SETUP_RETR  0x04
#define RF_CH       0x05
#define RF_SETUP    0x06
#define STATUS      0x07
#define OBSERVE_TX  0x08
#define CD          0x09
#define RX_ADDR_P0  0x0A
#define RX_ADDR_P1  0x0B
#define RX_ADDR_P2  0x0C
#define RX_ADDR_P3  0x0D
#define RX_ADDR_P4  0x0E
#define RX_ADDR_P5  0x0F
#define TX_ADDR     0x10
#define RX_PW_P0    0x11
#define RX_PW_P1    0x12
#define RX_PW_P2    0x13
#define RX_PW_P3    0x14
#define RX_PW_P4    0x15
#define RX_PW_P5    0x16
#define FIFO_STATUS 0x17
#define DYNPD            0x1C
#define FEATURE            0x1D

/* Bit Mnemonics */
#define MASK_RX_DR  6
#define V_MASK_RX_DR  1<<6
#define MASK_TX_DS  5
#define V_MASK_TX_DS  1<<5
#define MASK_MAX_RT 4
#define V_MASK_MAX_RT 1<<4
#define EN_CRC      3
#define V_EN_CRC      1<<3
#define CRCO        2
#define V_CRCO        1<<2
#define PWR_UP      1
#define V_PWR_UP      1<<1
#define PRIM_RX     0
#define V_PRIM_RX        1
#define ENAA_P5     5
#define V_ENAA_P5     1<<5
#define ENAA_P4     4
#define V_ENAA_P4     1<<4
#define ENAA_P3     3
#define V_ENAA_P3     1<<3
#define ENAA_P2     2
#define V_ENAA_P2     1<<2
#define ENAA_P1     1
#define V_ENAA_P1     1<<1
#define ENAA_P0     0
#define V_ENAA_P0        1
#define ERX_P5      5
#define V_ERX_P5      1<<5
#define ERX_P4      4                   
#define V_ERX_P4      1<<4
#define ERX_P3      3
#define V_ERX_P3      1<<3
#define ERX_P2      2
#define V_ERX_P2      1<<2
#define ERX_P1      1
#define V_ERX_P1      1<<1
#define ERX_P0      0
#define V_ERX_P0         1
#define AW          0
#define V_AW             3
#define ARD         4
//#define V_ARD         1<<4
#define ARC         0
//#define V_ARC            1
#define PLL_LOCK    4
#define V_PLL_LOCK    1<<4
#define RF_DR       3
#define V_RF_DR     32
#define RF_PWR      6
#define V_RF_PWR    6           
#define RX_DR       6
#define V_RX_DR       1<<6
#define TX_DS       5
#define V_TX_DS       1<<5
#define MAX_RT      4   
#define V_MAX_RT      1<<4
#define RX_P_NO     1                     
#define V_RX_P_NO     1<<1
#define TX_FULL     0
#define V_TX_FULL        1
#define PLOS_CNT    4
#define V_PLOS_CNT    1<<4
#define ARC_CNT     0
#define V_ARC_CNT        1
#define TX_REUSE    6
#define V_TX_REUSE    1<<6
#define FIFO_FULL   5
#define V_FIFO_FULL   1<<5
#define TX_EMPTY    4
#define V_TX_EMPTY    1<<4
#define RX_FULL     1
#define V_RX_FULL     1<<1
#define RX_EMPTY    0
#define V_RX_EMPTY       1
#define DPL_P5            5
#define DPL_P4            4
#define DPL_P3            3
#define DPL_P2            2
#define DPL_P1            1
#define DPL_P0            0
#define EN_DPL            2
#define EN_ACK_PAY  1
#define EN_DYN_ACK  0

/* Instruction Mnemonics */
#define R_REGISTER    0x00
#define W_REGISTER    0x20
#define REGISTER_MASK 0x1F
#define ACTIVATE      0x50
#define R_RX_PL_WID   0x60
#define R_RX_PAYLOAD  0x61
#define W_TX_PAYLOAD  0xA0
#define W_ACK_PAYLOAD 0xA8
#define FLUSH_TX      0xE1
#define FLUSH_RX      0xE2
#define REUSE_TX_PL   0xE3
#define NOP           0xFF

/* Non-P omissions */                                 
#define LNA_HCURR   0

/* P model memory Map */
#define RPD         0x09

/* P model bit Mnemonics */
#define RF_DR_LOW   5
#define RF_DR_HIGH  3
#define RF_PWR_LOW  1
#define RF_PWR_HIGH 2

scolioza
 
Posts: 1
Joined: Tue Dec 31, 2013 5:33 am

Return to Wireless

Who is online

Users browsing this forum: No registered users and 2 guests

cron