rtc interfacing using i2c #18f4550
DESCRIPTION
This program is for interfacing RTC to PIC18f4550 micro-controller using I2C using MPLAB software. For i2c.h file try searching "I2C_H #18f4550"TRANSCRIPT
![Page 1: RTC interfacing using I2C #18f4550](https://reader035.vdocument.in/reader035/viewer/2022081805/563db7ce550346aa9a8e1fcf/html5/thumbnails/1.jpg)
#include "p18cxxx.h"
#include "I2C.h"
void InitI2C()
{
TRISBbits.TRISB0=1; //Setting up SDA/SCL pins as inputs
TRISBbits.TRISB1=1;
SSPCON1bits.SSPM3=1; //I2C Master mode, clock = FOSC/(4 * (SSPADD +
1))
SSPCON1bits.SSPM2=0;
SSPCON1bits.SSPM1=0;
SSPCON1bits.SSPM0=0;
SSPCON1bits.CKP=0; //Unused in master mode
SSPSTATbits.SMP=1; //Enabling slew control for high sped mode
SSPSTATbits.CKE=0; //Disable SMBus specific inputs
SSPADD= SSPADD_VAL; //Setting I2C clock
SSPCON1bits.SSPEN=1; //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); //Waiting for transmission of 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) //Checking if salve has accepted address
returning if not
{
SSPCON2bits.PEN=1; //Generating STOP condition
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(0);
}
![Page 2: RTC interfacing using I2C #18f4550](https://reader035.vdocument.in/reader035/viewer/2022081805/563db7ce550346aa9a8e1fcf/html5/thumbnails/2.jpg)
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); //Waiting for transmission of 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) //Checking if salve has accepted address
returning if not
{
SSPCON2bits.PEN=1; //Generating STOP condition
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(0);
}
![Page 3: RTC interfacing using I2C #18f4550](https://reader035.vdocument.in/reader035/viewer/2022081805/563db7ce550346aa9a8e1fcf/html5/thumbnails/3.jpg)
for(i=0;i<no_bytes;i++)
{
SSPBUF=data[i];
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);
}
}
SSPCON2bits.PEN=1; //Generating STOP condition
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(1);
}
void I2CDeviceReady(unsigned char device)
{
SSPCON2bits.SEN=1; //Generating start condition
while(!PIR1bits.SSPIF); //Waiting for transmission of start bit
PIR1bits.SSPIF=0; //Clearing SSPIF flag
while(1)
{
SSPBUF=device&0xFE; //Sending Address
while(!PIR1bits.SSPIF); //Waiting for transmission of address along
with reception of ACK bit
PIR1bits.SSPIF=0; //Clearing SSPIF flag
if(SSPCON2bits.ACKSTAT==1) //Checking if salve is ready rechecking if
not
{
SSPCON2bits.RSEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
}
else
{
SSPCON2bits.PEN=1;
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
break;
}
};
}
![Page 4: RTC interfacing using I2C #18f4550](https://reader035.vdocument.in/reader035/viewer/2022081805/563db7ce550346aa9a8e1fcf/html5/thumbnails/4.jpg)
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; //Setting read address
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
if(SSPCON2bits.ACKSTAT==1) //Checking if slave has accepted address
returning if not
{
SSPCON2bits.PEN=1; //Generating STOP condition
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(0);
}
SSPCON2bits.RSEN=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);
}
![Page 5: RTC interfacing using I2C #18f4550](https://reader035.vdocument.in/reader035/viewer/2022081805/563db7ce550346aa9a8e1fcf/html5/thumbnails/5.jpg)
/////// Master receiving configuration //////////
for(i=0;i<(no_bytes-1);i++)
{
SSPCON2bits.RCEN=1; //Enabling Master Receive Mode
while(!PIR1bits.SSPIF); //Waiting to receive a byte
PIR1bits.SSPIF=0; //Clearing interrupt flag
SSPCON2bits.ACKDT=0; //Positively acknowledging reception of
data
SSPCON2bits.ACKEN=1; //Starting acknowlegment procedure
while(!PIR1bits.SSPIF); //Waiting for acknowledgement transmission
PIR1bits.SSPIF=0;
data[i]=SSPBUF; //Getting received data byte
}
SSPCON2bits.RCEN=1; //Enabling Master Receive Mode
while(!PIR1bits.SSPIF); //Waiting to receive a byte
PIR1bits.SSPIF=0; //Clearing interrupt flag
SSPCON2bits.ACKDT=1; //Positively acknowledging reception of
data
SSPCON2bits.ACKEN=1; //Starting acknowlegment procedure
while(!PIR1bits.SSPIF); //Waiting for neg_acknowledgement
transmission
PIR1bits.SSPIF=0;
data[i]=SSPBUF; //Getting received data byte
SSPCON2bits.PEN=1; //Generating STOP condition
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(1);
}
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;
![Page 6: RTC interfacing using I2C #18f4550](https://reader035.vdocument.in/reader035/viewer/2022081805/563db7ce550346aa9a8e1fcf/html5/thumbnails/6.jpg)
return(0);
}
/////// Master receiving configuration //////////
for(i=0;i<(no_bytes-1);i++)
{
SSPCON2bits.RCEN=1; //Enabling Master Receive Mode
while(!PIR1bits.SSPIF); //Waiting to receive a byte
PIR1bits.SSPIF=0; //Clearing interrupt flag
SSPCON2bits.ACKDT=0; //Positively acknowledging reception of
data
SSPCON2bits.ACKEN=1; //Starting acknowlegment procedure
while(!PIR1bits.SSPIF); //Waiting for acknowledgement transmission
PIR1bits.SSPIF=0;
data[i]=SSPBUF; //Getting received data byte
}
SSPCON2bits.RCEN=1; //Enabling Master Receive Mode
while(!PIR1bits.SSPIF); //Waiting to receive a byte
PIR1bits.SSPIF=0; //Clearing interrupt flag
SSPCON2bits.ACKDT=1; //Positively acknowledging reception of
data
SSPCON2bits.ACKEN=1; //Starting acknowlegment procedure
while(!PIR1bits.SSPIF); //Waiting for neg_acknowledgement
transmission
PIR1bits.SSPIF=0;
data[i]=SSPBUF; //Getting received data byte
SSPCON2bits.PEN=1; //Generating STOP condition
while(!PIR1bits.SSPIF);
PIR1bits.SSPIF=0;
return(1);
}