matrix12
24.04.2012, 09:31
Hallo brauch mal dringend Hilfe.
Ich beschäftige mich derzeit mit dem UART pc16550d. 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 Leitung 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.
Ach nochwas, das wichtigste hatte ich ja fast vergessen. bei 500Kbaud
funktioniert alles Tadellos, nur bei 1 Mbaud kommt dieses Fehlverhalten,
kannst ihr euch da einen Reim draus machen.Danke.
Ich beschäftige mich derzeit mit dem UART pc16550d. 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 Leitung 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.
Ach nochwas, das wichtigste hatte ich ja fast vergessen. bei 500Kbaud
funktioniert alles Tadellos, nur bei 1 Mbaud kommt dieses Fehlverhalten,
kannst ihr euch da einen Reim draus machen.Danke.