Datasheet

© 2011 Microchip Technology Inc. DS25095A-page 47
MCP9808
/********************************************************************
* Function Name: i2c_write
* Return Value: Status byte for WCOL detection.
* Parameters: Single data byte for I2C2 bus.
* Description: This routine writes a single byte to the
* I2C2 bus.
********************************************************************/
unsigned char i2c_write( unsigned char i2cWriteData ) {
PIR1bits.SSPIF = 0; // clear interrupt
while ( SSPSTATbits.BF ) ; // wait for idle condition
SSPBUF = i2cWriteData; // Load SSPBUF with i2cWriteData (the value to be transmit-
ted)
while (!PIR1bits.SSPIF) ; // wait for a flag to be set
PIR1bits.SSPIF = 0; // clear flag
return ( !SSPCON2bits.ACKSTAT ); // function returns '1' if transmission is acknowledged
}
/********************************************************************
* Function Name: i2c_read
* Return Value: contents of SSP2BUF register
* Parameters: ack = 1 and nak = 0
* Description: Read a byte from I2C bus and ACK/NAK device
********************************************************************/
unsigned char i2c_read( unsigned char ack ) {
unsigned char i2cReadData;
PIR1bits.SSPIF = 0;// clear interrupt
while ( SSPSTATbits.BF ) ; // wait for idle condition
SSPCON2bits.RCEN = 1; // enable receive mode
while (!PIR1bits.SSPIF) ; // wait for a flag to be set
PIR1bits.SSPIF = 0;// clear flag
i2cReadData = SSPBUF; // Read SSPBUF and put it in i2cReadData
if ( ack ) { // if ack=1
SSPCON2bits.ACKDT = 0; // then transmit an Acknowledge
} else {
SSPCON2bits.ACKDT = 1; // otherwise transmit a Not Acknowledge
}
SSPCON2bits.ACKEN = 1; // send acknowledge sequence
while (!PIR1bits.SSPIF) ; // wait for a flag to be set
PIR1bits.SSPIF = 0;// clear flag
return( i2cReadData ); // return the value read from SSPBUF
}