Beruflich Dokumente
Kultur Dokumente
h"
#include "I2C.h"
void InitI2C()
{
TRISBbits.TRISB0=1;
TRISBbits.TRISB1=1;
SSPCON1bits.SSPM3=1;
1))
SSPCON1bits.SSPM2=0;
SSPCON1bits.SSPM1=0;
SSPCON1bits.SSPM0=0;
SSPCON1bits.CKP=0;
SSPSTATbits.SMP=1;
SSPSTATbits.CKE=0;
SSPADD= SSPADD_VAL;
SSPCON1bits.SSPEN=1;
}
//Sending Address
while(!PIR1bits.SSPIF);
with reception of ACK bit
PIR1bits.SSPIF=0;
SSPBUF=data;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
if(SSPCON2bits.ACKSTAT==1)
//Checking if salve has accepted data
returning if not
{
SSPCON2bits.PEN=1;
//Generating STOP condition
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(0);
}
else
{
SSPCON2bits.PEN=1;
//Generating STOP condition
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(1);
}
}
unsigned char I2CPageWrite(unsigned char device,unsigned char
address,unsigned char* data,unsigned char no_bytes)
{
unsigned char i;
SSPCON2bits.SEN=1;
//Generating start condition
while(!PIR1bits.SSPIF);
//Waiting for transmission of start bit
PIR1bits.SSPIF=0;
//Clearing SSPIF flag
SSPBUF=device&0xFE;
//Sending Address
while(!PIR1bits.SSPIF);
with reception of ACK bit
PIR1bits.SSPIF=0;
for(i=0;i<no_bytes;i++)
{
SSPBUF=data[i];
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
if(SSPCON2bits.ACKSTAT==1)
returning if not
{
SSPCON2bits.PEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(0);
}
}
SSPCON2bits.PEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(1);
}
void I2CDeviceReady(unsigned
{
SSPCON2bits.SEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
while(1)
{
SSPBUF=device&0xFE;
while(!PIR1bits.SSPIF);
with reception of ACK bit
PIR1bits.SSPIF=0;
if(SSPCON2bits.ACKSTAT==1)
not
{
SSPCON2bits.RSEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
}
else
{
SSPCON2bits.PEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
break;
}
};
}
char device)
//Generating start condition
//Waiting for transmission of start bit
//Clearing SSPIF flag
//Sending Address
//Waiting for transmission of address along
//Clearing SSPIF flag
//Checking if salve is ready rechecking if
while(!PIR1bits.SSPIF);
//Waiting for transmission of device address
along with reception of ACK bit
PIR1bits.SSPIF=0;
//Clearing SSPIF flag
if(SSPCON2bits.ACKSTAT==1) //Checking if salve has responded returning
if not terminating and returning
{
SSPCON2bits.PEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(0);
}
SSPBUF=address;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
if(SSPCON2bits.ACKSTAT==1)
returning if not
{
SSPCON2bits.PEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(0);
}
SSPCON2bits.RSEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
//Sending Address
while(!PIR1bits.SSPIF);
//Waiting for transmission of read command
along with reception of ACK bit
PIR1bits.SSPIF=0;
//Clearing SSPIF flag
if(SSPCON2bits.ACKSTAT==1) //Checking if salve has responded,returning
if not,terminating and returning
{
SSPCON2bits.PEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(0);
}
}
SSPCON2bits.RCEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
SSPCON2bits.ACKDT=1;
data
SSPCON2bits.ACKEN=1;
while(!PIR1bits.SSPIF);
transmission
PIR1bits.SSPIF=0;
data[i]=SSPBUF;
SSPCON2bits.PEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(1);
}
//Sending Address
while(!PIR1bits.SSPIF);
//Waiting for transmission of read command
along with reception of ACK bit
PIR1bits.SSPIF=0;
//Clearing SSPIF flag
if(SSPCON2bits.ACKSTAT==1) //Checking if salve has responded,returning
if not,terminating and returning
{
SSPCON2bits.PEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(0);
}
/////// Master receiving configuration //////////
for(i=0;i<(no_bytes-1);i++)
{
SSPCON2bits.RCEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
SSPCON2bits.ACKDT=0;
data
SSPCON2bits.ACKEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
data[i]=SSPBUF;
}
SSPCON2bits.RCEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
SSPCON2bits.ACKDT=1;
data
SSPCON2bits.ACKEN=1;
while(!PIR1bits.SSPIF);
transmission
PIR1bits.SSPIF=0;
data[i]=SSPBUF;
SSPCON2bits.PEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(1);
}