Hallo, ich habe beim Senden mehrerer Bytes über den UART1 folgendes Problem: Die Abfrage des TI-Flags scheint nicht richtig zu funktionieren. Sofern ich das Flag direkt vor dem Beschreiben des Sendepuffers lösche, funktioniert die nachfolgende while Schleife, in der auf das Setzen des TI-Flags gewartet wird, nicht. Es wird lediglich das erste und letzte Byte in der for-Schleife gesendet, die anderen Bytes gehen verloren. Wenn ich dagegen direkt nach der while Schleife das Flag wieder lösche, dann funktioniert das Senden einwandfrei. Man könnte meinen, das TI-Flag wird nicht direkt mit dem Befehl gelöscht, sondern erst einige Zyklen später. Der UART1 wird nicht direkt am XC886-core betrieben sondern über den internen peripheral Bus. Kann hierdurch eine Verzögerung verursacht werden ? Gruß H.Bz Die Test-Senderoutine sieht folgendermaßen aus: void SendASC1Data() { int i; _push_(SYSCON0); // push the current RMAP SET_RMAP(); //Mapped SFR-Area freischalten, da UART1 dort liegt for(i=0;i<10;i++) { // wird transmitter interrupt flag hier gelöscht, Fehlfunktion // TI_1 = 0; UART1_SBUF = i; // warten, bis Zeichen gesendet ist (Transmit Interrupt Flag gesetzt) while (TI_1 == 0){}; // wird transmitter interrupt flag hier gelöscht, ok TI_1 = 0; } _pop_(SYSCON0); // restore the old RMAP }
Was sagt das Assembler-Listing? Nicht dass Löschen vor der while-Schleife wegoptimiert wird. Falls ich mal Polling verwende (meist eher Interrupt), schreibe ich die Abfrage übrigens immer so, dass ich vor dem Schreiben von SBUF warte, bis TI gesetzt ist, dann TI lösche und dann in SBUF schreibe. Hat den Vorteil, dass andere Aufgaben schneller drankommen, wenn man nur einzelne Zeichen sendet. Zusammenhängende Datenblöcke werden mit der o.g. Routine gesendet, so kann dann während dem Senden das nächste Byte des Blocks geholt werden. Allerdings muss man dann in der UART-Initialisierung TI vorher auf eins setzen, sonst bleibt die Routine hängen. Wie gesagt, am besten wäre das ASM-Listing, damit man sieht, was denn alles passiert. Ralf
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.