Configuración de MSP430F6736A UART a través de Code Composer

Usando programación integrada, Code Composer Studio 6.0.1,

Intentando configurar UART para comunicarse entre MSP430F6736A y mi PC. Usando convertidor USB/RS485 (2 vires (A,B)).

Para enviar datos usando HERCULES (aplicación para probar la comunicación).

         #include <msp430.h> 
            #include <msp430f6736.h>
            /*
             * main.c
             */

            int main(void) {

                WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer

                P4DIR |= BIT6;
                        P4OUT &= ~BIT6;
                    //clock
                //UCSCTL0 |= DCO_0 | MOD_0;
                //UCSCTL1 |= DCORSEL_0;

                // Config pinov  P2.2 a P2.3 na ich funkciu(Rx a Tx)
                P2SEL |= BIT2 + BIT3; // RX and TX pins

                // config comm
                UCA1CTLW0 |= UCSWRST; // reset UCA1 for config
                UCA1CTLW0 |= UCSSEL_1 ; //  ACLK as source clock
                UCA1MCTLW |= UCBRS0;

                // Baudrate from datasheet
                UCA1BR0 = 1;    // 1200 Baud
                UCA1BR1 = 11;   // 1200 Baud

                UCA1CTLW0 &= ~UCSWRST; // UCA1 back from  reset

                // interrupts enabled for RT and TX
                UCA1IE |= UCTXIE | UCTXIE;

                __bis_SR_register(GIE); // global interupt enabled

            }

#pragma vector=USCI_A1_VECTOR
__interrupt void    Recieve_ISR(void)
{
    while  (!UCA1IFG)    //  USCI_A0 TX  buffer  ready?
    {
    P4DIR |= BIT6;
    P4OUT &= ~BIT6;
    UCA1RXBUF  =  UCA1TXBUF;    //  TX  -&amp;gt;   RXed    character
    }
}

Todo lo que quiero es cuando envío datos (por ejemplo, el número 5) desde HERCULES (configuración igual: 1200 baudios, sin paridad, 1 bit de parada), quiero recibirlos y encender el LED. Pero no funciona.

En algún lugar de este código falta algo o algo está mal escrito. , . Tengo la cabeza grande de las hojas de datos, ¿alguien puede ayudarme?

UCA1IV no contiene banderas de interrupción.
lo borré y sigue sin funcionar
¡No! Debe usar el registro que contiene las banderas de interrupción.
en la hoja de datos no hay otro registro para indicadores de interrupción solo UCA1IFG

Respuestas (1)

Toda la función del controlador de interrupciones es incorrecta.

    while  (!(UCA1IFG & UCA1IV));    //  UCA1 TX  buffer  ready?

UCA1IV es un registro vectorial, no un indicador de interrupción. Para esperar a que el búfer TX esté listo, debe verificar que el bit UCTXIFG esté configurado.

    UCA1TXBUF = UCA0RXBUF;

Esta línea pasa a ser correcta.

    if (UCA1TXBUF == UCA0RXBUF)

Acceder a los registros tiene efectos secundarios. La lectura de UCA1TXBUF podría funcionar, pero la lectura de UCA0RXBUF elimina el siguiente byte del búfer, si existe.

Y esta comparación no tiene sentido; repitió el byte recibido en la línea anterior, por lo que esta condición, si funcionó, siempre sería cierta.

        P4DIR |= BIT6;

No necesita reinicializar este bit.

        P4OUT &= ~BIT6; // turn on LED

Esto no cambia el estado del LED, porque el bit tiene el mismo valor con el que lo inicializaste.

La función de interrupción debería verse algo así:

    while (!(UCA1IFG & UCTXIFG));    // UCA1 TX buffer ready?
    UCA1TXBUF = UCA0RXBUF;
    P4OUT ^= BIT6; // toggle LED
Edité el código (buscar), pero aún no funciona. Puede ser un problema con Baudrate. Como fuente elegí ACLK que es 32 768kHz. Y quiero tener 1200 Baud. ¿Es mi configuración buena para esto?