This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMP100 and MSP430G2553 I2C problem

Other Parts Discussed in Thread: MSP430G2553, TMP100

Hi everyone,

I am trying to read temperature from TMP100 with MSP430G2553 . I am using sample code which is given by TI. DA and CL pins  are connected to 1.7 and 1.6 pins and also pull up resistor are connected . ADD0 and ADD1 pins are connected to the ground. So the slave adress given to the TMP100 is B1001000(0x48h) . It is set as a slave adress on UCB0I2CSA = 0x48; . Other codes is in the following. Then the code hang on this line " if (RxWord < 0x1d00) // >28C?" . I got stuck for several weeks and really need some help, here is my work,

// 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


// D. Dang

// Texas Instruments Inc.

// February 2011

// Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10

//******************************************************************************

#include <msp430.h>

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 = 0x48; // Set slave address

UCB0CTL1 &= ~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 < 0x1d00) // >28C?

P1OUT &= ~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 &= ~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 << 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

}

}


  • Ender,
    We'll have a look at this question from the perspective of the TMP100 on Monday morning, and in the mean time I am going to move this thread over to the MSP430 forums to look over your code.
  • The ISR code is a bit strange.
    In your application, RxByteCtr can only be 1 or 0 after the initial decrement, so the check for 'only one byte left' is superfluous. If more than 2 bytes are to be received, the the previous assignment to RxWord won't work. However, it does not really hurt.

    I don't see you ever configuring the TMP100. so it runs on 9 bit resolution by default. Doesn't hurt either.

    0x1d00 therefore would mean 29°C. is your PCB temperature below this? What values do you actually get? Did you check?

**Attention** This is a public forum