Hi ich habe grade mit der ARM7 programmierung angefangen und will nun die serielle Schnittstelle zum funktionieren bringen. Hier im Forum und sonst im Netz habe ich auch schon viel Anregungen gefunden. Die Initialisierung funktioniert, genau so wie senden und empfangen. dies aber nur wenn ich die Echo geschichte nehme wie sie zum Bsp bei Hitex im LPCBook vorgestellt wird. Mich stört hier der Code " while (!(U1_LSR & 0x01));" das bedeutet ja das wenn nichts zu empfangen ist der ARM in der Schleife hängen bleibt bis eben etwas zu empfangen da ist (RDR gesetzt ist). Da es aber nicht garantiert werden kann das immer Daten über die Serielle Schnittstelle abkommen soll der Arm eben nicht warten bis etwas anliegt sondern wenn nicht ist weiter machen mit der Daten Auswertung. Ungefahr so: y=40; for (x=0;x<y;x++) { if ((U1_LSR & 0x01) != 0){} // keine Daten im RBR tue nichts if ((U1_LSR & 0x01) == 0) // Daten im RBR lese { while(( U1_LSR & 0x01) ==0);// muss sein da sonst nur 0xAA gelesen U1_lesen(); } leider geht dieses auch nur wenn y = der Anzahl der zu empfangen Zeichen ist. Ist y größer stoppt alles wieder ist y kleiner werden die "überzähligen" Zeichen beim nächsten Mal vorne weg gelesen. Ich hoffe ich bin nciht der erste der sich über solche Probleme gedanken macht. Wenn einer von euch so was schon programmiert hat: über einen Bsp Code oder auch sonstige Tips würde ich mich freuen
Was spricht gegen einen interruptgesteuerten Schnittstellentreiber? Die UART kann nämlich dazu gebracht werden, bei eintreffenden Zeichen Interrupts auszulösen, entweder einen Interrupt für jedes einzelne Zeichen oder aber einen Interrupt, wenn der Empfangsfifo einen gewissen Füllstand erreicht hat. Ein großes Rätsel dürfte diese UART eigentlich auch nicht darstellen, ist sie doch kompatibel zur in jedem PC zu findenden 16550. Lediglich die bei PCs über das MCR steuerbare externe Interruptfreigabe fehlt hier, aber die ist ja auch nicht Bestandteil des 16550. Dein Programm sollte also nicht bei der UART nachsehen, ob Zeichen empfangen wurden, sondern im vom Interrupttreiber gefüllten Empfangspuffer (ein globaler Speicherbereich).
erstmal Danke für die schnelle Antwort. also wenn ich das jetzt richtig verstehe soll ich nicht mehr da DR Bit aus dem LSR abfragen sondern im U1IER das Bit 0 "Enable RX Data Available Interrupt" setzen um im U1IIR abzufragen ob Daten da sind? Ich dachte bis jetzt das das DR BIt im Endefekt das selbe macht? so wie ich es verstehe Frage ich y mal nach ob was im RBR liegt. Wenn nichts drin ist passiert nichts wenn estwas drin ist wird es gelesen. so sollte es sein wenn ich jetzt nicht irgendwo einen Fehler in meiner Gedankenführung habe. Ich habe eben probiert den U1IIR in der Initialisierung für den UART zu aktivieren, das hat jedoch leider dazu geführt das z.B. die Baudrate nicht mehr stimmte... "Interrupttreiber gefüllten Empfangspuffer (ein globaler Speicherbereich)" hier zu noch eine Frage: Habe im DAtenblatt grade gesucht, das ist doch der IIR?
Wenn nicht interruptgesteuert: Du kannst doch im Hauptprogramm auf die Bedingung: U1_LSR & 0x01) == 0 pollen (und die Software hängt nicht). Das müßte auch funktionieren. Wenn interruptgesteuert: ist die Bedingung immer wahr, oder? Dietmar
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.