Forum: Mikrocontroller und Digitale Elektronik FT245 Buffer Problem


von TobiasP. (Gast)


Lesenswert?

Ich verwende das FT245-Modul zum versenden von Daten von meinem
Mikrocontroller an einen PC. Hierzu schreibe ich die gewünschten Bytes
in den Buffer und schicke diese durch ein high am SND Pin ab. (Dies
geschieht beim nächsten USB Data-In request). Und hier ist wohl auch
mein Problem: Denn wenn ich schnell (d.h. alle 50 bis 60µs) Daten in
den Buffer schreibe scheint dieser nach kurzer Zeit überzulaufen und
die Daten werden nicht schnell genug abgeschickt und damit aus dem
Buffer gelöscht! Resultat: Es werden nicht alle Bytes übertragen!
...wie kann ich Abhilfe schaffen???
Danke. Tobi

von Benedikt (Gast)


Lesenswert?

Bir mir funktioniert das eigentlich problemlos.
Der FT245 hat 384Bytes.
Wenn du alle 50us sendes, reicht der Buffer für 19,2ms und das sollte
für USB eigentlich kein Problem sein.

Was verwendest du zum Empfangen der Daten auf dem PC ?

von TobiasP. (Gast)


Lesenswert?

Also ich verwende das "DLP Design Test Application" Terminal Programm
(später soll es Borland C++ Builder empfangen). Jedoch mit dem
Virtuellen Com Port! Ich habe gelesen, der D2XX wäre schneller!?
Was genau passiert: Ich schreibe alle 50µs 11Byte in den Buffer und
sende diese mit den SND Pin ab! Also wäre der Buffer nach etwa 1,75ms
voll.

von TobiasP. (Gast)


Lesenswert?

Habe gerade den DLL Treiber installiert...aber das selbe Problem! :-(

von Benedikt (Gast)


Lesenswert?

Funktioniert das ganze denn, wenn du weniger Daten sendest (z.B. die 11
Byte alle 500us) ?

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

was passiert denn mit dem TXF/ Pin? Solange der Low ist solltest du
nichts in den FTDI schreiben.

Matthias

von TobiasP. (Gast)


Lesenswert?

Habe es jetzt wie folgt getestet:
Ich schreibe mehrere Meßzyklen (a 11Byte) in den Buffer und sende sie
dann zusammen ab; soll heißen nachdem z.B. 187 Byte in Buffer sind,
wird gesendet. Mit der Methode habe ich 4488 Byte schon Fehlerfrei
übertragen können (12Meßzyklen a 11 Byte). Doch bei 13Meßzyklen
(4862Bytes und höher) kommt es erneut zu Fehlern!
Ich habe auch deinen Rat befolgt die Datenrate von 50µs auf 500µs zu
reduzieren, doch das führt zu keiner Veränderung! :-(

von TobiasP. (Gast)


Lesenswert?

Klare Diagnose, der Buffer ist voll - TXF Pin geht auf high! ...obwohl
ich Datenpackete in den Buffer schreibe und sie dann mittels SND Pin
abschicke! Laut Datenblatt sind 300Kbyte/s mit dem VCP möglich! Ich
will ja nur 220Kbyte/s (11Byte alle 50µs)!!! Wie zum Teufel kann da
mein Buffer überlaufen??

von sous (Gast)


Lesenswert?

Ich würde mir mal genau ansehen, was im PC passiert. Wenn dort die Daten
nicht aus dem Puffer genommen werden, läuft auch irgendwann alles über.

Gruß, Michael

von Benedikt (Gast)


Lesenswert?

>Klare Diagnose, der Buffer ist voll - TXF Pin geht auf high! ...obwohl
ich Datenpackete in den Buffer schreibe und sie dann >mittels SND Pin
abschicke!

Das kommt davon, wenn man keine Datenlätter liest:
TXE#: When high, do not write data into the FIFO.

Weiterhin steht im Datenblatt:
The Send Immediate / WakeUp signal combines two functions on a single
pin.
During normal operation (PWREN# = 0), if this pin is strobed low any
data in the device TX buffer will be sent out over USB on the next
Bulk-IN request from the drivers regardless of the pending packet size.
This can be used to optimise USB transfer speed for some applications.
Tie this pin to VCCIO if not used.

Wenn du die Daten also sendest (was man eigentlich nicht braucht, da
der FT245 alleine entscheidet, wann er sendet), dann heißt das nicht,
dass die Daten sofort weggehen, sondern die Daten werden erst im
nächsten Zeitintervall gesendet, wenn der PC USB wieder abfragt !
Da du die Packetgröße reduzierst, können weniger Daten in jedem
Abfrageintervall übertragen werden.

Lass also den SND Pin weg, und frag stattdessen TXE ab !

von Benedikt (Gast)


Lesenswert?

Die Datenrate von 300kB lässt sich übrigends leicht erreichen (zumindest
von PC -> uC). Mit dem VCP Treiber habe ich schon über 600kByte/s
erreicht.
Allerdings muss dazu die Packetgröße entsprechend groß gewählt werden:
Solche Datenraten erreicht man nur, wenn man die Daten in einigen
10kByte Blöcken an den Virtuellen COM Port übergibt bzw. davon liest.

von TobiasP. (Gast)


Lesenswert?

Wie kann ich denn die Häufigkeit der Abfrage (also das USB Data-In
request) beeinflussen, z.B. bei mein Borland C++ Builder? Damit die
Daten möglichst schnell aus dem USB Puffer rauskommen.

Klar ist, dass ich TXF nun teste bevor ich reinschreibe. Also brauche
ich eine Sendepuffer, in den ich schreibe, wenn TXF high ist und aus
dem ich in den FT245 Puffer schreibe, wenn TXF wieder low ist. Habt ihr
da einen Realisierungsvorschlag? ...bin noch nicht so lange dabei!

von TobiasP. (Gast)


Lesenswert?

Also, Lösung des ganzen: Ich sende in Packeten a 222 Byte mittels
Puffer! Läuft super!

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.