Sie sind auf Seite 1von 6

#include "p18cxxx.

h"
#include "I2C.h"
void InitI2C()
{
TRISBbits.TRISB0=1;
TRISBbits.TRISB1=1;

//Setting up SDA/SCL pins as inputs

SSPCON1bits.SSPM3=1;
1))
SSPCON1bits.SSPM2=0;
SSPCON1bits.SSPM1=0;
SSPCON1bits.SSPM0=0;

//I2C Master mode, clock = FOSC/(4 * (SSPADD +

SSPCON1bits.CKP=0;

//Unused in master mode

SSPSTATbits.SMP=1;
SSPSTATbits.CKE=0;
SSPADD= SSPADD_VAL;
SSPCON1bits.SSPEN=1;
}

//Enabling slew control for high sped mode


//Disable SMBus specific inputs
//Setting I2C clock
//Enabling MSSP module

unsigned char I2CWrite(unsigned char device,unsigned char


address,unsigned char data)
{
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;

//Waiting for transmission of address along


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

//Checking if salve has accepted address


//Generating STOP condition

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;

//Waiting for transmission of address along


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

//Checking if salve has accepted address


//Generating STOP condition

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

//Checking if salve has accepted data


//Generating STOP condition

}
SSPCON2bits.PEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(1);
}

//Generating STOP condition

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

unsigned char I2CRandomRead(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;

//Selecting device in write mode

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;

//Setting read address

//Checking if slave has accepted address


//Generating STOP condition

//generating repeated start condition

////Sending Read Command


SSPBUF=device|0x01;

//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;

//Enabling Master Receive Mode


//Waiting to receive a byte
//Clearing interrupt flag
//Positively acknowledging reception of
//Starting acknowlegment procedure
//Waiting for acknowledgement transmission
//Getting received data byte

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

//Enabling Master Receive Mode


//Waiting to receive a byte
//Clearing interrupt flag
//Positively acknowledging reception of
//Starting acknowlegment procedure
//Waiting for neg_acknowledgement
//Getting received data byte
//Generating STOP condition

unsigned char I2CCurrentRead(unsigned char device,unsigned char


*data,unsigned char no_bytes)
{
unsigned char i;
SSPCON2bits.SEN=1;
//generating repeated start condition
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
////Sending Read Command
SSPBUF=device|0x01;

//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;

//Enabling Master Receive Mode


//Waiting to receive a byte
//Clearing interrupt flag
//Positively acknowledging reception of
//Starting acknowlegment procedure
//Waiting for acknowledgement transmission
//Getting received data byte

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

//Enabling Master Receive Mode


//Waiting to receive a byte
//Clearing interrupt flag
//Positively acknowledging reception of
//Starting acknowlegment procedure
//Waiting for neg_acknowledgement
//Getting received data byte
//Generating STOP condition

Das könnte Ihnen auch gefallen