This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

nrf24l01+ and msp430

Other Parts Discussed in Thread: MSP430G2553, CC2650

hello there i am interfacing nrf24l01+ with msp430g2553 at transmitter side and at receiver side. now  my CSN pin is P1.4, CE is P1.3, CLK is P1.5, SIMO is P1.7, SOMI is p1.6. IRQ is P2.0. now i am transmitting 'r'. at receiver i am getting 'r'. but after that if i am transmitting 's'. i am receiving 'r'. so it is my problem. my codes are below.

// Transmitter side ///


#include <msp430.h>
#include "nrf24l01.h"
#include <stdio.h>

#define   PAYLOAD_SIZE   5

void CE_LOW(void);
void CSN_HIGH (void);
void CSN_LOW (void);
void CE_HIGH(void);
unsigned char SPI_SendByte(unsigned char);
void Delay (unsigned long);

unsigned char SPI_Send_command_with_ADDR (unsigned char, unsigned char,
unsigned char);

unsigned char SPI_Send_command_without_ADDR (unsigned char, unsigned char);
unsigned char SPI_Send_command_without_ADDR_M (unsigned char, unsigned char,unsigned char);


void NRF_prepareForTransmit(void);

void nrf_read_all(void);

  unsigned char RX_ADDRESS_P0[5] = {5,6,7,8,9};
  unsigned char RX_ADDRESS_P1[5] = {0,1,2,3,4};
    //WE CAN SET FOLLOWING BY PROVIDING LAST BYTE 5,6,7 & 8 IN CORROSPONDING REGISTER
    // THAT IS RX_ADDRESS_P2[5]={0,1,2,3,5};
    // THAT IS RX_ADDRESS_P3[5]={0,1,2,3,6};
    // THAT IS RX_ADDRESS_P4[5]={0,1,2,3,7};
    // THAT IS RX_ADDRESS_P5[5]={0,1,2,3,8};

  unsigned char TX_ADDRESS[5] = {5,6,7,8,9};
  unsigned char ADDRESS[5];

  unsigned char a[5],b[5];
  unsigned char r;

  unsigned char in=0,status,flag=0,ccmd,aaddr,ddata_byte,ttemp=0X00,ccommand,status_temp,byte;
  unsigned int i,counter=0;

  unsigned char MST_Data,SLV_Data;
  unsigned char temp;
  long retransmited=0;
#define CSN_TIME 100
#define CE_HIGH_TIME 1000



  // Nordic variables

  unsigned char nrf_configuration,nrf_enable_auto_ack,nrf_enable_rxaddr,nrf_setup_aw_reg,nrf_setup_retr_reg;
  unsigned char nrf_rf_ch_reg=0,nrf_rf_setup_reg,nrf_status_reg,nrf_observe_tx_reg;
  unsigned char nrf_rx_pw_p0_reg,nrf_fifo_status_reg,nrf_cd_reg;
  unsigned char nrf_rx_pw_p1_reg,nrf_rx_pw_p2_reg,nrf_rx_pw_p3_reg,nrf_rx_pw_p4_reg,nrf_rx_pw_p5_reg;


  unsigned char nrf_pipe0_addr_reg[5];
  unsigned char nrf_pipe1_addr_reg[5];
  unsigned char nrf_pipe2_addr_reg;
  unsigned char nrf_pipe3_addr_reg;
  unsigned char nrf_pipe4_addr_reg;
  unsigned char nrf_pipe5_addr_reg;
  unsigned char nrf_tx_addr_reg[5];


void main()
{


 	 WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer

	 // P1OUT |= 0x02;                            // Set P1.0 for LED
	 P2DIR = BIT3+BIT4+BIT5;                                          // Set P1.1 for slave reset
	  P1DIR |= BIT0+BIT1+BIT2;                            // Set P1.0-2 to output direction
	  P1SEL |= BIT5+BIT6+BIT7;
	  P1SEL2 |= BIT5+BIT6+BIT7;                          // P4.4,5 option select
	  P1DIR |= BIT5+BIT7;
	  P1DIR &= ~BIT6;
	  P1DIR |= BIT3 | BIT4; // P4.1 (#CS) and P4.2 (CE) are outputs
	  P2DIR &= ~BIT0; // P2.0 (IRQ) is input

	    P2REN |= BIT0;
	    P2OUT |= BIT0;

	    P2IN |= BIT0;

	  //P2SEL |= BIT7;                            // P2.7 option select

	  //p4.0 = uca1clk, p4.4 = uca1simo , p4.5 = uca1miso
	  //P4.1= CSN, P4.2 = CE,


//	  P5SEL |= BIT1 | BIT2 | BIT3; // P5.1-3 SPI option select
//	  P5DIR |= BIT1 | BIT3; // P5.1 (MOSI) and P5.3 (CLK) are outputs
//	  P5DIR &= ~BIT2; // P5.2 (MISO) is input
//	  P5DIR |= BIT0 | BIT4; // P5.4 (#CS) and P5.0 (CE) are outputs
//	  P1DIR &= ~BIT6; // P1.6 (IRQ) is input


	  UCB0CTL1 |= UCSWRST;                      // **Put state machine in reset**

	  UCB0CTL0 |= UCMST+UCSYNC+UCCKPH+UCMSB;    // 3-pin, 8-bit SPI master

	  // Initialize SPI interface
	  // master mode, data valid on rising edge, msb first(Because NRF24L01
	  //wants MSB First)
	  //UCB1CTL0 = UCCKPH + UCMST + UCMSB + UCSYNC;

	    UCB0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC;
		UCB0CTL1 |= UCSSEL_2;   // SMCLK

		// (4)
		UCB0CTL1 &= ~UCSWRST;

	  // UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt

	  for(i=5000;i>0;i--);                        // Wait for slave to initialize
	  for(i=50000;i>0;i--);                        // Wait for slave to initialize
	  for(i=50000;i>0;i--);                        // Wait for slave to initialize
	  for(i=50000;i>0;i--);                        // Wait for slave to initialize
	  for(i=50000;i>0;i--);                        // Wait for slave to initialize


 // Disable CS
  CSN_HIGH();

 // Configure chip nRF24L01

// Discard transmission
  CE_LOW();

/*
  Delay(10000);
  Delay(10000);
  Delay(10000);



  Delay(10000);
  Delay(10000);
  Delay(10000);

  //Write CONFIG register (addres - 0x00)
  //00011111 - CRC enable, power-up, RX
    status = SPI_Send_command_with_ADDR(W_REGISTER,CONFIG_REG_ADDR, 0x02);

    Delay(10000);
    Delay(10000);
    Delay(10000);
    Delay(10000);
    Delay(10000);
    Delay(10000);

  */
  //Flush tx buffer
  /*
  status = SPI_Send_command_without_ADDR(0xFF,0xFF);
       if ((status & MAX_RT) != 0) // interrupt MAX_RT=1
       {
      	//clear MAX_RT bit
      	status_temp = SPI_Send_command_with_ADDR(W_REGISTER,STATUS_ADDR,(status|MAX_RT));
      	//Flush TX FIFO
      	status_temp = SPI_Send_command_without_ADDR(FLUSH_TX, NRF_NOP);
       }

      if ((status & TX_DS) != 0)
       {
         // Clear TX_DS bit in status register
         status_temp = SPI_Send_command_with_ADDR(W_REGISTER, STATUS_ADDR, (status|TX_DS));
       }

      // If TX full

      if ((status & TX_FULL) != 0)
       {
       // Flush TX FIFO (in TX mode)
       status_temp = SPI_Send_command_without_ADDR(FLUSH_TX, NRF_NOP);
       }

        status_temp = SPI_Send_command_without_ADDR(FLUSH_RX, NRF_NOP);


*/


       	NRF_prepareForTransmit();
        CE_LOW();

 //nrf_read_all();

       	byte=0;
 while(1)
{
 //IMPLEMENT CONTINUOUS TRANSMISSION
 //FOR TRANSMISSION


 //status_temp = SPI_Send_command_without_ADDR(FLUSH_TX, NRF_NOP);

 // Send payload - send any data


for(in=0;in<PAYLOAD_SIZE;in++)
  {
   // a[in]='s';
    if ( !(P2IN & BIT2) )
    		{		// If not (port one input AND bit3 (sw1))
    			//do_led( BIT6, 2000 );	// Turn on LED 2

    	         P2OUT &= ~BIT4;
    	         a[in]='r';
    			//P1OUT &= ~ BIT6;
    		}
    		else
    		{
    			 P2OUT |= BIT4;
    			    		 a[in]='s';
    			    	//	P1OUT |= BIT6;	// Otherwise...
    		}
    			//do_led( BIT0, 100 );	// Turn on LED 1


  }
if (a[0] == 's')
{	P2OUT |= BIT3;
//	P2OUT &= ~BIT3;
}
else
{
	P2OUT &= ~BIT3;
	//P2OUT |= BIT3;
}



 // m=31;
//status_temp = SPI_Send_command_without_ADDR(FLUSH_TX, NRF_NOP); //test code
  status = SPI_Send_command_without_ADDR_M (W_TX_PAYLOAD, byte,PAYLOAD_SIZE);

Delay(100);

 // Pulse for CE -> starts the transmission.
 CE_HIGH();


 Delay(30);

 CE_LOW();

 Delay(30);

// while (P2IN & BIT0); // wait until transmitted to air
 //Delay(10000);

 // Read STATUS register
 status = SPI_Send_command_without_ADDR(NRF_NOP, NRF_NOP);
 // if exceed number of transmision packets
 if ((status & MAX_RT) != 0)
       {
       // Clear MAX_RT bit in status register
       status_temp = SPI_Send_command_with_ADDR(W_REGISTER, STATUS_ADDR,(status|MAX_RT));

       // No communication event here

       retransmited++;

       // Flush TX FIFO (in TX mode)
       status_temp = SPI_Send_command_without_ADDR(FLUSH_TX, NRF_NOP); //test code
       }

 // If packet sent on TX
 if ((status & TX_DS) != 0)
       {
       // Clear TX_DS bit in status register
       status_temp = SPI_Send_command_with_ADDR(W_REGISTER, STATUS_ADDR, (status|TX_DS));
       counter++;
       }

 // If TX full
 if ((status & TX_FULL) != 0)
       {
       // Flush TX FIFO (in TX mode)
       status_temp = SPI_Send_command_without_ADDR(FLUSH_TX, NRF_NOP);
       }
}
}


unsigned char SPI_SendByte(unsigned char data)
 {
  	UCB0TXBUF = data;

	// wait for TX
	while (!(IFG2 & UCB0TXIFG));

	return UCB0RXBUF;
 }




void Delay (unsigned long a)
 {
 while (--a != 0);
 }

void CSN_HIGH (void)
 {
 P1OUT |= BIT4; // P4.1 HIGH
 }

void CSN_LOW (void)
 {
 Delay (CSN_TIME);
 P1OUT &= ~BIT4; // P4.1 LOW
 }

void CE_HIGH(void)
 {
 P1OUT |= BIT3; // P4.2 HIGH
Delay (CE_HIGH_TIME);
 }

void CE_LOW(void)
{
 P1OUT &= ~BIT3; // P4.2 LOW
 }


//THIS ROUTINE IS FOR READING AND WRITING OF LAST 6 INSTRUCTION REGISTERS
unsigned char SPI_Send_command_without_ADDR (unsigned char cmd, unsigned char data_byte)
 {
     unsigned char temp = 0;
     CSN_LOW();
     if (cmd == R_RX_PAYLOAD)//USED WHEN NRF IS IN TXD MODE
         {
         status = SPI_SendByte(cmd);
         temp = SPI_SendByte(NRF_NOP);//DUMMY BYTES
         CSN_HIGH();
         return temp;
         }
    if (cmd == W_TX_PAYLOAD)//USED WHEN NRF IS IN TXD MODE
         {
         status = SPI_SendByte(cmd);
         SPI_SendByte(data_byte);//SENDING THE ACTUAL PAYLOAD/DATA FOR TRANSMISSION
         CSN_HIGH();
         return status;
         }
     status = SPI_SendByte(cmd);
     CSN_HIGH();
     return status;

 }

//THIS ROUTINE IS FOR READING AND WRITING OF LAST 6 INSTRUCTION REGISTERS

//THIS ROUTINE IS FOR READING AND WRITING OF FIRST 2 INSTRUCTION REGISTERS

unsigned char SPI_Send_command_with_ADDR (unsigned char cmd, unsigned char addr, unsigned char data_byte)
 {
 unsigned char temp,command = 0;
 int j, k;
 command = (cmd << 5) | addr;
 CSN_LOW();
 if (cmd == R_REGISTER)
   {
     if (addr == RX_ADDR_P0 || addr == RX_ADDR_P1 || addr == TX_ADDR)
            {

            status = SPI_SendByte(command);
                  for (k = 0; k < 5; k++)
                   {
                  ADDRESS[k] = SPI_SendByte(NRF_NOP);
                   }
             CSN_HIGH();
             return status;
             }
       else
             {
             status = SPI_SendByte(command);
             temp = SPI_SendByte(NRF_NOP);
             CSN_HIGH();
             return temp;
             }
    }
if (cmd == W_REGISTER)
    {
           if (addr == RX_ADDR_P0)
           {
           status = SPI_SendByte(command);
              for (j = 0; j < 5; j++)
                 {
                 temp = RX_ADDRESS_P0[j];
                 SPI_SendByte(temp);
                 }
          CSN_HIGH();
          return status;
           }

                 if (addr == RX_ADDR_P1)
                 {
                 status = SPI_SendByte(command);


                 for (j = 0; j < 5;j++)
                     {
                     temp = RX_ADDRESS_P1[j];
                    SPI_SendByte(temp);
                     }
                 CSN_HIGH();
                 return status;
                 }

         if (addr == TX_ADDR)
         {
        status = SPI_SendByte(command);
              for (j = 0; j < 5;j++)
              {
               temp = TX_ADDRESS[j];
               SPI_SendByte(temp);
               }
              CSN_HIGH();
               return status;
         }
     else
         {
         temp = SPI_SendByte(command);
         SPI_SendByte(data_byte);
         CSN_HIGH();
         return temp;
         }
     }

 return 1;
}

unsigned char SPI_Send_command_without_ADDR_M (unsigned char cmd, unsigned char data_byte, unsigned char mm)
 {
   unsigned char temp = 0,rm=0,t=0;
     CSN_LOW();
     if (cmd == R_RX_PAYLOAD)//USED WHEN NRF IS IN RXD MODE
         {
         status = SPI_SendByte(cmd);
         while(mm!=rm)//GO ON RECEIVING PAYLOAD UNTIL ALL ARE RECEIVED
         {
         temp = SPI_SendByte(NRF_NOP);//DUMMY BYTES
         b[rm]=temp;
         rm++;
         }
         CSN_HIGH();
         return temp;
         }
    if (cmd == W_TX_PAYLOAD)//USED WHEN NRF IS IN TXD MODE
         {
         status = SPI_SendByte(cmd);
             while(mm>0)
             {
             SPI_SendByte(a[t]);//SENDING THE ACTUAL PAYLOAD/DATA FOR TRANSMISSION
             t++;
             mm--;
             }
         CSN_HIGH();
         return status;
         }
     status = SPI_SendByte(cmd);
     CSN_HIGH();
     return status;
 }

void nrf_read_all(void)
      {

      nrf_configuration = SPI_Send_command_with_ADDR(R_REGISTER,CONFIG_REG_ADDR ,0xFF);
      nrf_enable_auto_ack = SPI_Send_command_with_ADDR(R_REGISTER,ENAA ,0xFF);
      nrf_enable_rxaddr = SPI_Send_command_with_ADDR(R_REGISTER, EN_RXADDR,0xFF);
      nrf_setup_aw_reg = SPI_Send_command_with_ADDR(R_REGISTER,SETUP_AW ,0xFF);
      nrf_setup_retr_reg = SPI_Send_command_with_ADDR(R_REGISTER,SETUP_RETR ,0xFF);
      nrf_rf_ch_reg = SPI_Send_command_with_ADDR(R_REGISTER,RF_CH ,0xFF);
      nrf_rf_setup_reg = SPI_Send_command_with_ADDR(R_REGISTER,RF_SETUP ,0xFF);
      nrf_status_reg = SPI_Send_command_with_ADDR(R_REGISTER,STATUS_ADDR  ,0xFF);
      nrf_observe_tx_reg= SPI_Send_command_with_ADDR(R_REGISTER,OBSERVE_TX ,0xFF);
      nrf_cd_reg = SPI_Send_command_with_ADDR(R_REGISTER, CD ,0xFF);
      status_temp = SPI_Send_command_with_ADDR(R_REGISTER,TX_ADDR ,0xFF);
      for (i=0;i<5;i++)
      {
      	nrf_tx_addr_reg[i]=ADDRESS[i];
      }

      status_temp = SPI_Send_command_with_ADDR(R_REGISTER, RX_ADDR_P0,0xFF);
      for (i=0;i<5;i++)
      {
      	nrf_pipe0_addr_reg[i]=ADDRESS[i];
      }
      status_temp = SPI_Send_command_with_ADDR(R_REGISTER, RX_ADDR_P1,0xFF);
      for (i=0;i<5;i++)
      {
      	nrf_pipe1_addr_reg[i]=ADDRESS[i];
      }
      status_temp = SPI_Send_command_with_ADDR(R_REGISTER, RX_ADDR_P2,0xFF);
            nrf_pipe2_addr_reg = ADDRESS[0];

      status_temp = SPI_Send_command_with_ADDR(R_REGISTER,RX_ADDR_P3 ,0xFF);
            nrf_pipe3_addr_reg = ADDRESS[0];

      status_temp = SPI_Send_command_with_ADDR(R_REGISTER,RX_ADDR_P4,0xFF);
      		nrf_pipe4_addr_reg = ADDRESS[0];

      status_temp= SPI_Send_command_with_ADDR(R_REGISTER,RX_ADDR_P5,0xFF);
      		nrf_pipe5_addr_reg = ADDRESS[0];

      nrf_rx_pw_p0_reg= SPI_Send_command_with_ADDR(R_REGISTER,RX_PW_P0 ,0xFF);
      nrf_rx_pw_p1_reg= SPI_Send_command_with_ADDR(R_REGISTER,RX_PW_P1 ,0xFF);
      nrf_rx_pw_p2_reg= SPI_Send_command_with_ADDR(R_REGISTER,RX_PW_P2 ,0xFF);
      nrf_rx_pw_p3_reg= SPI_Send_command_with_ADDR(R_REGISTER,RX_PW_P3 ,0xFF);
      nrf_rx_pw_p4_reg= SPI_Send_command_with_ADDR(R_REGISTER,RX_PW_P4 ,0xFF);
      nrf_rx_pw_p5_reg= SPI_Send_command_with_ADDR(R_REGISTER,RX_PW_P5 ,0xFF);

      nrf_fifo_status_reg= SPI_Send_command_with_ADDR(R_REGISTER,FIFO_STATUS ,0xFF);
}

void NRF_prepareForTransmit(void)
  {
    // Setting for TX device

	//Write CONFIG register -> 00011110 - CRC enable, power-up, TX
	status = SPI_Send_command_with_ADDR(W_REGISTER, CONFIG_REG_ADDR, 0x1E);

    Delay(50000);
    Delay(50000);
    Delay(50000);
    Delay(50000);
    Delay(50000);
    Delay(50000);

	status = SPI_Send_command_with_ADDR(W_REGISTER, ENAA, 0X01);
	status = SPI_Send_command_with_ADDR(W_REGISTER, EN_RXADDR, ENRXP0);
	status = SPI_Send_command_with_ADDR(W_REGISTER, SETUP_AW, 0X03);
	status = SPI_Send_command_with_ADDR(W_REGISTER, RF_CH, 0x02);
	status = SPI_Send_command_with_ADDR(W_REGISTER, RF_SETUP, 0x07);

    //Write RX_ADDR_P0 register -> Set receive address data Pipe0 -> address in RX_ADDRESS_P0 array
   	status = SPI_Send_command_with_ADDR(W_REGISTER, RX_ADDR_P0, NRF_NOP);
   	//Write TX_ADDR register -> Transmit address. Used for a PTX device only. Address in TX_ADDRESS array
   	status = SPI_Send_command_with_ADDR(W_REGISTER, TX_ADDR, NRF_NOP);

	//Write RX_PW_P0 register -> Set number of bytes in RX payload in data pipe0
	status = SPI_Send_command_with_ADDR(W_REGISTER, RX_PW_P0, PAYLOAD_SIZE);

	status = SPI_Send_command_with_ADDR(W_REGISTER, SETUP_RETR, 0x2F);


  }


receiver code

#include <msp430.h>
#include "nrf24l01.h"
#include <stdio.h>

#define   PAYLOAD_SIZE  5

void NRF_prepareForReceive(void);

void CE_LOW(void);
void CSN_HIGH (void);
void CSN_LOW (void);
void CE_HIGH(void);
void Delay (unsigned long);
unsigned char SPI_SendByte(unsigned char);
void nrf_read_all(void);

unsigned char SPI_Send_command_with_ADDR (unsigned char, unsigned char,
unsigned char);
unsigned char SPI_Send_command_without_ADDR (unsigned char, unsigned char);
unsigned char SPI_Send_command_without_ADDR_M (unsigned char, unsigned char,unsigned char);

  unsigned char a[2],b[PAYLOAD_SIZE];
  unsigned char RX_ADDRESS_P0[5] = {5,6,7,8,9};
  unsigned char RX_ADDRESS_P1[5] = {0,1,2,3,4};
    //WE CAN SET FOLLOWING BY PROVIDING LAST BYTE 5,6,7 & 8 IN CORROSPONDING REGISTER
    // THAT IS RX_ADDRESS_P2[5]={0,1,2,3,5};
    // THAT IS RX_ADDRESS_P3[5]={0,1,2,3,6};
    // THAT IS RX_ADDRESS_P4[5]={0,1,2,3,7};
    // THAT IS RX_ADDRESS_P5[5]={0,1,2,3,8};

  unsigned char TX_ADDRESS[5] = {5,6,7,8,9};
  unsigned char ADDRESS[5];

  unsigned char status,ccmd,aaddr,ddata_byte,ttemp=0X00,ccommand,status_temp,byte,payload;
  unsigned int i,ii,count=0,counter=2;


  unsigned char MST_Data,SLV_Data;
  unsigned char temp;

#define CSN_TIME 10
#define CE_HIGH_TIME 30


  // Nordic variables

  unsigned char nrf_configuration,nrf_enable_auto_ack,nrf_enable_rxaddr,nrf_setup_aw_reg,nrf_setup_retr_reg;
  unsigned char nrf_rf_ch_reg=0,nrf_rf_setup_reg,nrf_status_reg,nrf_observe_tx_reg;
  unsigned char nrf_rx_pw_p0_reg,nrf_fifo_status_reg,nrf_cd_reg;
  unsigned char nrf_rx_pw_p1_reg,nrf_rx_pw_p2_reg,nrf_rx_pw_p3_reg,nrf_rx_pw_p4_reg,nrf_rx_pw_p5_reg;


  unsigned char nrf_pipe0_addr_reg[5];
  unsigned char nrf_pipe1_addr_reg[5];
  unsigned char nrf_pipe2_addr_reg;
  unsigned char nrf_pipe3_addr_reg;
  unsigned char nrf_pipe4_addr_reg;
  unsigned char nrf_pipe5_addr_reg;
  unsigned char nrf_tx_addr_reg[5];

  unsigned char array[256],ib=0;
  unsigned int ia=0;

void main()
{

	 WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer

	  P1OUT |= 0x02;                            // Set P1.0 for LED
	                                            // Set P1.1 for slave reset
	  P1DIR |= 0x03;
	  P2DIR |= BIT2;
	 // P1DIR |= BIT1;// Set P1.0-2 to output direction
	  P1SEL |= BIT5+BIT6+BIT7;                       // P4.4,5 option select
	  P1SEL2 |= BIT5+BIT6+BIT7;
	  P1DIR |= BIT5+BIT7;
	  P1DIR &= ~BIT6;
	  P1DIR |= BIT3 | BIT4; // P4.1 (#CS) and P4.2 (CE) are outputs
	  P2DIR &= ~BIT0; // P2.0 (IRQ) is input


	    P2REN |= BIT0;
	    P2OUT |= BIT0;

	    P2IN |= BIT0;

	 // UCA1CTL1 |= UCSWRST;                      // **Put state machine in reset**

	//  UCA1CTL0 |= UCMST+UCSYNC+UCCKPH+UCMSB;    // 3-pin, 8-bit SPI master
	                                            // Clock polarity high, MSB
	//  UCA1CTL1 |= UCSSEL_2;                     // SMCLK
	//  UCA1BR0 = 0x02;                           // /2
	//  UCA1BR1 = 0;                              //
	//  UCA1MCTL = 0;                             // No modulation
	//  UCA1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
	//  UCA1IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt
		  UCB0CTL1 |= UCSWRST;                      // **Put state machine in reset**

		  UCB0CTL0 |= UCMST+UCSYNC+UCCKPH+UCMSB;    // 3-pin, 8-bit SPI master

		  // Initialize SPI interface
		  // master mode, data valid on rising edge, msb first(Because NRF24L01
		  //wants MSB First)
		  //UCB1CTL0 = UCCKPH + UCMST + UCMSB + UCSYNC;

		    UCB0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC;
			UCB0CTL1 |= UCSSEL_2;   // SMCLK

			// (4)
			UCB0CTL1 &= ~UCSWRST;


	  for(i=50000;i>0;i--);                        // Wait for slave to initialize
	  for(i=50000;i>0;i--);                        // Wait for slave to initialize
	  for(i=50000;i>0;i--);                        // Wait for slave to initialize
	  for(i=50000;i>0;i--);                        // Wait for slave to initialize
	  for(i=50000;i>0;i--);                        // Wait for slave to initialize

//  P6DIR=0X80;   //ADC (P6.2) AS INPUT AND DAC (P6.7) AS OUTPUT
//  P6SEL=0X84;   //P6.2 = A2 AS ADC 0, P6.7 = DAC1

 //   DAC12_1CTL = DAC12IR + DAC12AMP_5 + DAC12ENC ;// Internal ref gain 1
 // ADC12CTL0 =  REF2_5V + REFON ; // MAKE REFERENCE ON FOR DAC

 // Disable CS
  CSN_HIGH();

 // Configure chip nRF24L01

// Discard transmission
  CE_LOW();




  //Flush tx buffer
/*

        status = SPI_Send_command_without_ADDR(0xFF,0xFF);
        if ((status & MAX_RT) != 0) // interrupt MAX_RT=1
        {
       	//clear MAX_RT bit
       	status_temp = SPI_Send_command_with_ADDR(W_REGISTER,STATUS_ADDR,(status|MAX_RT));
       	//Flush TX FIFO
       	status_temp = SPI_Send_command_without_ADDR(FLUSH_TX, NRF_NOP);
        }

       if ((status & TX_DS) != 0)
        {
          // Clear TX_DS bit in status register
          status_temp = SPI_Send_command_with_ADDR(W_REGISTER, STATUS_ADDR, (status|TX_DS));
        }

       // If TX full

       if ((status & TX_FULL) != 0)
        {
        // Flush TX FIFO (in TX mode)
        status_temp = SPI_Send_command_without_ADDR(FLUSH_TX, NRF_NOP);
        }

         status_temp = SPI_Send_command_without_ADDR(FLUSH_RX, NRF_NOP);

*/

 //FOLLOWING WILL BE REQUIRED FOR RECEIVER FILE !!!

 NRF_prepareForReceive ();

//nrf_read_all();


 while(1)
{

 //FOR RECEPTION MAKE CE HIGH
 CE_HIGH ();
         if (IRQ ()) // check interrupt line of nRF24L01...
      {
 // Read STATUS status register
 status = SPI_Send_command_without_ADDR(NRF_NOP, NRF_NOP);

 // Set high when new data arrives RX FIFO
           if ((status & RX_DR) != 0)
           {
           // Chip enable low
           CE_LOW();

           //Read payload data
           //m=31;
           payload = SPI_Send_command_without_ADDR_M(R_RX_PAYLOAD, NRF_NOP,PAYLOAD_SIZE);
           ii++;
           //COMBINE b[0] and b[1] INTO A SINGLE 12 BIT NO AND GIVE TO DAC12

              temp = b[1];
              temp = temp <<8;
              temp = temp &0xFF00;
              temp = temp | b[0];
           //   DAC12_1DAT = temp ;
              if (b[0] == 's')
              {
              	P2OUT |= BIT2;
              }
              else
              {
              	P2OUT &= ~BIT2;
              }
           // Clear RX_DR bit in status register


          // *byte = payload;

           // Flush RX FIFO
           status_temp = SPI_Send_command_without_ADDR(FLUSH_RX, NRF_NOP); //XXX test code
           }
    }



}//END OF WHILE



}//END OF MAIN


unsigned char SPI_SendByte(unsigned char data)
 {
 //while ((UCA1IFG & UCTXIFG) == 0); // wait while not ready / for RX
 //UCA1TXBUF = data; // write
 //while ((UCA1IFG & UCRXIFG) == 0); // wait for RX buffer (full)
 //return (UCA1RXBUF);
	UCB0TXBUF = data;

	// wait for TX
	while (!(IFG2 & UCB0TXIFG));

	return UCB0RXBUF;
 }




void Delay (unsigned long a)
 {
 while (--a != 0);
 }

void CSN_HIGH (void)
 {
 P1OUT |= BIT4; // P4.1 HIGH
 }

void CSN_LOW (void)
 {
 Delay (CSN_TIME);
 P1OUT &= ~BIT4; // P4.1 LOW
 }

void CE_HIGH(void)
 {
 P1OUT |= BIT3; // P4.2 HIGH
Delay (CE_HIGH_TIME);
 }

void CE_LOW(void)
{
 P1OUT &= ~BIT3; // P4.2 LOW
 }


//THIS ROUTINE IS FOR READING AND WRITING OF LAST 6 INSTRUCTION REGISTERS
unsigned char SPI_Send_command_without_ADDR (unsigned char cmd, unsigned char data_byte)
 {
     unsigned char temp = 0;
     CSN_LOW();
     if (cmd == R_RX_PAYLOAD)//USED WHEN NRF IS IN TXD MODE
         {
         status = SPI_SendByte(cmd);
         temp = SPI_SendByte(NRF_NOP);//DUMMY BYTES
         CSN_HIGH();
         return temp;
         }
    if (cmd == W_TX_PAYLOAD)//USED WHEN NRF IS IN TXD MODE
         {
         status = SPI_SendByte(cmd);
         SPI_SendByte(data_byte);//SENDING THE ACTUAL PAYLOAD/DATA FOR TRANSMISSION
         CSN_HIGH();
         return status;
         }
     status = SPI_SendByte(cmd);
     CSN_HIGH();
     return status;

 }


//THIS ROUTINE IS FOR READING AND WRITING OF LAST 6 INSTRUCTION REGISTERS
unsigned char SPI_Send_command_without_ADDR_M (unsigned char cmd, unsigned char data_byte, unsigned char mm)
 {
     unsigned char temp = 0,rm=0;
     CSN_LOW();
     if (cmd == R_RX_PAYLOAD)//USED WHEN NRF IS IN RXD MODE
         {
         status = SPI_SendByte(cmd);
         while(mm!=rm)//GO ON RECEIVING PAYLOAD UNTIL ALL ARE RECEIVED
         {
         b[rm] = SPI_SendByte(NRF_NOP);//DUMMY BYTES
         array[ib++]=b[rm];
         if(ib==255)
        	 ia++;
         rm++;
         }
         CSN_HIGH();
         return temp;
         }
    if (cmd == W_TX_PAYLOAD)//USED WHEN NRF IS IN TXD MODE
         {
         status = SPI_SendByte(cmd);
             while(mm>0)
             {
             SPI_SendByte(data_byte);//SENDING THE ACTUAL PAYLOAD/DATA FOR TRANSMISSION
             mm--;
             }
         CSN_HIGH();
         return status;
         }
     status = SPI_SendByte(cmd);
     CSN_HIGH();
     return status;
 }


//THIS ROUTINE IS FOR READING AND WRITING OF FIRST 2 INSTRUCTION REGISTERS

unsigned char SPI_Send_command_with_ADDR (unsigned char cmd, unsigned char addr,
unsigned char data_byte)
 {
 unsigned char temp,command = 0;
 int j, k;
 command = (cmd << 5) | addr;
 CSN_LOW();
 if (cmd == R_REGISTER)
   {
     if (addr == RX_ADDR_P0 || addr == RX_ADDR_P1 || addr == TX_ADDR)
            {

            status = SPI_SendByte(command);
                  for (k = 0; k < 5; k++)
                   {
                  ADDRESS[k] = SPI_SendByte(NRF_NOP);
                   }
             CSN_HIGH();
             return status;
             }
       else
             {
             status = SPI_SendByte(command);
             temp = SPI_SendByte(NRF_NOP);
             CSN_HIGH();
             return temp;
             }
    }
if (cmd == W_REGISTER)
    {
           if (addr == RX_ADDR_P0)
           {
           status = SPI_SendByte(command);
              for (j = 0; j < 5; j++)
                 {
                 temp = RX_ADDRESS_P0[j];
                 SPI_SendByte(temp);
                 }
          CSN_HIGH();
          return status;
           }

                 if (addr == RX_ADDR_P1)
                 {
                 status = SPI_SendByte(command);


                 for (j = 0; j < 5;j++)
                     {
                     temp = RX_ADDRESS_P1[j];
                    SPI_SendByte(temp);
                     }
                 CSN_HIGH();
                 return status;
                 }

         if (addr == TX_ADDR)
         {
        status = SPI_SendByte(command);
              for (j = 0; j < 5;j++)
              {
               temp = TX_ADDRESS[j];
               SPI_SendByte(temp);
               }
              CSN_HIGH();
               return status;
         }
     else
         {
         temp = SPI_SendByte(command);
         SPI_SendByte(data_byte);
         CSN_HIGH();
         return temp;
         }
     }

 return 1;
}

void nrf_read_all(void)
      {

      nrf_configuration = SPI_Send_command_with_ADDR(R_REGISTER,CONFIG_REG_ADDR ,0xFF);
      nrf_enable_auto_ack = SPI_Send_command_with_ADDR(R_REGISTER,ENAA ,0xFF);
      nrf_enable_rxaddr = SPI_Send_command_with_ADDR(R_REGISTER, EN_RXADDR,0xFF);
      nrf_setup_aw_reg = SPI_Send_command_with_ADDR(R_REGISTER,SETUP_AW ,0xFF);
      nrf_setup_retr_reg = SPI_Send_command_with_ADDR(R_REGISTER,SETUP_RETR ,0xFF);
      nrf_rf_ch_reg = SPI_Send_command_with_ADDR(R_REGISTER,RF_CH ,0xFF);
      nrf_rf_setup_reg = SPI_Send_command_with_ADDR(R_REGISTER,RF_SETUP ,0xFF);
      nrf_status_reg = SPI_Send_command_with_ADDR(R_REGISTER,STATUS_ADDR  ,0xFF);
      nrf_observe_tx_reg= SPI_Send_command_with_ADDR(R_REGISTER,OBSERVE_TX ,0xFF);
      nrf_cd_reg = SPI_Send_command_with_ADDR(R_REGISTER, CD ,0xFF);
      status_temp = SPI_Send_command_with_ADDR(R_REGISTER,TX_ADDR ,0xFF);
      for (i=0;i<5;i++)
      {
      	nrf_tx_addr_reg[i]=ADDRESS[i];
      }

      status_temp = SPI_Send_command_with_ADDR(R_REGISTER, RX_ADDR_P0,0xFF);
      for (i=0;i<5;i++)
      {
      	nrf_pipe0_addr_reg[i]=ADDRESS[i];
      }
      status_temp = SPI_Send_command_with_ADDR(R_REGISTER, RX_ADDR_P1,0xFF);
      for (i=0;i<5;i++)
      {
      	nrf_pipe1_addr_reg[i]=ADDRESS[i];
      }
      status_temp = SPI_Send_command_with_ADDR(R_REGISTER, RX_ADDR_P2,0xFF);
            nrf_pipe2_addr_reg = ADDRESS[0];

      status_temp = SPI_Send_command_with_ADDR(R_REGISTER,RX_ADDR_P3 ,0xFF);
            nrf_pipe3_addr_reg = ADDRESS[0];

      status_temp = SPI_Send_command_with_ADDR(R_REGISTER,RX_ADDR_P4,0xFF);
      		nrf_pipe4_addr_reg = ADDRESS[0];

      status_temp= SPI_Send_command_with_ADDR(R_REGISTER,RX_ADDR_P5,0xFF);
      		nrf_pipe5_addr_reg = ADDRESS[0];

      nrf_rx_pw_p0_reg= SPI_Send_command_with_ADDR(R_REGISTER,RX_PW_P0 ,0xFF);
      nrf_rx_pw_p1_reg= SPI_Send_command_with_ADDR(R_REGISTER,RX_PW_P1 ,0xFF);
      nrf_rx_pw_p2_reg= SPI_Send_command_with_ADDR(R_REGISTER,RX_PW_P2 ,0xFF);
      nrf_rx_pw_p3_reg= SPI_Send_command_with_ADDR(R_REGISTER,RX_PW_P3 ,0xFF);
      nrf_rx_pw_p4_reg= SPI_Send_command_with_ADDR(R_REGISTER,RX_PW_P4 ,0xFF);
      nrf_rx_pw_p5_reg= SPI_Send_command_with_ADDR(R_REGISTER,RX_PW_P5 ,0xFF);

      nrf_fifo_status_reg= SPI_Send_command_with_ADDR(R_REGISTER,FIFO_STATUS ,0xFF);
}


void NRF_prepareForReceive(void)
{
	    //Write CONFIG register (addres - 0x00)
	    //00011111 - CRC enable, power-up, RX
	      status = SPI_Send_command_with_ADDR(W_REGISTER,CONFIG_REG_ADDR, 0x1F);

	      Delay(50000);
	      Delay(50000);
	      Delay(50000);
	      Delay(50000);
	      Delay(50000);
	      Delay(50000);

	    status = SPI_Send_command_with_ADDR(W_REGISTER, ENAA, 0X01);
	    status = SPI_Send_command_with_ADDR(W_REGISTER, EN_RXADDR, ENRXP0);
	    status = SPI_Send_command_with_ADDR(W_REGISTER, SETUP_AW, 0X03);
	    status = SPI_Send_command_with_ADDR(W_REGISTER, RF_CH, 0x02);
	    status = SPI_Send_command_with_ADDR(W_REGISTER, RF_SETUP, 0x07);

	    //Write RX_ADDR_P0 register -> Set receive address data Pipe0 -> address in RX_ADDRESS_P0 array
	    status = SPI_Send_command_with_ADDR(W_REGISTER, RX_ADDR_P0, NRF_NOP);
	 //Write TX_ADDR register -> Transmit address. Used for a PTX device only. Address in TX_ADDRESS array
	 status = SPI_Send_command_with_ADDR(W_REGISTER, TX_ADDR, NRF_NOP);

	 //Write RX_PW_P1 register -> Set number of bytes in RX payload in data pipe1 -> 1 byte
	 	 status = SPI_Send_command_with_ADDR(W_REGISTER, RX_PW_P0, PAYLOAD_SIZE);

	 //Write RX_PW_P1 register -> Set number of bytes in RX payload in data pipe1 -> 1 byte
	 status = SPI_Send_command_with_ADDR(W_REGISTER, RX_PW_P1, PAYLOAD_SIZE);

	status = SPI_Send_command_with_ADDR(W_REGISTER, SETUP_RETR, 0x2F);


}

can you give me solution???

**Attention** This is a public forum