//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++);
}