This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Problems with Nordic nRF24E1 and serial protocol

Hey out there,

finally I'm at my PC again and can post my code if needed.
Here's the situation: I've bought me a nRF24E1-EVKIT from nordic because I want to transmit an extern generated serial realtime protocol wireless. The protocol has 8 data bits and 1 start and stop bit, just like the serial interface. the baudrate is 31.25 kBaud. the problem is that i'm not that into programing 8051 and need a little help from my friend ;)
Here's what I got so far:

/* init the serial I/O */
SM0 = 0; SM1 = 1; /* serial port MODE 1 */
SM2 = 0;
REN = 1; /* enable serial receiver */

TI = 0;	/* clear transmit interrupt */
RI = 0;	/* clear receiver interrupt */

ES = 1;	/* enable serial interrupts */
PS = 0; /* set ints to low priority */

/* init timer1 as baudrate generator */

TR1 = 0;  /* stop timer 1 */
ET1 = 0;  /* disable timer 1 interrupt */

PCON |= 0x80;  /* 0x80=SMOD: set serial baudrate doubler */

TMOD &= ~0xF0;  /* clear timer 1 mode bits */
TMOD |= 0x20;  /* put timer 1 into MODE 2 */

TH1 = 248; /* 31250@16MHz is that value correct?*/

TR1 = 1;  /* start timer 1 */

/* ISR for Rx and Tx serial data*/

static void com_isr (void) interrupt 4 using 1
{
  if (RI != 0)  /* Received data interrupt */
  {
    RI = 0;
    // problem: put the recieved data to the wireless SFR to be transmitted
  }
}

Is that code correct so far? it took me a long time to understand all that. ;) if so, what need i to do to put the received data to the RF? should i use a buffer?
thanks for your help! i realy apreciate.

regards,

b. morgenthaler

  • "what need i to do to put the received data to the RF?"

    You need to read the Data Sheet for the RF device - that will tell you how to get it to transmit a byte!

  • Hey,

    i've read the data sheet on and on. but the things are a bit confusing. do i have to use the SPI (whatever this is anyway) or do i need to put the SBUF directly to the RADIO DATA?
    When i should use the SPI, how do i init it?
    These are the questions i can't answer myself.
    So if you know the answers please let me know.
    Thanks and regards,

    B. Morgenthaler

  • These are questions that relate to the device itself - not to the Keil tools.

    You should contact the device manufacturer for specific questions about their device!
    Or maybe your distributor?

    Have you checked their website(s) for support materials, example code, application notes, etc?

  • ok then. I understand. first of all thank you for the help.
    after I've read the manuals, data sheets, whitepapers and code examples this night, I coded the following for the transmitting side:

    
    #include <reg24e1.H>
    
    /* this stuff is needed to send data over the RF */
    
    #define ADDR_INDEX 8
    #define ADDR_COUNT 4
    
    struct RFConfig
    {
    	unsigned char n;
    	unsigned char buf[15];
    };
    
    typedef struct RFConfig RFConfig;
    
    const RFConfig tconf =
    {
        15,
        0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0xaa, 0xbb, 0x12, 0x34, 0x83, 0x6c, 0x04
    };
    
    const RFConfig rconf =
    {
        15,
        0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0xaa, 0xbb, 0x12, 0x34, 0x83, 0x6c, 0x05
    };
    
    /* now init all we need to put the data over the air */
    
    void init(void)
    {
    	/* power up tranciever */
    	PWR_UP = 1;
    
    	/* init serial interface */
    
    	SM0 = 0; SM1 = 1; 	/* serial port MODE 1 */
    	SM2 = 0;
    	REN = 1; 			/* enable serial receiver */
    
    	TI = 0;				/* clear transmit interrupt */
    	RI = 0;				/* clear receiver interrupt */
    
    	ES = 1;				/* enable serial interrupts */
    	PS = 0; 			/* set ints to low priority */
    
    	/* init timer 1 as baudrate generator */
    
    	TR1 = 0;  		/* stop timer 1 */
    	ET1 = 0;  		/* disable timer 1 interrupt */
    
    	PCON |= 0x80;  	/* 0x80=SMOD: set serial baudrate doubler */
    
    	TMOD &= ~0xF0;  /* clear timer 1 mode bits */
    	TMOD |= 0x20;  	/* put timer 1 into MODE 2 */
    
    	TH1 = 0xF8; 	/* 31250@16MHz is that value correct?*/
    
    	TR1 = 1;  		/* start timer 1 */
    }
    
    /* function that reads and writes a data byte to and from the SPI that is needed to force the data fly */
    
    unsigned char spiReadWrite(unsigned char b)
    {
    	EXIF &= ~0x20;					/* clear SPI interrupt */
    	SPI_DATA = b;					/* move byte to send to SPI data register */
    	while ((EXIF & 0x20) == 0x00) 	/* wait until SPI has finished transmitting */
    		;
    	return SPI_DATA;				/* for read reason */
    }
    
    /* function that transmits the data byte over the air with the help from spiReadWrite() */
    
    void transmitPacket(unsigned char b)
    {
    	unsigned char i;
    	CE = 1; 									/* activate RX or TX mode */
    	for(i = 0; i < ADDR_COUNT; i++)
    		spiReadWrite(tconf.buf[ADDR_INDEX+1]);
    	spiReadWrite(b);
    	CE = 0;
    }
    
    /* ISR for the serial interface */
    
    static void com_isr (void) interrupt 4 using 1
    {
    	unsigned char b;
    
    	if (RI != 0)		/* recieved data interrupt */
    	{
      		RI = 0;
    		b = SBUF;
    		transmitPacket(b);
    	}
    }
    
    void main(void)
    {
    	init();
    }
    
    

    Maybe someone can check the the code for programing errors.
    would you read the data that comes from SBUF into a buffer befor sending? something like 256kb into the xdata?

    regards,

    b. morgenthaler