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 -&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?
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
CL.
Benutzer5939530
CL.
Benutzer5939530