#include <msp430x16x.h>
#include <stdio.h>

unsigned int i = 0;

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                         // Stop watchdog
  P3SEL |= 0x0a;                                    // Assign I2C pins to module
  U0CTL |= I2C + SYNC;                              // Switch USART0 to I2C mode (Reccommended I2C init procedure)
  U0CTL &= ~I2CEN;                                  // Disable the I2C module (Recommended I2C init procedure)
  
  // Now configure I2C Module with I2CEN  = 0
  
  I2CTCTL |= I2CSSEL_1;                             // ACLK
  I2CSCLH = 0x00;                                   // High period of SCL
  I2CSCLL = 0x00;                                   // Low period of SCL
  I2CNDAT = 0x08;                                   // Send 8 bytes (byte = 8 bits) 
  I2CSA = 0x0068;                                   // Slave address is 0x68
  
  // Now enable I2C Module

  U0CTL |= I2CEN;                                   // Enable I2C using a 7-bit address
  
  //Now set time
  
  U0CTL |= MST;                                 // Master mode
  I2CTCTL |= I2CTRX + I2CSTT + I2CSTP;          // Transmit, ST, SP (clears MST)
  while ((I2CIFG & ARDYIFG) != ARDYIFG)         // Check if all data has been sent
  {
    while (( I2CDCTL & I2CTXUDF) == I2CTXUDF)   // Check if data is ready to be sent
    {
      switch ( i )
      {
      case 0:
        I2CDRB = 0x00;                            // Set register pointer to seconds
        i++;
        break;
      case 1:
        I2CDRB = 0x00;                            // Set seconds
        i++;
        break;
      case 2:
        I2CDRB = 0x00;                            // Set minutes
        i++;
        break;
      case 3:
        I2CDRB = 0x00;                            // Set hours
        i++;
        break;
      case 4:
        I2CDRB = 0x00;                            // Set day
        i++;
        break;
      case 5:
        I2CDRB = 0x00;                            // Set date
        i++;
        break;
      case 6:
        I2CDRB = 0x00;                            // Set month
        i++;
        break;
      case 7:
        I2CDRB = 0x00;                            // Set year
        break;
      }
    }
  }
  
  // Disable to configure to read seconds, minutes, hours, day, date, month and year only
  
  U0CTL &= ~I2CEN;                                  // Disable the I2C module (Recommended I2C init procedure)
  I2CNDAT = 0x07;                                   // Read 7 bytes (byte = 8 bits)
  U0CTL |= I2CEN;                                   // Enable I2C using a 7-bit address
  
  // Now read time continuously
  
  while (1)
  {   
      I2CIFG &= ~ARDYIFG;                           // Reset ARDYIFG bit
      U0CTL |= MST;                                 // Master mode
      I2CTCTL |= I2CTRX + I2CSTT;                   // Transmit, ST
      while (( I2CDCTL & I2CTXUDF) != I2CTXUDF)     // Wait till TX register and buffer are empty  
      {
      }
      I2CDRB = 0x00;                                // Reset register pointer to read seconds first
      I2CTCTL &= ~I2CTRX;                           // Reset I2CTRX bit
      I2CTCTL |= I2CSTT + I2CSTP;                   // Receive, Restart, SP (clears MST)
      while ((I2CIFG & ARDYIFG) != ARDYIFG)         // Check if all data has been read
      {
        while (( I2CDCTL & I2CRXOVR) == I2CRXOVR)   // Check if data is ready to be read
        {
         printf ("%x\n", I2CDRB);
        }
      }
  }
}

