FTDI extrem langsam

Gast #1038778
Lesenswert?

Hallo zusammen,

eigentlich habe ich den Beitrag gestern abend schon mal gepostet aber 
ich finde ihn einfach nicht mehr im gesamten Forum. Vieleicht ist da was 
schief gelaufen oder ich übersehe ihn einfach, also nicht böse sein wenn 
das jetzt das zweite mal ist.

Folgendes Problem.
Ich entwickle mir gerade ein Flash Tool für den PC.
Mit diesem Tool kann ich, wie man es ja kennt, die intel hex file auf 
meinen µC flashen (STR752).
Da ja viele PCs (Notebooks) keine RS232 Schnittstelle mehr haben mache 
ich die Sache per USB mit nem FTDI (FT232R). Ich benutze die D2XX 
Treiber und die FTD2XX.dll.

Das Programm funktioniert wunderbar. Die µCs lassen sich schön flashen.
Einziges problem ist das der FTDI so verdammt langsam ist. Wenn der µC 
ein ACK oder NACK während des flashens rausschickt dauert es ca. 40 bis 
80ms!!! bis dieses ACK/NACK als Bytes To Read im FTDI/FTD2XX.dll 
ansteht. Und solange kann ich nicht weiterflashen da ich ja auf das 
ACK/NACK reagieren muss.

Eine Controllersoftware mit 16k benötigt deswegen fast 4 Minuten bis sie 
in den µC geflasht ist. Wenn ich da mal mit ner 128k Software komme 
braucht das ja 32 Minuten!!!! Das ist doch kein Zustand.

Liegt das am FTDI selbst oder an der *.dll? Und wie kann man das ganze 
schneller kriegen?

Danke.
Gast #1038780
Lesenswert?

> Liegt das am FTDI selbst oder an der *.dll? Und wie kann man das
> ganze schneller kriegen?

Das liegt an USB. Die Schnittstelle ist bei so einer Anwendung einfach
so langsam.

Die Loesung kann z.B in einer PCMCI-RS232 Karte bestehen.

Olaf
Gast #1038787
Lesenswert?

Danke erstmal,

ne das Flash Tool kann ich nicht ändern. Ich muss ja wissen ob ein ACK 
oder NACK zurückkommt, sonst kann ich nicht entscheiden wie es 
weitergeht.

Obwohl da kommt mir grad ne Idee. Ich pfeiff einfach erstmal auf die 
ACK/NACK Antwort und flashe das Teil einfach immer weiter ohne 
Rücksicht.
Und irgendwo in nem Interrupt oder so überprüfe ich alle ms was denn 
grad als Bytes To Read ansteht. Wenn da immer ein ACK drinsteht ist ja 
gut. Sollte ein NACK drinstehen brech ich ab und geb ne Fehlermeldung 
raus. Was das NACK verursacht hat ist ja egal.
Gast #1038805
Lesenswert?

Obwohl das geht ja auch nicht.

Wenn ich das geflashte verifizieren will muss ich ja trotzdem erstmal 
warten bis alle ACKs/NACKs über die Bühne sind, bevor ich die Zellen 
zurücklesen kann. Und die brauchen eben ihre unverschämt lange Zeit.
Gast #1038842
Lesenswert?

Du mußt das Übertragungsprotokoll so ändern, das nicht nach jedem byte 
ein ACK kommt, also die von Chris gemeinte Blockübertragung und erst 
nach einem Block ein ACK. Sende also nicht 1 Byte sontern z.B. 256 Bytes 
am Stück.
Natürlich muß der Empfänger das dann zwischenspeichern.
Genau so beim lesen, erst einen Block zurückübertragen und dann 
auswerten.
So wird es schneller.
Gast #1038861
Lesenswert?

Der FT232 sammelt Daten von der seriellen Schnittstelle, bis 62 Bytes (1
USB-Paket) zusammengekommen oder 16ms vergangen sind. Sendet der
Mikroccontroller also immer nur wenige Bytes (ACK u.ä.) wird jedesmal
16ms gewartet.

Dieser Timeout von 16ms kann auf einen beliebigen Wert im Bereich
1..255ms gesetzt werden. Unter Linux geschieht dies einfach durch
Schreiben des gewünschten Zahlenwerts in die Pseudodatei latency_timer
im sysfs. Bei einem Wert von 1 (statt der defaultmäßigen 16) solltest du
schon einen deutlichen Unterschied merken. Den Delay von 1ms hast du
allerdings immer noch.

Alternativ kann ein spezielles Zeichen definiert werden, bei dessen
Empfang von der seriellen Schnittstelle der FT232 das USB-Paket sofort
abschickt, auch wenn die 62 Bytes noch nicht erreicht sind. Die
entsprechende Pseudodatei heißt event_char.

Wie man diese Parameter in Windows einstellt, weiß ich nicht. Die
Dokumentation des FTDI-Treibers enthält sicher einige Informationen
darüber.
Gast #1038911
Lesenswert?

Habe mal das Daten-Blatt gelesen.
Diese (STR752). hat ja einen 16 Byte Rx-Fifo Buffer.
Und noch UART an DMA.
Da haben die Entwickler ja mal was praktisches gemacht.

High speed universal asynch. receiver transmitter (UART)
The three UART interfaces are able to communicate at speeds of up to 2 
Mbit/s. They
provide hardware management of the CTS and RTS signals and have LIN 
Master capability.
To optimize the data transfer between the processor and the peripheral, 
two FIFOs
(receive/transmit) of 16 bytes each have been implemented.
One UART can be served by the DMA controller (UART0).
Gast #1038979
Lesenswert?

Jup. Ich hab jetzt die Lösung.
Wie oben schon aufgeführt habe ich immer nur 16byte (also eine Zeile im 
hex file) geschickt und auf das ACK gewartet.
Aber ich hab übersehen das man dem µC 265byte (also 16 Zeilen auf 
einmal) schicken kann und dann aufs ACK warten.

Dann spare ich Zeit um den Faktor 16.

Danke.
#1039069
Lesenswert?

yalu wrote:
...
>
> Dieser Timeout von 16ms kann auf einen beliebigen Wert im Bereich
> 1..255ms gesetzt werden. Unter Linux geschieht dies einfach durch
> Schreiben des gewünschten Zahlenwerts in die Pseudodatei /latency_timer/
> im sysfs. Bei einem Wert von 1 (statt der defaultmäßigen 16) solltest du
> schon einen deutlichen Unterschied merken. Den Delay von 1ms hast du
> allerdings immer noch.

Das ist dann mit dem ftdi_sio Treiber unter Linux?

Ist das auch irgendwo dokumentiert?

Ich hab mal auf der Seite http://ftdi-usb-sio.sourceforge.net/ gesucht 
und nichts darüber gefunden.
Gast #1039095
Lesenswert?

Ich weiss zwar net wie du das ganze realisiert hast aber nie und nimmer 
benötigt der FTDI 4 Minuten für 16 K. Mein Bootloader saugt sich 18 K in 
4 sec in den MC. ( Allerdings benutze ich den 245 )
Persönliche Seite #1039108
Lesenswert?

P. D. wrote:

> Das Programm funktioniert wunderbar. Die µCs lassen sich schön flashen.
> Einziges problem ist das der FTDI so verdammt langsam ist. Wenn der µC
> ein ACK oder NACK während des flashens rausschickt dauert es ca. 40 bis
> 80ms!!!

USB ist fuer "bulk"-Transfer (grosse Datenmengen) ausgelegt. Beim FTDI 
musst Du darauf achten, die Daten so zu senden, dass sie innerhalb von 
etwa 1ms (bin nicht ganz sicher mit dem Wert) zu einem Paket von 512 
Bytes zusammengefasst werden kann. Einzelne Bytes hin und herschicken 
und dazwischen Pausen machen ist immer sehr langsam.
Gast #1039234
Lesenswert?

@Günter -..:

> Das ist dann mit dem ftdi_sio Treiber unter Linux?

Ja.

> Ist das auch irgendwo dokumentiert?

Hmm, gute Frage. Man findet im Netz zwar einige Mailing-Listen und
Patches, worin irgendwelche Bugs zu diesem Thema beschrieben bzw.
korrigiert werden, aber eine klare Aussage, dass es dieses Feature gibt
und wie man es benutzt, habe ich auch nicht gefunden.

Vermutlich ist der Quellcode (wie so oft) die beste Dokumentation ;-)
Tatsächlich findet man dort u.a. folgende Zeilen:
1
static DEVICE_ATTR(latency_timer, S_IWUSR | S_IRUGO, show_latency_timer,
2
              store_latency_timer);
3
static DEVICE_ATTR(event_char, S_IWUSR, NULL, store_event_char);

Mit diesen Makroaufrufen werden die Pseudodateien latency_timer und
event_char im sysfs angelegt und mit den Treiberfunktionen
show_latency_timer (lesen), store_latency_timer (schreiben) und
store_event_char (schreiben) verbunden. In den store- und
show-Funktionen werden die Werte zum bzw. vom FT232 übertragen.
#1039386
Lesenswert?

@ Harald (Gast)

>habe mal mit einem Konverter experimentiert.
>Die machen auch 1ms Pause.
>Was nun?

Die machen keine 1ms Pause, die übertragen paketweis im 1ms Raster, eben 
weil das der USB Rahmentakt ist. Also alle ankommenden bzw. zu sendenden 
Daten in einem Puffer sammeln und dann alles was im Puffer ist 
abschicken, 1mal / ms.
Teilweise warten die sogar noch länger, kann man beim FT232 einstellen.

MFg
Falk

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren