Estoy teniendo dificultades para que la comunicación I2C entre en el MSP430g2553. Después de trabajar en esto durante un par de días, al final, eliminé el código de lo que pensé que deberían ser los huesos básicos necesarios para enviar el patrón de inicio y la dirección del esclavo, pero incluso eso no parece funcionar.
Tengo un osciloscopio conectado a los pines 1.6 y 1.7, pero no he podido capturar nada. Además, enciendo un LED cuando el patrón de inicio no se ha enviado e intento apagarlo después, pero nunca se apaga.
Aquí hay un código simplificado. ¿Alguien puede arrojar algo de luz sobre esto?
#include <legacymsp430.h>
#include <msp430g2553.h>
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
// Set up the DCO
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0
P1REN |= BIT6 + BIT7;
P1DIR |= 0x01; // For the LED
P1OUT &= ~BIT0; // Make sure it's off
UCB0CTL1 |= UCSWRST; // Enable SW reset
UCB0CTL0 |= UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
UCB0CTL1 |= UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
UCB0BR0 = 10; // SMCLK/10
UCB0BR1 = 0;
UCB0I2COA = 0; // Master own address
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
UCB0I2CSA = 0x78; // Slave Address
UCB0CTL1 |= UCTXSTT; // Send start and slave address
while(UCB0CTL1 & UCTXSTT){
P1OUT |= BIT0; // Turn on the LED while the start has not been sent.
}
P1OUT &= ~BIT0; // This never gets executed.
LPM0;
return 0;
}