Forum: Mikrocontroller und Digitale Elektronik UART PC16550D Interrupt Fehler


von Basti (Gast)


Lesenswert?

Ich beschäftige mich gerade mit dem Uart und hab da mal Fragen.

Um eine Einwandfreie Nutzung vorrauszusetzen müssen alle Register 
konfiguriert werden. Am Anfang setze ich den DLAB, da ich dann auf die 
Register für den Baud Generator zugreifen kann. Danach wird DLAB 
resettet, damit ich dann auf die anderen 3 Register (Receiver Buffer 
Register, Transmitter Holding Register Interrupt enable Register) 
zugreifen kann. So danach wird dann das Interrupt enable Register 
konfiguriert, wobei ich dann bit 2 (Enable Transmitter Holding Register 
Empty Interrupt) aktiviere. Anschließend wird dann das Stick Parity Bit 
auf Low gestellt. Dann wird ein Byte reingeschrieben. Ich mach dann eine 
Abfrage nach dem Interrupt, falls einer stattfindet, soll dann Interrupt 
Ident Register angesprochen(nur bei Lese Modus) und mit 0 wird Interrupt 
zurückgesetzt und das Stick Parity wieder auf High (Line Control 
Register). Als letztes schiebe ich dann wieder 12 Datenpakete a 1 Byte 
durch und mach wieder eine Abfrage nach dem Interrupt.

So nun mein Problem, ich nutze vpn Phytec die Platine mit dem UART 
drauf, 2 Usb Controller und einem FPGA. Über ein Ethernet Anschluss 
sende ich die Befehle, der treiber wir jedoch vorher mit allen registern 
vorgeladen.

Nun wenn ich das Oszi anschließe, kann ich die Transmit, Receive und 
Interrupt Signale ansehen, das Problem ist dies, wenn ich Daten sende, 
tut er auch empfängt auch, setzt den Interrupt (wegen dem Parity bit) 
und setzt ihn wieder zurück, ab und zu also willkürlich passiert es, 
dass der Interrupt zwar kommt aber dann nicht wieder zurückgesetzt wird, 
dann können die restlichen Datenpakete nicht reingeschrieben werden. Hab 
einiges ausprobiert, aber ich finde den Fehler nicht, weder im treiber 
noch an der HArdware. Wäre super wenn jemand solch ein Problem kennt und 
mir dabei weiterhelfen kann, oder zumindest Tipps geben, wo ich noch 
nach dem Fehler suchen kann.

Danke im voraus.

von Basti (Gast)


Lesenswert?

kann mir hier keiner helfen, keiner ne Erfahrung mit dem chop gemacht.

von Krapao (Gast)


Lesenswert?

TI PC16550D Universal Asynchronous Receiver/Transmitter with FIFOs
http://www.ti.com/lit/ds/symlink/pc16550d.pdf

Der IC hat fünf Interrupts. Hast du schon versucht herauszufinden, 
welcher IRQ ansteht, wenn die eine INTR Leitung einen IRQ 
signalisiert? Und passt das zu deiner Programmlogik mit Enable/Disable 
des jeweiligen IRQ?

von Basti (Gast)


Angehängte Dateien:

Lesenswert?

Danke erstmal für deine Antwort.
Ja genau er hat 5 interrupts, da komische ist, dass der Fehler nur beim 
5ten Interrupt kommt, wie gesagt, willkürlich, hab bisher nicht 
feststellen können warum er dieses Verhalten durchführt. Mal 
funktioniert der Interrupt richtig, dann passiert es dass er nicht 
zurück auf High gesetzt wird und die restlichen Daten werden dann nicht 
gesendet.

Ich kann dir ja mal ein Plot zeigen wie das so aussieht.

Gelb = Interrupt
Rosa = Tx+
blau = Rx+

In Lecroy9 sieht man den Interrupt Fehler, Interrupt kommt wird aber 
nicht zurückgesetzt.

Im Lecroy10 ist ein ganz normaler Verlauf.

Ach nochwas, das wichtigste hatte ich ja fast vergessen. bei 500Kbaud 
funktioniert alles Tadellos, nur bei 1 Mbaud kommt dieses Fehlverhalten, 
kannst du dir da einen Reim draus machen.Danke.

von Basti (Gast)


Lesenswert?

Hallo,

kannst du mir vielleicht weitere Tipps geben wonach ich suchen kann.
Hab nochwas ausprobiert. Nachdem der Interrupt erfolgt ist und der 
Fehlerfall auftritt, lege ich dann manuell 5V an den INTR Pin an und der 
Interrupt wird dann wieder auf High gelegt. Kann das sein, dass dies auf 
einen Hardware fehler hindeutet.

Danke für deine Hilfe.

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.