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;
}
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.
HeadCode
CL.