[Icc-avr] read and write i2c eeprom using twi?
John Baraclough
j_baraclough at zetnet.co.uk
Sun Sep 30 13:47:05 PDT 2007
Skipped content of type multipart/alternative-------------- next part --------------
/* ************************************************************************ *\
File: I2C.c
Purpose: Contains all drivers and functions for the I2C bus
Revisions:
1.00 JNB 2005-11-17
Notes:
\* ************************************************************************ */
#include <includes.h>
unsigned char RtcReadControlReg(unsigned char Register)
{
unsigned char ucTemp;
// Send START condition
TWCR = BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Send slave address + write
TWDR = RTC_SLA_W;
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Load register number into TWDR Register.
TWDR = Register;
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Send REPEATED_START condition
TWCR = BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Send slave address + read.
TWDR = RTC_SLA_R;
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Start the read operation with a NACK as only one byte is being read.
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Get the data.
ucTemp = TWDR;
// Transmit STOP condition
TWCR = BIT(TWINT) | BIT(TWEN) | BIT(TWSTO);
return(ucTemp);
}
void RtcWriteControlReg(unsigned char Register, unsigned char Value)
{
// Send START condition
TWCR = BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
TWDR = RTC_SLA_W;
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Send register number.
TWDR = Register;
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Send value.
TWDR = Value;
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
//Transmit STOP condition
TWCR = BIT(TWINT) | BIT(TWEN) | BIT(TWSTO);
}
void I2cGetTimeRegs(unsigned char *Buffer)
{
unsigned char x;
unsigned char *ucP;
ucP = Buffer;
TWCR = BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)))
;
TWDR = RTC_SLA_W;
TWCR = BIT(TWINT) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)))
;
TWDR = 0;
TWCR = BIT(TWINT) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)))
;
TWCR = BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)))
;
TWDR = RTC_SLA_R;
TWCR = BIT(TWINT) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)))
;
// There are seven time registers to read:
// Seconds, Minutes, Hours, Day, Date, Month & Year.
for(x = 0; x < 7; x++)
{
TWCR = BIT(TWINT) | BIT(TWEA) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)))
;
*ucP++ = TWDR;
}
TWCR = BIT(TWINT) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)))
;
*ucP = TWDR;
TWCR = BIT(TWINT) | BIT(TWEN) | BIT(TWSTO);
}
void I2cSetTimeRegs(unsigned char *Buffer)
{
unsigned char x;
unsigned char *ucP;
ucP = Buffer;
TWCR = BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)))
;
TWDR = RTC_SLA_W;
TWCR = BIT(TWINT) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)))
;
TWDR = 0;
TWCR = BIT(TWINT) | BIT(TWEN);
for(x = 0; x < 8; x++)
{
while (!(TWCR & BIT(TWINT)))
;
TWDR = *ucP++;
TWCR = BIT(TWINT) | BIT(TWEN);
}
while (!(TWCR & BIT(TWINT)))
;
TWCR = BIT(TWINT) | BIT(TWEN) | BIT(TWSTO);
}
/* ************************************************************************ *\
unsigned char ReadEepromByte(unsigned int Address)
{
unsigned char ucTemp;
// Send START condition
TWCR = BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Send slave address + write
TWDR = EEPROM_SLA_W;
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Send high address.
TWDR = (unsigned char)((Address >> 8) & 0xff);
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Send low address.
TWDR = (unsigned char)(Address & 0xff);
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Send REPEATED_START condition
TWCR = BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Send slave address + read.
TWDR = EEPROM_SLA_R;
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Start the read operation with a NACK as only one byte is being read.
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Get the data.
ucTemp = TWDR;
// Transmit STOP condition
TWCR = BIT(TWINT) | BIT(TWEN) | BIT(TWSTO);
return(ucTemp);
}
void WriteEepromByte(unsigned int Address, unsigned char Value)
{
// Send START condition
TWCR = BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
TWDR = EEPROM_SLA_W;
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Send high address.
TWDR = (unsigned char)((Address >> 8) & 0xff);
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Send low address.
TWDR = (unsigned char)(Address & 0xff);
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
// Send value.
TWDR = Value;
TWCR = BIT(TWINT) | BIT(TWEN);
// Wait for TWINT Flag set.
while (!(TWCR & BIT(TWINT)))
;
//Transmit STOP condition
TWCR = BIT(TWINT) | BIT(TWEN) | BIT(TWSTO);
}
\* ************************************************************************ */
More information about the Icc-avr
mailing list