MSP430F6736A UART-Konfiguration über Code Composer

Mit eingebetteter Programmierung, Code Composer Studio 6.0.1,

Ich versuche, UART für die Kommunikation zwischen MSP430F6736A und meinem PC zu konfigurieren. Mit USB/RS485-Konverter (2 Vire (A, B)).

Zum Senden von Daten mit HERCULES (App zum Testen der Kommunikation).

         #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
    }
}

Alles, was ich will, ist, wenn ich Daten (für Beispiel Nummer 5) von HERCULES sende (Konfiguration gleich: 1200 Baud, keine Parität, 1 Stoppbit), möchte ich sie empfangen und die LED einschalten. Aber es funktioniert nicht.

Irgendwo in diesem Code fehlt etwas oder etwas ist schlecht geschrieben. , . Ich habe einen großen Kopf von Datenblättern, also kann mir jemand helfen?

UCA1IV enthält keine Interrupt-Flags.
gelöscht und funktioniert immer noch nicht
NEIN! Sie müssen das Register verwenden, das die Interrupt-Flags enthält .
Im Datenblatt gibt es kein anderes Register für Interrupt-Flags, nur UCA1IFG

Antworten (1)

Die gesamte Interrupt-Handler-Funktion ist falsch.

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

UCA1IV ist ein Vektorregister, kein Interrupt-Flag. Um darauf zu warten, dass der TX-Puffer bereit ist, müssen Sie prüfen, ob das UCTXIFG-Bit gesetzt ist.

    UCA1TXBUF = UCA0RXBUF;

Diese Zeile ist zufällig richtig.

    if (UCA1TXBUF == UCA0RXBUF)

Der Zugriff auf Register hat Nebenwirkungen. Das Lesen von UCA1TXBUF könnte tatsächlich funktionieren, aber das Lesen von UCA0RXBUF entfernt das nächste Byte aus dem Puffer, falls vorhanden.

Und dieser Vergleich macht keinen Sinn; Sie haben das empfangene Byte in der vorherigen Zeile zurückgegeben, sodass diese Bedingung, wenn sie funktioniert, immer wahr wäre.

        P4DIR |= BIT6;

Sie müssen dieses Bit nicht neu initialisieren.

        P4OUT &= ~BIT6; // turn on LED

Der Status der LED wird dadurch nicht geändert, da das Bit denselben Wert hat, mit dem Sie es initialisiert haben.

Die Interrupt-Funktion sollte in etwa so aussehen:

    while (!(UCA1IFG & UCTXIFG));    // UCA1 TX buffer ready?
    UCA1TXBUF = UCA0RXBUF;
    P4OUT ^= BIT6; // toggle LED
Ich habe den Code bearbeitet (nachschlagen), aber es funktioniert immer noch nicht. Kann ein Problem mit der Baudrate sein. Als Quelle habe ich ACLK gewählt, was 32 768 kHz ist. Und ich möchte 1200 Baud haben. Ist meine Konfiguration dafür geeignet?