I have a problem with I2C and the MSP430G2553. Here is my Code:
#include <msp430g2553.h>
const unsigned char Init[] = {0xAE,0x81,0x07,0x20,0x01,0x21,0x00,0x7F,0x22,0x00,0x07,0x40,0xA0,0xA8,0x3F,0xC0,0xD3,0x00,0x8D,0x14,0xDA,0x12,0xD5,0x80,0xD9,0x22,0xDB,0x20,0xA6,0xA4,0xAF};
const unsigned char Mod[] = {0xA5};
void printC(const unsigned char* Array, unsigned int length){
UCB0CTL1 = UCSWRST;
UCB0CTL0 = UCMODE_3 + UCMST + UCSYNC; // I2C master mode
UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
UCB0BR0 = 0x40; // < 100 kHz
UCB0I2CSA = 0x3C; // address
UCB0CTL1 &= ~UCSWRST;
IE2 |= UCB0TXIE; // Enable TX ready interrupt
//UCB0I2CIE = UCNACKIE;
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
unsigned int c;
for(c = 0; c < length; c++){
__bis_SR_register(LPM3_bits + GIE);
UCB0TXBUF = 0x80;
__bis_SR_register(LPM3_bits + GIE);
UCB0TXBUF = Array[c];
//__bis_SR_register(LPM3_bits + GIE);
}
__bis_SR_register(LPM3_bits + GIE);
UCB0CTL1 |= UCTXSTP;
IE2 &= ~UCB0TXIE;
IFG2 &= ~UCB0TXIFG;
}
void main(void){
WDTCTL = WDTPW + WDTHOLD;
DCOCTL = CALDCO_8MHZ; //DCO setting = 8MHz
BCSCTL1 = CALBC1_8MHZ; //DCO setting = 8MHz
// Configure Pins for I2C
P1SEL |= BIT6 + BIT7; // Pin init
P1SEL2 |= BIT6 + BIT7; // Pin init
printC(Init,31);
__delay_cycles(8000000);
printC(Mod,1);
while(1);
}
// USCI_B0 Data ISR
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void){
__bic_SR_register_on_exit(LPM3_bits); // Wakeup main code
IFG2 &= ~UCB0TXIFG;
}
The first printC works fine (slave executes the commands) but in the second (printC(Mod,1);) the processor stays in the low power mode forever after entering the for loop. Any ideas?