Forum: Mikrocontroller und Digitale Elektronik UART0 beim LPC2387


von Heiko (Gast)


Lesenswert?

Hallo,

ich habe hier eine kleine Routine mit der ich ein Zeichen auf der Uart0 
ausgebe und die im wesentlichen aus diesen beiden Zeilen besteht:

    while (!(U0LSR & BIT5));
    U0THR = character;

Die while-Schleife wartet IMHO solange bis der FIFO-Kopf wieder frei ist 
und ich das nächste Zeichen in die FIFO schieben kann.
Nun brauche ich aber eine Funktion die mir anzeigt, ob die gesamte 
FIFO leer ist.
Hintergrund ist, dass ich den Arm gerne in den PowerDown Modus schicken 
möchte ohne das die laufende Uart Übertragung abgebrochen wird.

Wenn ich vor dem powerDown noch ein

while (!(U0LSR & BIT6)) {};

einsetze, schneidet er immer genau ein Zeichen ab, egal wie lang der 
String ist, den ich vorher ausgebe...

Wie kann ich sicher gehen, dass die FIFO komplett leer ist, bevor ich in 
den PowerDown-Modus gehe?

Danke, Heiko

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Versucht, auf gesetztes THRE und TEMP zu warten? Ansonsten dürfte eine 
kleine Warteschleife mit 10*Bittime vor PowerDown nicht wirklich wehtun.

von Robert T. (robertteufel)


Lesenswert?

In dem unwahrscheinlichen Fall, dass Du die Emfangsfunktion des UARTs 
nicht benoetigst und auch den Pin nicht anderweitig benutzt, kannst Du 
das Signal zurueckspeissen und auf das Empfangsinterrupt-bit achten.
Noch eine Hardwaremoeglichkeit ueber einen Timer und einen Interrupt. 
Beim 2387 sind sehr viele pins interruptfaehig, ich glaube wir haben ca. 
60 definiert. Der Vorschlag lautet den transmit pin auf einen Interrupt 
pin zu legen. Bei jeder fallenden Flanke wird der Interrupt getriggert 
und dadurch ein Timer auf 0 gesetzt. Dieser Timer wuerde relativ langsam 
laufen, entsprechend der baudrate. Nehmen wir an ein bit waeren 10 Timer 
Increments. Dann wuerde vor dem schlafen gehen der Timer ausgelesen. 
Wenn der Timerstand groesser 100 ist, dann ist keine Uebertragung am 
laufen, wenn kleiner 100, warten bis >100. Timer Ueberlauf dauert sehr 
lange und muss nicht wirklich beruecksichtigt werden, denn im 
schlimmsten Fall wartet man mit dem schlafen gehen obwohl man nicht 
muesste.

Ist alles etwas umstaendlich und ein "UART-busy Flag" waere viel 
eleganter aber vielleicht hilfts ja.


Robert Teufel
Partner in Silicon Valley gesucht?
Ich stehe gerne zur Verfuegung.
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Meine ARM/Cortex Webseite: http://www.lpc2000.com

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.