title: Msp430 i²c module and libraries
body: <p>I have a project that has a MSP430G2553 master device and a Triple-Axis Digital-Output Gyro ITG-3200 Breakout slave. ITG3200 uses i²c protocol to communicate so i've been checking out the i²c module usage on Msp. For a starter i downloaded the TI I²c examples which can be found in <a href="http://www.ti.com/lsds/ti/microcontroller/16-bit_msp430/msp430_software_landing.page" rel="nofollow noreferrer">http://www.ti.com/lsds/ti/microcontroller/16-bit_msp430/msp430_software_landing.page</a> After i debugged the first code which is between a     MSP master and a TMP100 temperature sensor as a slave. Here is the sample code.</p>
  <pre><code>//******************************************************************************
  //  MSP430G2xx3 Demo - USCI_B0 I2C Master to TMP100, Set P1.0 if Temp &gt; 28C
  //
  //  Description: I2C interface to TMP100 temperature sensor in 9-bit mode.
  //  Timer_A CCR0 interrupt is used to wake up and read the two bytes of
  //  the TMP100 temperature register every 62ms. If the temperature is greater
  //  than 28C, P1.0 is set, else reset. CPU is operated in LPM0. I2C speed
  //  is ~100kHz.
  //  ACLK = n/a, MCLK = SMCLK = TACLK = BRCLK = default DCO = ~1.2MHz
  //
  //         /|\           /|\ /|\
  //          |   TMP100   10k 10k     MSP430G2xx3
  //          |   -------   |   |   -------------------
  //          +--|Vcc SDA|&lt;-|---+-&gt;|P1.7/UCB0SDA    XIN|-
  //          |  |       |  |      |                   |
  //          +--|A1,A0  |  |      |               XOUT|-
  //             |       |  |      |                   |
  //          +--|Vss SCL|&lt;-+------|P1.6/UCB0SCL   P1.0|---&gt; LED
  //         \|/  -------          |                   |
  //
  //  D. Dang
  //  Texas Instruments Inc.
  //  February 2011
  //   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
  //******************************************************************************
  #include &lt;msp430.h&gt;
  
  unsigned int RxByteCtr;
  unsigned int RxWord;
  
  int main(void)
  {
    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
    P1DIR |= BIT0;                            // P1.0 output
    P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
    P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
    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;
    UCB0I2CSA = 0x4e;                         // Set slave address
    UCB0CTL1 &amp;= ~UCSWRST;                     // Clear SW reset, resume operation
    IE2 |= UCB0RXIE;                          // Enable RX interrupt
    TACTL = TASSEL_2 + MC_2;                  // SMCLK, contmode
  
    while (1)
    {
      RxByteCtr = 2;                          // Load RX byte counter
      UCB0CTL1 |= UCTXSTT;                    // I2C start condition
      __bis_SR_register(CPUOFF + GIE);        // Enter LPM0, enable interrupts
                                          // Remain in LPM0 until all data
                                          // is RX'd
  
      if (RxWord &lt; 0x1d00)                    // &gt;28C?
        P1OUT &amp;= ~0x01;                       // No, P1.0 = 0
      else
        P1OUT |= 0x01;                        // Yes, P1.0 = 1
  
      __disable_interrupt();
      TACCTL0 |= CCIE;                        // TACCR0 interrupt enabled
      __bis_SR_register(CPUOFF + GIE);        // Enter LPM0, enable interrupts
                                          // Remain in LPM0 until TACCR0
                                          // interrupt occurs
      TACCTL0 &amp;= ~CCIE;                       // TACCR0 interrupt disabled
    }
  }
  
  #pragma vector = TIMER0_A0_VECTOR
  __interrupt void TA0_ISR(void)
  {
    __bic_SR_register_on_exit(CPUOFF);        // Exit LPM0
  }
  
  // The USCIAB0TX_ISR is structured such that it can be used to receive any
  // 2+ number of bytes by pre-loading RxByteCtr with the byte count.
  #pragma vector = USCIAB0TX_VECTOR
  __interrupt void USCIAB0TX_ISR(void)
  {
    RxByteCtr--;                              // Decrement RX byte counter
  
    if (RxByteCtr)
    {
      RxWord = (unsigned int)UCB0RXBUF &lt;&lt; 8;  // Get received byte
      if (RxByteCtr == 1)                     // Only one byte left?
        UCB0CTL1 |= UCTXSTP;                  // Generate I2C stop condition
    }
    else
    {
      RxWord |= UCB0RXBUF;                    // Get final received byte,
                                          // Combine MSB and LSB
      __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
    }
  }
  </code></pre>
  <p>I built up the same circuit where 2 10k pull ups on SDA and SCL, changed the slave address to either 0x69 or 0x68 which is the gyro address given in the user guide of the device. Since i did not built up any monitoring yet, i used an oscilloscope to check out the pulses on SCL and SDA. I didn't expect to see anything on SDA yet but what i am wondering is why i can't even see any clock cycle on SCL bus. It is either always on 3.3V (MSP internal vcc) or sometimes, its near 1V (0.80~). Even when i remove the gyroscope, SDA and SCL bus, i can't see any pulses on P1.6 port.  Any ideas?</p>