Problemas al iniciar la comunicación I2C con MSP430g2553

Tengo dificultades para establecer la comunicación I2C en el MSP430g2553. Después de trabajar en esto durante un par de días, finalmente reduje el código a lo que pensé que debería ser lo básico necesario solo 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 mientras no se ha enviado el patrón de inicio e intento apagarlo después, pero nunca se apaga.

Aquí está el 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;
}

Respuestas (1)

Las líneas de reloj/datos I²C requieren resistencias pull-up. Es probable que configurar los bits P1REN sin configurar los bits P1OUT correspondientes genere resistencias desplegables.

Además, las resistencias pull-up deben ser lo suficientemente fuertes para superar las capacitancias parásitas de su circuito lo suficientemente rápido; un valor típico para 100 kHz es 10 kΩ. Las resistencias integradas del G2553 pueden tener hasta 50 kΩ, por lo que sería una mejor idea usar resistencias externas o reducir la frecuencia del reloj.

Bueno, eso fue todo. ¡Gracias! El uso de resistencias externas de 10K funcionó a pesar de que las resistencias internas anteriormente estaban elevando los pines. Además, no me queda claro por qué el LED permanecería encendido. ¿El hardware está haciendo algo más que pulsar los pines? ¿Siente si fue capaz o no de bajar la línea?
Los dispositivos lentos pueden ralentizar al maestro con el alargamiento del reloj (bajando la línea del reloj).