Problema con el código para MSP430F5529 Comunicación I2C Master

0

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;

    }
}
    
pregunta Gabriela Costa

1 respuesta

1

La solución es habilitar las interrupciones globales en la inicialización. Usando esta línea:

__enable_interrupt();
    
respondido por el Gabriela Costa

Lea otras preguntas en las etiquetas