Please note: We are aware of an issue affecting replies on the Arm Community forums, which may not be loading as expected.

We apologize for any inconvenience and appreciate your patience while we investigate and work to resolve the issue.

Thank you for your understanding.


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

Wireless 8051 problems

HI :-) as promised, im having problems with the wireless connection on the nordic nrf24e1, I am trying to send a packet and then if received, flash an LED. Can anyone see any problems with the below code. first is the transmitter code then i will reply with the receiver code:

#include <reg24e1.h>

struct RFConfig
{ unsigned char n; unsigned char buf[15];
};

typedef struct RFConfig RFConfig;

#define ADDR_INDEX 8 // Index to address bytes in RFConfig.buf
#define ADDR_COUNT 4 // Number of address bytes

const RFConfig txconf =
{ 15, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x34, 0x56, 0x78, 0x83, 0x6c, 0x04
};

const RFConfig rxconf =
{ 15, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x65, 0x43, 0x21, 0x83, 0x6c, 0x05
};

// LED is to be connected to this pin
sbit LED_pin = P1^0;

// Function prototypes
void DELAY_LOOP_Wait(const unsigned int);
void DELAY_100us(volatile unsigned char n);
unsigned char SPI_ReadWrite(unsigned char b);
void TRANSMIT_Packet(unsigned char b);
void TRANSMITTER(void);
void LED_Flash();
void INIT(void);

/*..................................................................*/

void main(void)
{ INIT();

while(1) {

TRANSMITTER();

}

}

/*------------------------------------------------------------------*-

DELAY_LOOP_Wait()

-*------------------------------------------------------------------*/

void DELAY_LOOP_Wait(const unsigned int DELAY) { unsigned int x, y;

for (x = 0; x <= DELAY; x++) { for (y = 0; y <= 800; y++); } }

/*------------------------------------------------------------------*-

LED_FLASH()

-*------------------------------------------------------------------*/

void LED_Flash()
{ LED_pin = 0; DELAY_LOOP_Wait(1000); LED_pin = 1; DELAY_LOOP_Wait(1000);
}

/*------------------------------------------------------------------*-

DELAY_100us()

-*------------------------------------------------------------------*/

void DELAY_100us(volatile unsigned char n)
{ unsigned char i; while(n--) for(i=0;i<35;i++) ;
}

/*------------------------------------------------------------------*-

SPI_ReadWrite()

-*------------------------------------------------------------------*/

unsigned char SPI_ReadWrite(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 hs finished transmitting ; return SPI_DATA;
}

/*------------------------------------------------------------------*-

TRANSMIT_Packet()

-*------------------------------------------------------------------*/

void TRANSMIT_Packet(unsigned char b)
{ unsigned char i; CE = 1; DELAY_100us(0); // Start with the address of the receiver: for(i=0;i<ADDR_COUNT;i++) SPI_ReadWrite(rxconf.buf[ADDR_INDEX+i]); SPI_ReadWrite(b); CE = 0; DELAY_100us(3); // Wait ~300us
}

/*------------------------------------------------------------------*-

TRANSMITTER()

-*------------------------------------------------------------------*/

void TRANSMITTER(void)
{ unsigned char b; CS = 1; DELAY_100us(0); for(b=0;b<txconf.n;b++) { SPI_ReadWrite(txconf.buf[b]); } CS = 0; for(;;) { //b = ReadADC(); // Read ADC TRANSMIT_Packet(b); // Transmit data }
}

void INIT(void)
{ PWR_UP = 1; // Turn on Radio DELAY_100us(30); // Wait > 3ms SPICLK = 0; // Max SPI clock (XTAL/8) SPI_CTRL = 0x02; // Connect internal SPI controller to Radio

}

  • /*------------------------------------------------------------------*-

    Receiver.C

    ------------------------------------------------------------------

    A Wireless test program for Nordic nrf24e1.

    COPYRIGHT ---------

    This code is copyright (c) 2007 by Leigh Griffiths.

    -*------------------------------------------------------------------*/

    /*..................................................................*/

    #include <reg24e1.h>

    struct RFConfig
    { unsigned char n; unsigned char buf[15];
    };

    typedef struct RFConfig RFConfig;

    #define ADDR_INDEX 8 // Index to address bytes in RFConfig.buf
    #define ADDR_COUNT 4 // Number of address bytes

    const RFConfig txconf =
    { 15, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x34, 0x56, 0x78, 0x83, 0x6c, 0x04
    };

    const RFConfig rxconf =
    { 15, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x65, 0x43, 0x21, 0x83, 0x6c, 0x05
    };

    // LED is to be connected to this pin
    sbit LED_pin = P1^0;

    // Function prototypes
    void DELAY_LOOP_Wait(const unsigned int);
    void DELAY_100us(volatile unsigned char n);
    unsigned char SPI_ReadWrite(unsigned char b);
    unsigned char RECEIVE_Packet();
    void RECEIVER(void);
    void LED_Flash();
    void INIT(void);

    /*..................................................................*/

    void main(void)
    { INIT();

    while(1) { TRANSMITTER(); RECEIVER();

    }

    }

    /*------------------------------------------------------------------*-

    DELAY_LOOP_Wait()

    -*------------------------------------------------------------------*/

    void DELAY_LOOP_Wait(const unsigned int DELAY) { unsigned int x, y;

    for (x = 0; x <= DELAY; x++) { for (y = 0; y <= 800; y++); } }

    /*------------------------------------------------------------------*-

    LED_FLASH()

    -*------------------------------------------------------------------*/

    void LED_Flash()
    { do { LED_pin = 0; DELAY_LOOP_Wait(1000); LED_pin = 1; DELAY_LOOP_Wait(1000); } while(1);
    }

    /*------------------------------------------------------------------*-

    DELAY_100us()

    -*------------------------------------------------------------------*/

    void DELAY_100us(volatile unsigned char n)
    { unsigned char i; while(n--) for(i=0;i<35;i++) ;
    }

    /*------------------------------------------------------------------*-

    SPI_ReadWrite()

    -*------------------------------------------------------------------*/

    unsigned char SPI_ReadWrite(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 hs finished transmitting ; return SPI_DATA;
    } =

    /*------------------------------------------------------------------*-

    RECEIVE_Packet()

    -*------------------------------------------------------------------*/

    unsigned char RECEIVE_Packet()
    { unsigned char b; CE = 1; while(DR1 == 0) ; b = SPI_ReadWrite(0); CE = 0; return b;

    }

    /*------------------------------------------------------------------*-

    RECEIVER()

    -*------------------------------------------------------------------*/

    void RECEIVER(void)
    { unsigned char b, bo, err; CS = 1; DELAY_100us(0); for(b=0;b<rxconf.n;b++) { SPI_ReadWrite(rxconf.buf[b]); } CS = 0; bo = err = 0; for(;;) { b = RECEIVE_Packet(); LED_Flash(); }
    }

    void INIT(void)
    { P1_DIR = 0; PWR_UP = 1; // Turn on Radio DELAY_100us(30); // Wait > 3ms SPICLK = 0; // Max SPI clock (XTAL/8) SPI_CTRL = 0x02; // Connect internal SPI controller to Radio

    }

  • "Can anyone see any problems with the below code."

    Yes: you didn't follow the instructions about posting source code - so it's illegible!

    Please read the instructions, re-post it as instructed, and use the 'Preview' to confirm that it's worked

    http://www.keil.com/forum/tips.asp