Saturday, November 14, 2009

SPI code for communication between two P89V51 RD2 controllers

//Pseudo code for communication between two microcontrollers


//Tested on p89v51RD2 controller



#include

#include



void init_master(void);

void init_slave(void);

void delay(void);

int transfer_data(void);

int recieve_data(void);

sbit ssbar=P1^4;

sbit mosi=P1^5;

sbit miso=P1^6;

sbit device_check=P2^7; // check bit for device to work in either mode

sbit slave_this=P2^6; // low this pin for slave mode

sbit master_this=P2^5; // low this pin for master mode



char sen[]={0x01,0x01,0x02,0x03,0x00,0x00,0x00,0x00};

char rec[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};



void main()

{ int flag;

int device;

int done;

P2=0xFF;

delay();

delay();



do

{

if(slave_this==0x00)

{device=1;

flag=1 ;}

if(master_this==0x00)

{device=0;

flag=1;}





}while(flag==1);







delay();

switch (device)

{

case 0:

ssbar=0x00;

init_master();

done=transfer_data();

if(done==0x01)

SPCFG=0X80; //after COMPLETEION OF DATA TRANSFER SPIF SET HIGH;



break;

case 1:

delay();

delay();

if(ssbar=0x00)

{

init_slave();

recieve_data();}

break;

default:

break;

}







}







void init_master()

{

SPCTL=0x50;

}



void init_slave()

{

SPCTL=0x44;

}











int transfer_data()

{

int i;

delay();

for(i=0;i<8;i++)

{



SPDAT=sen[i];

delay();

delay();



}







return 1;



}







int recieve_data()

{

int i;

delay();

delay();

for(i=0;i<8;i++)

{



rec[i]=SPDAT;

delay();

delay();



}





return 1;



}

void delay()

{

int i;

for(i=0;i<=30000;i++);



}