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