Dear all,
Trying from 2 days figure out what is wrong with the code since the result is always wrong. I use cc430F5137 and TMP100 connected to Port 1.2 (clock) Port 1.3 (Data) 4,7K pull up is connected However it doesn't work.
Any help would be appriciated. Always halt on RED LED.
#include "cc430x613x.h" #define RED_LED BIT6 #define GRN_LED BIT0 unsigned int RxByteCtr; unsigned int RxWord; //volatile unsigned char RxBuffer[1]; // Allocate 128 byte of RAM void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1OUT = 0; P3OUT = 0; P1DIR |= GRN_LED; P3DIR |= RED_LED; // P1SEL |= 0x06; // 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 = 0x40; // Set slave address UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation UCB0IE |= UCRXIE; // Enable RX interrupt TA1CTL = TASSEL_2 + MC_2; // ACLK, upmode, clear TAR while (1) { RxByteCtr = 2; UCB0CTL1 |= UCTXSTT; // PRxData = (int)RxBuffer; // Start of RX buffer // Clear RX byte count // __bis_SR_register( CPUOFF + GIE); // Enter LPM0, enable interrupts if (RxWord < 0x1d00) // >28C? P1OUT |=GRN_LED; // No, P1.0 = 0 else P3OUT |= RED_LED; // Yes, P1.0 = 1 __disable_interrupt(); TA1CCTL0 = CCIE; __bis_SR_register(CPUOFF + GIE); // Enter LPM0, enable interrupts TA1CCTL0 &= ~CCIE; // Remain in LPM0 until TACCR0 // interrupt occurs } } // 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 = 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: break; // Vector 4: NACKIFG case 6: // Vector 6: STTIFG UCB0IFG &= ~UCSTTIFG; break; case 8: // Vector 8: STPIFG UCB0IFG &= ~UCSTPIFG; // if (RXByteCtr) // Check RX byte counter // __bic_SR_register_on_exit(LPM0_bits); break; case 10: // Vector 10: RXIFG RxByteCtr--; // Decrement RX byte counter if (RxByteCtr) { RxWord = (unsigned int)UCB0RXBUF << 8; // Get RX'd byte into buffer if (RxByteCtr == 1) // Only one byte left? UCB0CTL1 |= UCTXSTP; // Generate I2C stop condition else { RxWord = (unsigned int)UCB0RXBUF; } } break; case 12: break; // Vector 12: TXIFG default: break; } } // Timer A0 interrupt service routine #pragma vector=TIMER1_A0_VECTOR __interrupt void TIMER1_A0_ISR(void) { __bic_SR_register_on_exit(CPUOFF); // Exit LPM0 }
P.s: http://320volt.com/wp-content/uploads/2010/10/msp430x23x0_uscib0_i2c_01.c.html