[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