En primer lugar, gracias de antemano por la atención y el tiempo dedicado a comprender mi problema.
Por lo tanto, estoy desarrollando un sistema que incluye un MSP430F5529 que se comunica con un AD5933 a través de I2C. Anteriormente, hice lo mismo con un MSP430G2553, todo fue bien y mi código funcionó perfectamente. Verifiqué con un osciloscopio y todos los datos fueron enviados. Comencé con ese código para mi nuevo sistema e hice todos los cambios necesarios, puertos, interrupciones, registros, desde G2553 hasta F5529.
No importa qué, mi código se detiene en los bucles de verificación. Especialmente este:
while (UCB0STAT & UCBBUSY);
Cuando verifico el bus con un osciloscopio, el SCL siempre es alto y SDA siempre bajo. Así que no pasó nada en el autobús.
Parpadeo un LED durante el código, y eso funciona bien.
Mi código está abajo, por favor, compruébalo y hazme saber si encuentras algo mal, o si tienes alguna idea para que lo pruebe.
#include <msp430.h>
#define SLAVE_ADDRESS 0x0D /**< Address to AD5933. */
#define BAUD_RATE 0x12 /**< Baud Rate value. */
#define SDA_PIN BIT0 // msp430F5529 UCB0SDA pin
#define SCL_PIN BIT1 // msp430F5529 UCB0SCL pin
signed char byteCtr;
unsigned char *TI_transmit_field;
unsigned char *TI_receive_field;
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
//LED configurations
P1DIR |= BIT1;
P1OUT |= BIT1;
P1OUT ^= (BIT1); //turn on LED
//MSP configurations to transmit
P3SEL |= SDA_PIN + SCL_PIN; // 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 = BAUD_RATE; // set prescaler
UCB0BR1 = 0;
UCB0I2CSA = SLAVE_ADDRESS; // Set slave address
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
UCB0IE = UCNACKIE;
UCB0IE |= UCTXIE; // Enable interrupts
P1OUT ^= (BIT1); //turn off LED
while (UCB0STAT & UCBBUSY) //wait for previous traffic to clear
;
//Configuration of the slave registers (SEND DATA)
unsigned char field[2] = { 0x80, 0xB1 };
TI_transmit_field = field;
byteCtr = 2;
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
while (UCB0STAT & UCBBUSY)
;
while (1)
;
}
//INTERRUPTS
#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
switch (__even_in_range(UCB0IV, 12))
{
case 0:
break; // Vector 0: No interrupts
case 2:
break; // Vector 2: ALIFG
case 4:
UCB0CTL1 |= UCTXSTP;
UCB0IFG &= ~UCNACKIFG;
break; // Vector 4: NACKIFG
case 6:
break; // Vector 6: STTIFG
case 8:
break; // Vector 8: STPIFG
case 10: // Vector 10: RXIFG -- I am not using it yet (but I'll)
if (byteCtr == 0)
{
UCB0CTL1 |= UCTXSTP; // I2C stop condition
*TI_receive_field = UCB0RXBUF;
TI_receive_field++;
}
else
{
*TI_receive_field = UCB0RXBUF;
TI_receive_field++;
byteCtr--;
}
break;
case 12: // Vector 12: TXIFG
if (byteCtr == 0)
{
UCB0CTL1 |= UCTXSTP; // I2C stop condition
UCB0IFG &= ~UCTXIFG; // Clear USCI TX int flag
}
else
{
UCB0TXBUF = *TI_transmit_field;
TI_transmit_field++;
byteCtr--;
}
break;
default:
break;
}
}