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

1

Usando un programa incrustado, Code Composer Studio 6.0.1,

Intento configurar UART para comunicarse entre MSP430F6736A y mi PC. Utilizando un convertidor USB / RS485 (2 vire (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 (para el número 5) desde HERCULES (config 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 está mal escrito. ,. Tengo una gran cabeza de las hojas de datos, ¿puede alguien ayudarme?

    
pregunta

1 respuesta

1

La función completa 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 de TX esté listo, debe verificar el bit UCTXIFG que se está configurando.

    UCA1TXBUF = UCA0RXBUF;

Esta línea resulta ser correcta.

    if (UCA1TXBUF == UCA0RXBUF)

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

Y esta comparación no tiene sentido; se hizo eco del byte recibido en la línea anterior, por lo que esta condición, si funcionara, siempre sería verdadera.

        P4DIR |= BIT6;

No es necesario 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 inicializó.

La función de interrupción debería tener este aspecto:

    while (!(UCA1IFG & UCTXIFG));    // UCA1 TX buffer ready?
    UCA1TXBUF = UCA0RXBUF;
    P4OUT ^= BIT6; // toggle LED
    
respondido por el CL.

Lea otras preguntas en las etiquetas