rtc interfacing using i2c #18f4550

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

Upload: bhushan-patil

Post on 05-Jan-2016

10 views

Category:

Documents


0 download

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

#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

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

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

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

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

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

}