Hi all, I'm doing a project based on wireless sensor network and the hardware I'm using are PIC18F4525 and MRF24J40 chip. In my coding, I'd already configured SPI module and the routines or writing and reading short and long RAM address are well written. The routines are being checked in Proteus and the results shown in SPI debugger terminal are satisfied. However, I'm still having problem in configuring the chip, transmitting and receiving data. Below are the source code and header file for the transceiver.

Hi, its great to see you visiting our forum. Why not try Proton Compiler for FREE?

Download the FREE version of Proton Compiler, Its called Amicus18 and its available from HERE

Already using proton Compiler??? Get rid of these pesky messages... get LICENSED USER STATUS




main.c
Code:
#include <htc.h>#include "mrf24j40_defs_A.h"


void SPI_OUT(char v);
char SPI_IN(void);
void WriteShortRAMAddr(char address, char value);
char ReadShortRAMAddr(char address);
char iReadShortRAMAddr(char address);
void WriteLongRAMAddr(unsigned int address, char value);
char ReadLongRAMAddr(unsigned int address);
char iReadLongRAMAddr(unsigned int address);
void MRF_init(void);
void SET_ShortAddress(void);
void SET_PANId(void);
void MRF24J40_Enable(void);
void Transmit_Frame(void);


char switch_data, sequence_byte, RxRead, RxBuffer[RX_BUFFER_SIZE];


typedef struct _RX_DATA
{
    unsigned int size :7;
    unsigned int inUse :1;
} RX_DATA;


RX_DATA            RxData;


void SPI_OUT(char v)
{
    SSPIF = 0;
    do
    {
        WCOL = 0;
        SSPBUF = v;
        //RA2 = 1;
    } while( WCOL );


    while( SSPIF == 0 );
}


char SPI_IN(void)
{
    SPI_OUT(0x00);
    return SSPBUF;
}


void WriteShortRAMAddr(char address, char value)
{
    //savedBits.bINT = INT0IE;
    INT0IE = 0;
    MRF24J40_CS = 0;
    NOP();
    SPI_OUT(((address<<1)&0b01111111)|0x01);
    SPI_OUT(value);
    NOP();
    MRF24J40_CS = 1;
    //INT0IE = savedBits.bINT;
}


char ReadShortRAMAddr(char address)
{
    char toReturn;
    //savedBits.bINT = INT0IE;
    INT0IE = 0;
    MRF24J40_CS = 0;
    NOP();
    SPI_OUT((address<<1)&0b01111110);
    toReturn = SPI_IN();
    NOP();
    MRF24J40_CS = 1;
    //INT0IE = savedBits.bINT;
    return toReturn;
}


char iReadShortRAMAddr(char address)
{
    char toReturn;
    //savedBits.bINT = INT0IE;
    INT0IE = 0;
    MRF24J40_CS = 0;
    NOP();
    SPI_OUT((address<<1)&0b01111110);
    toReturn = SPI_IN();
    NOP();
    MRF24J40_CS = 1;
    //INT0IE = savedBits.bINT;
    return toReturn;
}


void WriteLongRAMAddr(unsigned int address, char value)
{
    //savedBits.bINT = INT0IE;
    INT0IE = 0;
    MRF24J40_CS = 0;
    NOP();
    SPI_OUT((((char)(address>>3))&0b01111111)|0x80);
    SPI_OUT((((char)(address<<5))&0b11100000)|0x10);
    SPI_OUT(value);
    //SPI_OUT(0x00);
    NOP();
    MRF24J40_CS = 1;
    //INT0IE = savedBits.bINT;
}


char ReadLongRAMAddr(unsigned int address)
{
    char toReturn;
    //savedBits.bINT = INT0IE;
    INT0IE = 0;
    MRF24J40_CS = 0;
    NOP();
    SPI_OUT(((address>>3)&0b01111111)|0x80);
    SPI_OUT(((address<<5)&0b11100000));
    toReturn = SPI_IN();
    NOP();
    MRF24J40_CS = 1;
    //INT0IE = savedBits.bINT;
    return toReturn;
}


char iReadLongRAMAddr(unsigned int address)
{
    char toReturn;
    //savedBits.bINT = INT0IE;
    INT0IE = 0;
    MRF24J40_CS = 0;
    NOP();
    SPI_OUT(((address>>3)&0b01111111)|0x80);
    SPI_OUT(((address<<5)&0b11100000));
    toReturn = SPI_IN();
    NOP();
    MRF24J40_CS = 1;
    //INT0IE = savedBits.bINT;
    return toReturn;
}


void MRF_init(void)
{
    WriteShortRAMAddr(SOFTRST,0x07);
    WriteShortRAMAddr(PACON2,0x98);
    WriteShortRAMAddr(TXSTBL,0x95);
    WriteLongRAMAddr(RFCON0,0x03);
    WriteLongRAMAddr(RFCON1,0x01);
    WriteLongRAMAddr(RFCON2,0x80);
    WriteLongRAMAddr(RFCON6,0x90);
    WriteLongRAMAddr(RFCON7,0x80);
    WriteLongRAMAddr(RFCON8,0x10);
    WriteLongRAMAddr(SLPCON1,0x21);
    WriteShortRAMAddr(RXMCR,0x08);
    WriteShortRAMAddr(TXMCR,0x00);
    WriteShortRAMAddr(ORDER,0xFF);
    WriteShortRAMAddr(BBREG2,0x80);
    WriteShortRAMAddr(0x3F,0x80);
    WriteShortRAMAddr(BBREG6,0x40);
    WriteShortRAMAddr(0x32, 0xF6);
    //WriteLongRAMAddr(RFCTRL0,CURRENT_CHANNEL);
    WriteLongRAMAddr(RFCON3,0x00);
    WriteShortRAMAddr(RFCTL,0x04);
    WriteShortRAMAddr(RFCTL,0x00);
}


void SET_ShortAddress(void)
{
    WriteShortRAMAddr(SADRL,SHORTADDR_LSB);
    WriteShortRAMAddr(SADRH,SHORTADDR_MSB);
}


void SET_PANId(void)
{
    WriteShortRAMAddr(PANIDL,PANID_LSB);
    WriteShortRAMAddr(PANIDH,PANID_MSB);
}


void MRF24J40_Enable(void)
{
    SET_PANId();


    SET_ShortAddress();


    WriteShortRAMAddr(EADR0, MAC_LONG_ADDR_BYTE0);
    WriteShortRAMAddr(EADR1, MAC_LONG_ADDR_BYTE1);
    WriteShortRAMAddr(EADR2, MAC_LONG_ADDR_BYTE2);
    WriteShortRAMAddr(EADR3, MAC_LONG_ADDR_BYTE3);
    WriteShortRAMAddr(EADR4, MAC_LONG_ADDR_BYTE4);
    WriteShortRAMAddr(EADR5, MAC_LONG_ADDR_BYTE5);
    WriteShortRAMAddr(EADR6, MAC_LONG_ADDR_BYTE6);
    WriteShortRAMAddr(EADR7, MAC_LONG_ADDR_BYTE7);


    // Set up the interrupt to read in a data packet.
    INT0IE = 1;
    // Enable interrupts 
    RBIE = 0;
    IPEN = 1;
    GIEH = 1;
}


void Transmit_Frame(void)
{
    WriteLongRAMAddr(0x000, 0x00);
    WriteLongRAMAddr(0x001, 0x0C);
    WriteLongRAMAddr(0x002, 0x01);
    WriteLongRAMAddr(0x003, 0x88);
    WriteLongRAMAddr(0x004, sequence_byte++);
    WriteLongRAMAddr(0x005, PANID_LSB);
    WriteLongRAMAddr(0x006, PANID_MSB);
    WriteLongRAMAddr(0x007, DESTADDR_LSB);
    WriteLongRAMAddr(0x008, DESTADDR_MSB);
    WriteLongRAMAddr(0x009, PANID_LSB);
    WriteLongRAMAddr(0x00A, PANID_MSB);
    WriteLongRAMAddr(0x00B, SHORTADDR_LSB);
    WriteLongRAMAddr(0x00C, SHORTADDR_MSB);
    WriteLongRAMAddr(0x00D, switch_data);
    
    WriteShortRAMAddr (0x1b, 0x01);
}


void interrupt HighISR(void)
{
    char interrupt_byte;
    
    if(INT0IF)
    {
        if(INT0IE)
        {
           INT0IF = 0;
           // Reading this interrupt register will clear the interrupts
           interrupt_byte = iReadShortRAMAddr(0x31);
            if (interrupt_byte & 0x08)
            {
                char counter;


                RxData.size = iReadLongRAMAddr (0x300);


                RxData.inUse=1;
                RxBuffer[0] = RxData.size;
                counter = 0x01;
                for(RxRead=1;RxRead < RxData.size + 3;RxRead++)
                    RxBuffer[RxRead] = iReadLongRAMAddr ((unsigned int)(0x300 + counter++));
            }


         }
     }
     
         /*if(RBIF)   
         {
             portb_data.Val = PORTB;
             if(portb_data.bits.b5 == 0)
                 RB5 = 1;
             if(portb_data.bits.b4 == 0)
                 RB4 = 1;
             RBIE = 0;
             LATB = PORTB;
             RBIF = 0;
         
        }*/
}


void main(void)
{
    int i;


    TRISB = 1;
    TRISA = 0;
    TRISC = 0x90;
    ADCON1bits.PCFG = 0b1111;        //configure as digital I/O


    SSPSTAT = 0x80;
    SSPCON1 = 0x20;


    INTEDG0 = 0;


    MRF24J40_CS = 1;
    MRF24J40_RESETn = 1;


    RA2 = 1;


    sequence_byte = 0x00;


    MRF_init();


    MRF24J40_Enable();


    if(RB5){
        RA3 = 1;
        switch_data = 0b00010000;
        Transmit_Frame();
        for(i=0;i<0xFFFF;++i)    NOP();
    }


    else if(RB4){
        RA4 = 1;
        switch_data = 0b00100000;
        Transmit_Frame();
        for(i=0;i<0xFFFF;++i)    NOP();
    }


    else if(RxBuffer[0x0C] == 0b00100000)
    {
        LATA0 = 0;
        LATA1 = 1;
    }


    else if(RxBuffer[0x0C] == 0b00010000)
    {
        LATA0 = 1;
        LATA1 = 0;
    }


    else
        PORTA = 0;
}
mrf24j40_defs_A.h
Code:
#include <htc.h>

#define DESTADDR_LSB        0xBB
#define DESTADDR_MSB        0xBB
#define PANID_LSB            0xFE
#define PANID_MSB            0xCA
#define SHORTADDR_LSB        0xAA
#define SHORTADDR_MSB        0xAA
#define MAC_LONG_ADDR_BYTE7 0x00
#define MAC_LONG_ADDR_BYTE6 0x04
#define MAC_LONG_ADDR_BYTE5 0xA3
#define MAC_LONG_ADDR_BYTE4 0x00
#define MAC_LONG_ADDR_BYTE3 0x00
#define MAC_LONG_ADDR_BYTE2 0x00
#define MAC_LONG_ADDR_BYTE1 0x00
#define MAC_LONG_ADDR_BYTE0 0x41
#define I_AM_COORDINATOR
#define I_AM_FFD
#define RX_BUFFER_SIZE 256
#define RF_CHIP MRF24J40
#define MRF24J40_CS LATC0
#define MRF24J40_CS_TRIS TRISC0
#define MRF24J40_RESETn LATC2
#define MRF24J40_RESETn_TRIS TRISC2
#define MRF24J40_WAKE LATC1
#define MRF24J40_WAKE_TRIS TRISC1
#define PA_LEVEL 0x00  // -0.00 dBm
#define CURRENT_CHANNEL    0000 //CHANNEL 11
#define CLOCK_FREQ 16000000
#define BAUD_RATE 19200


//MRF24J40 short address registers
#define RXMCR (0x00)
#define PANIDL (0x01)
#define PANIDH (0x02)
#define SADRL (0x03)
#define SADRH (0x04)
#define EADR0 (0x05)
#define EADR1 (0x06)
#define EADR2 (0x07)
#define EADR3 (0x08)
#define EADR4 (0x09)
#define EADR5 (0x0a)
#define EADR6 (0x0b)
#define EADR7 (0x0c)
#define RXFLUSH (0x0d)
#define TXSTATE0 (0x0e)
#define TXSTATE1 (0x0f)
#define ORDER (0x10)
#define TXMCR (0x11)
#define ACKTMOUT (0x12)
#define SLALLOC (0x13)
#define SYMTICKL (0x14)
#define SYMTICKH (0x15)
#define PAONTIME (0x16)
#define PAONSETUP (0x17)
#define PACON2 (0x18)
#define CSMACR (0x19)
#define TXBCNTRIG (0x1a)
#define TXNMTRIG (0x1b)
#define TXG1TRIG (0x1c)
#define TXG2TRIG (0x1d)
#define ESLOTG23 (0x1e)
#define ESLOTG45 (0x1f)
#define ESLOTG67 (0x20)
#define TXPEND (0x21)
#define TXBCNINTL (0x22)
#define FRMOFFSET (0x23)
#define TXSR (0x24)
#define TXLERR (0x25)
#define GATE_CLK (0x26)
#define TXOFFSET (0x27)
#define HSYMTMR0 (0x28)
#define HSYMTMR1 (0x29)
#define SOFTRST (0x2a)
#define BISTCR (0x2b)
#define SECCR0 (0x2c)
#define SECCR1 (0x2d)
#define TXSTBL (0x2e)
#define SECISR (0x2f)
#define RXSR (0x30)
#define ISRSTS (0x31)
#define INTMSK (0x32)
#define GPIO (0x33)
#define GPIODIR (0x34)
#define SLPACK (0x35)
#define RFCTL (0x36)
#define SECCR2 (0x37)
//#define  (0x38)
#define BBREG1 (0x39)
#define BBREG2 (0x3a)
#define BBREG3 (0x3b)
#define BBREG4 (0x3c)
#define BBREG5 (0x3d)
#define BBREG6 (0x3e)
#define RSSITHCCA (0x3f)


//MRF24J40 long address registers
#define RFCON0 (0x200)
#define RFCON1 (0x201)
#define RFCON2 (0x202)
#define RFCON3 (0x203)
#define RFCON4 (0x204)
#define RFCON5 (0x205)
#define RFCON6 (0x206)
#define RFCON7 (0x207)
#define RFCON8 (0x208)
#define CAL1 (0x209)
#define CAL2 (0x20a)
#define CAL3 (0x20b)
#define SFCNTRH (0x20c)
#define SFCNTRM (0x20d)
#define SFCNTRL (0x20e)
#define RFSTATE (0x20f)
#define BATTERYTH (0x210)
#define CLKIRQCR (0x211)
#define SRCADRMODE (0x212)
#define SRCADDR0 (0x213)
#define SRCADDR1 (0x214)
#define SRCADDR2 (0x215)
#define SRCADDR3 (0x216)
#define SRCADDR4 (0x217)
#define SRCADDR5 (0x218)
#define SRCADDR6 (0x219)
#define SRCADDR7 (0x21a)
#define RXFRAMESTATE (0x21b)
#define SECSTATUS (0x21c)
#define STCCMP (0x21d)
#define HLEN (0x21e)
#define FLEN (0x21f)
#define SLPCON1 (0x220)
//#define reserved (0x221)
#define WAKETIMEL (0x222)
#define WAKETIMEH (0x223)
#define TXREMCNTL (0x224)
#define TXREMCNTH (0x225)
#define TXMAINCNTL (0x226)
#define TXMAINCNTM (0x227)
#define TXMAINCNTH0 (0x228)
#define TXMAINCNTH1 (0x229)
#define RFMANUALCTRLEN (0x22a)
#define RFMANUALCTRL (0x22b)
#define RFRXCTRL RFMANUALCTRL
#define TxDACMANUALCTRL (0x22c)
#define RFMANUALCTRL2 (0x22d)
#define TESTRSSI (0x22e)
#define TESTMODE (0x22f)


#define NORMAL_TX_FIFO  (0x000)
#define BEACON_TX_FIFO  (0x080)
#define GTS1_TX_FIFO    (0x100)
#define GTS2_TX_FIFO    (0x180)


#define RX_FIFO         (0x300)


#define SECURITY_FIFO   (0x280)
Can anyone help me? Thank you in advance.

BR,
Vincent