Part Number: MSP430G2553 Tool/software: Code Composer Studio I want to read values from an INA 219 current sensor using the I2C protocol. I tried running the following code, to read multiple bytes from the slave. Again, I'm not sure about the base address of the slave, which I could found from its Adafruit datasheet. If this is indeed the source of the problem, please tell me how to find the slave address. When I run the following code and observe the value stored at PRxData, I get the same value, i.e., 0x0200 at PRxData. Is there any shifting that I am missing? Please help. #include "msp430g2553.h" unsigned char *PRxData; unsigned char RXByteCtr; volatile unsigned char RxBuffer[128]; void main(void) { WDTCTL = WDTPW + WDTHOLD; P1SEL |= BIT6 + BIT7; 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; UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation IE2 |= UCB0RXIE; // Enable RX interrupt while (1) { PRxData = (unsigned char *)RxBuffer; // Start of RX buffer RXByteCtr = 5; // Load RX byte counter while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent UCB0CTL1 |= UCTXSTT; // I2C start condition __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts // Remain in LPM0 until all data // is RX'd __no_operation(); // Set breakpoint >>here<< and } // read out the RxBuffer buffer } //------------------------------------------------------------------------------- // The USCI_B0 data ISR is used to move received data from the I2C slave // to the MSP430 memory. It 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) { *PRxData++ = UCB0RXBUF; // Move RX data to address PRxData if (RXByteCtr == 1) // Only one byte left? UCB0CTL1 |= UCTXSTP; // Generate I2C stop condition } else { *PRxData = UCB0RXBUF; // Move final RX data to PRxData __bic_SR_register_on_exit(CPUOFF); // Exit LPM0 } }
↧