
#include "msp430.h"
#include <stdint.h>
#include<string.h>
#include <stdio.h>

volatile int a=0;
volatile int b=0;
volatile int c=0;
volatile unsigned char TXData;
volatile unsigned char TXByteCtr;
volatile unsigned char RXByteCtr;
//volatile unsigned char RXByteCtrHmd;
volatile uint16_t ReceivedData;


float fTemp;
float fHumid;
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT


  P3DIR |= BIT6 +BIT7;
  P3OUT &= ~(BIT6 +BIT7);
/*
  PMAPPWD = 0x02D52;                        // Get write-access to port mapping regs
  P1MAP3 = PM_UCB0SDA;                      // Map UCB0SDA output to P2.6
  P1MAP1 = PM_UCB0SCL;                      // Map UCB0SCL output to P2.7
  PMAPPWD = 0;                              // Lock port mapping registers
*/

  P1SEL |= BIT3 + BIT2;                     // Select P2.6 & P2.7 to I2C function


  UCB0CTL1 |= UCSWRST;                      // Enable SW reset
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
  UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
  UCB0BR0 = 16;                             // fSCL = SMCLK/12 = ~100kHz
  UCB0BR1 = 0;

  //0x80 is the address of sht21
  //UCB0I2CSA = 0x48;                         // Slave Address is 048h
  UCB0I2CSA = 0x40;                         // Slave Address is 040h
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
  UCB0IE |= UCTXIE;
  UCB0IE |= UCRXIE;// Enable TX interrupt
  UCB0IE |= UCNACKIE;
 UCB0IE |= UCSTPIE  ;
 UCB0IE |= UCSTTIE  ;
 /* TXDataTemp = 0xE3;
  TXDataHumidity=0xE5;// Holds TX data*/

  while (1)
  {
	 __delay_cycles(15000);
    TXByteCtr = 0x01;                          // Load TX byte counter
    RXByteCtr = 0x01;
    //RXByteCtrHmd=0x01;
  //  while (UCB0CTL1 & UCTXSTP);
    if (UCB0STAT & UCBBUSY)                   // test if bus to be free
             {                                         // otherwise a manual Clock on is
                                                       // generated
            	 P1SEL  &= ~BIT2;               // Select Port function for SCL
            	 P1OUT &= ~BIT2;               //
            	 P1DIR |= BIT2;                // drive SCL low
            	 P1SEL |= BIT3 +BIT2;
             }// Ensure stop condition got sent
    TXData= 0xE3;
    UCB0CTL1 |= UCTR + UCTXSTT;
   // I2C TX, start condition

    //__delay_cycles();
    __bis_SR_register(LPM0_bits + GIE);     // Enter LPM0 w/ interrupts



    /*loop:// is TX'd
       if(a==1)
       {
       	  a=0;
       	 printf("%s","for transmission problem");
           UCB0CTL1 |= UCTR +UCTXSTT;                  // I2C stop condition
           //__delay_cycles(50);

           __bis_SR_register(LPM0_bits + GIE);

           if (c!=1)
           	goto loop;


       }*/
/*if(b==1){
	b=0;*/
      /*while (UCB0CTL1 & UCTXSTP);
      while (UCB0STAT&UCBBUSY)  ;*/
	UCB0CTL1 &=~UCTR;// Use SMCLK, keep SW reset
	                     // Clear SW reset, resume operation
	                         // Enable TX interrupt


	UCB0CTL1 |= UCTXSTT;

	__bis_SR_register(LPM0_bits + GIE);
	fTemp = -46.85 + ((175.72)*((float) ReceivedData/65536));
	  printf("Temp=%f", fTemp );
/*}*/

/*loop2:// is TX'd
   if(a==1)
   {
   	  a=0;
   	 printf("%s","for receiving problem");
   	  UCB0CTL1 &=~UCTR;
       UCB0CTL1 |= UCTXSTT;                  // I2C stop condition
       //__delay_cycles(50);

      __bis_SR_register(LPM0_bits + GIE);

       if (UCB0STAT&UCBBUSY)
       	goto loop2;

   }*/
	  TXByteCtr = 0x01;                          // Load TX byte counter
	     RXByteCtr = 0x01;
	 TXData = 0xE5;
	    UCB0CTL1 |= UCTR + UCTXSTT;
	   // I2C TX, start condition

	    //__delay_cycles();
	    __bis_SR_register(LPM0_bits + GIE);

	    UCB0CTL1 &=~UCTR;// Use SMCLK, keep SW reset
	    	                     // Clear SW reset, resume operation
	    	                         // Enable TX interrupt


	    	UCB0CTL1 |= UCTXSTT;

	    	__bis_SR_register(LPM0_bits + GIE);
	    	fHumid = -6 + ((125)*((float) ReceivedData/65536));
	    	 printf("Humidity=%f", fHumid );
   printf("counter1=%d,counter2=%d\n",10,9);
  // Increment data byte
  }
}

//------------------------------------------------------------------------------
// The USCIAB0_ISR is structured such that it can be used to transmit any
// number of bytes by pre-loading TXByteCtr with the byte count.
//------------------------------------------------------------------------------
#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
  switch(__even_in_range(UCB0IV,12))
  {
  case  0: break;                           // Vector  0: No interrupts
  case  2: break;                           // Vector  2: ALIFG
  case  4:
     P3OUT |=BIT7; // UCB0CTL1 |= UCTXSTP;                  // I2C stop condition
    a=1; //P3OUT=BIT6;
            printf("%s","not acknowledgement interrupt");
     __bic_SR_register_on_exit(LPM0_bits); // Exit LPM0

      break;                           // Vector  4: NACKIFG
  case  6:
	  P3OUT |=BIT6;
	  printf("%s","in start flag");
	  __bic_SR_register_on_exit(LPM0_bits);
	  break;                           // Vector  6: STTIFG
  case  8:
	  printf("%s","in stop flag");
	  __bic_SR_register_on_exit(LPM0_bits);
	  break;                           // Vector  8: STPIFG
  case 10:
	  if (RXByteCtr)
	  {
		  RXByteCtr--;



		  ReceivedData= UCB0RXBUF<<8
	     			;

	      UCB0CTL1 |= UCTXSTP;


	   }
	  else{
               UCB0CTL1 |= UCTXNACK  ;
               ReceivedData|= UCB0RXBUF;
               ReceivedData =ReceivedData>>2;
               ReceivedData=ReceivedData<<2;
		//  tc = -46.85 + ((175.72)*((float) Temp/65536));
	  while(UCB0CTL1 & UCTXSTP);
	  P3OUT |=BIT6;

	  //printf("Temp=%f", tc );
	 __bic_SR_register_on_exit(LPM0_bits);
	  }
	  break;                           // Vector 10: RXIFG
  case 12:                                  // Vector 12: TXIFG
    if (TXByteCtr)                          // Check TX byte counter
    {

      UCB0TXBUF = TXData;
 //(UCB0CTL1 & UCTXSTT);// Load TX buffer
      TXByteCtr--;

      // Decrement TX byte counter
    }
    else
    {
        //P3OUT ^= BIT6;                    // Toggle LED1
      UCB0CTL1 |= UCTXSTP;
      while (UCB0CTL1 & UCTXSTP);// I2C stop condition
       //   c=1 ;       // Clear USCI_B0 TX int flag
         // b=1;
       printf("%s","transmission finished");
        __bic_SR_register_on_exit(LPM0_bits);


    // Exit LPM0
    }
    break;
  default: break;


  }
 // __delay_cycles(500);
}















/*
#include "msp430.h"
#include <stdint.h>
#include<string.h>
#include <stdio.h>

volatile int a=0;
volatile int b=0;
volatile unsigned char TXData;
volatile unsigned char TXByteCtr;
volatile unsigned char RXByteCtr;
volatile uint16_t Temp;
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

 // __delay_cycles(2000000);
  P3DIR |= BIT6 +BIT7;
  P3OUT &= ~(BIT6 +BIT7);
  PMAPPWD = 0x02D52;                        // Get write-access to port mapping regs
  P1MAP3 = PM_UCB0SDA;                      // Map UCB0SDA output to P2.6
  P1MAP1 = PM_UCB0SCL;                      // Map UCB0SCL output to P2.7
  PMAPPWD = 0;                              // Lock port mapping registers

  P1SEL |= BIT1 + BIT3;                     // Select P2.6 & P2.7 to I2C function


  UCB0CTL1 |= UCSWRST;                      // Enable SW reset
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
  UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
  UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
  UCB0BR1 = 0;

  //0x80 is the address of sht21
  //UCB0I2CSA = 0x48;                         // Slave Address is 048h
  UCB0I2CSA = 0x40;                         // Slave Address is 040h
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
  UCB0IE |= UCTXIE;                         // Enable TX interrupt
  UCB0IE |= UCNACKIE;
  TXData = 0xF3;                            // Holds TX data

  while (1)
  {
    TXByteCtr = 0x01;                          // Load TX byte counter
    RXByteCtr = 0x01;
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
    UCB0CTL1 |= UCTR + UCTXSTT;
   // I2C TX, start condition

    //__delay_cycles();
    __bis_SR_register(LPM0_bits + GIE);     // Enter LPM0 w/ interrupts

    __no_operation();                       // Remain in LPM0 until all data

loop:// is TX'd
   if(a==1)
   {
   	  a=0;
       UCB0CTL1 |= UCTXSTT;                  // I2C stop condition
       //__delay_cycles(50);
       printf("%s","not acknowledgement interrupt outer");
       __bis_SR_register(LPM0_bits + GIE);

       if (UCB0STAT&UCBBUSY)
       	goto loop;

   }

   printf("counter1=%d,counter2=%d\n",10,9);  // Increment data byte
  }
}

//------------------------------------------------------------------------------
// The USCIAB0_ISR is structured such that it can be used to transmit any
// number of bytes by pre-loading TXByteCtr with the byte count.
//------------------------------------------------------------------------------
#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
  switch(__even_in_range(UCB0IV,12))
  {
  case  0: break;                           // Vector  0: No interrupts
  case  2: break;                           // Vector  2: ALIFG
  case  4:
     // UCB0CTL1 |= UCTXSTP;                  // I2C stop condition
            a=1;
            printf("%s","not acknowledgement interrupt");
      __bic_SR_register_on_exit(LPM0_bits); // Exit LPM0

      break;                           // Vector  4: NACKIFG
  case  6:
	  printf("%s","in start flag");
	  P3OUT=BIT6;break;                           // Vector  6: STTIFG
  case  8:
	  printf("%s","in stop flag");P3OUT=BIT7;break;                           // Vector  8: STPIFG
  case 10:
	  if (RXByteCtr)
	  {
		  RXByteCtr--;



	     	Temp= UCB0RXBUF<<8;
	      UCB0CTL1 |= UCTXSTP;


	   }
	  else{

		  Temp|= UCB0RXBUF;
	  while(UCB0CTL1 & UCTXSTP);
	  P3OUT |=BIT6;

	  __bic_SR_register_on_exit(LPM0_bits);
	  }break;                           // Vector 10: RXIFG
  case 12:                                  // Vector 12: TXIFG
    if (TXByteCtr)                          // Check TX byte counter
    {
      UCB0TXBUF = TXData;                   // Load TX buffer
      TXByteCtr--;                          // Decrement TX byte counter
    }
    else
    {
        //P3OUT ^= BIT6;                    // Toggle LED1

      UCB0CTL1 |= UCTXSTP;
      while (UCB0CTL1 & UCTXSTP);// I2C stop condition
                  // Clear USCI_B0 TX int flag

      __bic_SR_register_on_exit(LPM0_bits);
      b=1;
      printf("%s","transmission finished");// Exit LPM0
    }
    break;
  default: break;
  }
}
*/

