CCS/MSP430F5529: i2c example 09 not working - should work but does not

Part Number: MSP430F5529

Tool/software: Code Composer Studio

I am working with the following example code:  MSP430F55xx_uscib0_i2c_09.c

This example code will transmit some data on the i2c bus Port 3.1 and Port 3.2 but I do not see any data on the lines nor do I see a clock signal.   I a m using the MSP-EXP430F5529LP Launchpad development kit with Code Composer 7.0

The code is suppose to work without any modifications so I am not sure why I do not see anything on the pins.

Here is the complete code straight from the example....   All I did was put a logical analyzer on the pins and should see something....anything.   What is going on?

//******************************************************************************
//  MSP430F552x Demo - USCI_B0 I2C Master TX multiple bytes to MSP430 Slave
//
//  Description: This demo connects two MSP430's via the I2C bus. The master
//  transmits to the slave. This is the MASTER CODE. It cntinuously
//  transmits an array of data and demonstrates how to implement an I2C
//  master transmitter sending multiple bytes using the USCI_B0 TX interrupt.
//  ACLK = n/a, MCLK = SMCLK = BRCLK = default DCO = ~1.045MHz
//
// ***to be used with "MSP430F55xx_uscib0_i2c_09.c" ***
//
//                                /|\  /|\
//                MSP430F5529     10k  10k      MSP430F5529
//                   slave         |    |         master
//             -----------------   |    |   -----------------
//           -|XIN  P3.0/UCB0SDA|<-|----+->|P3.0/UCB0SDA  XIN|-
//            |                 |  |       |                 |
//           -|XOUT             |  |       |             XOUT|-
//            |     P3.1/UCB0SCL|<-+------>|P3.1/UCB0SCL     |
//            |                 |          |                 |
//
//   Bhargavi Nisarga
//   Texas Instruments Inc.
//   April 2009
//   Built with CCSv4 and IAR Embedded Workbench Version: 4.21
//******************************************************************************

#include <msp430.h>

unsigned char *PTxData;                     // Pointer to TX data
unsigned char TXByteCtr;

const unsigned char TxData[] =              // Table of data to transmit
{
  0x11,
  0x22,
  0x33,
  0x44,
  0x55
};


int main(void)
{
  unsigned int i;

  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P3SEL |= 0x03;                            // 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 = 0x48;                         // Slave Address is 048h
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
  UCB0IE |= UCTXIE;                         // Enable TX interrupt

  while (1)
  {
    for(i=0;i<10;i++);                      // Delay required between transaction
    PTxData = (unsigned char *)TxData;      // TX array start address
                                            // Place breakpoint here to see each
                                            // transmit operation.
    TXByteCtr = sizeof TxData;              // Load TX byte counter

    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition

    __bis_SR_register(LPM0_bits + GIE);     // Enter LPM0, enable interrupts
    __no_operation();                       // Remain in LPM0 until all data
                                            // is TX'd
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
  }
}

//------------------------------------------------------------------------------
// The USCIAB0TX_ISR is structured such that it can be used to transmit any
// number of bytes by pre-loading TXByteCtr with the byte count. Also, TXData
// points to the next byte to transmit.
//------------------------------------------------------------------------------
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_B0_VECTOR))) USCI_B0_ISR (void)
#else
#error Compiler not supported!
#endif
{
  switch(__even_in_range(UCB0IV,12))
  {
  case  0: break;                           // Vector  0: No interrupts
  case  2: break;                           // Vector  2: ALIFG
  case  4: break;                           // Vector  4: NACKIFG
  case  6: break;                           // Vector  6: STTIFG
  case  8: break;                           // Vector  8: STPIFG
  case 10: break;                           // Vector 10: RXIFG
  case 12:                                  // Vector 12: TXIFG
    if (TXByteCtr)                          // Check TX byte counter
    {
      UCB0TXBUF = *PTxData++;               // Load TX buffer
      TXByteCtr--;                          // Decrement TX byte counter
    }
    else
    {
      UCB0CTL1 |= UCTXSTP;                  // I2C stop condition
      UCB0IFG &= ~UCTXIFG;                  // Clear USCI_B0 TX int flag
      __bic_SR_register_on_exit(LPM0_bits); // Exit LPM0
    }
  default: break;
  }
}


  • Your issue sounds very similar to mine a few days ago. I tried to run I2C example number 6 on my MSP430G2553, and sure enough, it didn't work. However I did get a clock on SCL, and data on SDA. It turned out to be an issue described in the erratasheet. When I tried the workaround, it worked flawlessly.

    Have you checked the errata sheet for the MSP430F5529?

    Have you tried to debug the application using breakpoints to verify the correct registers are set?

    Is the program counter outside of where it should be?

    Have you double-checked the connections from the board to your logic analyzer? I'm guilty of this mistake more times than I'd like to admit.

    Don't let the magic smoke out

  • In reply to Stephen Keller:

    Thanks Stephan,

    I did look at the Errata notes and could not finding anything related to a single master I2C. I was hoping/assuming the example code would actually work the first time. I mean, after all, why create example code that does not work? I believe the intent of providing example code is to help developers get to a functional state as fast as possible. This issue has been with me for a while.

    I read the app note SLAA703 and the programmer user guide but have not found any clues yet.
  • In reply to Chris from Pinterec:

    I take it you've checked the program counter and verified the USCI registers were initialized correctly?

    Also just to be 110% sure, you do have 10k or smaller resistors on the SDA and SCL pins right?

    If you've already done that, try configuring a pin to output SMCLK so you can test both your logic analyzer and MSP's clock system is working correctly. If the SMCLK isn't present, try initializing the clock system manually.

    Don't let the magic smoke out