mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FTDI Handshake funktioniert nicht einwandfrei


Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich versuch grad mal den FT4232H IC mit FT_FLOW_RTS_CTS zu betreiben. 
Die RTS Leitung wird zwar mit FT_SetRts/FT_ClrRts gesetzt, aber es 
werden von den übertragenen Daten nur ein Bruchteil wirklich auch 
gesendet an die UART.... momentan hab ich keine Ahnung an was das liegen 
mag

Ich weiß auch nicht warum die Befehle ClrRts und SetRts genau 
andersherum funktionieren :-) - aber ok
//init
ftHandle = FT_W32_CreateFile((LPCTSTR)Buffer6,GENERIC_READ|GENERIC_WRITE,0,0, 
               OPEN_EXISTING, 
               FILE_ATTRIBUTE_NORMAL | 
       FT_OPEN_BY_DESCRIPTION, 
               0); 

ftStatus = FT_SetFlowControl(ftHandle, FT_FLOW_RTS_CTS, NULL, NULL );


/* eigentlicher schreibzyklus */

//set RTS to high 
FT_ClrRts(ftHandle);

//daten reinschreiben
BOOL res = FT_Write(ftHandle, &mDataframe, 500, &bytesWritten);
if (res != FT_OK)
   return;

//clear RTS 
FT_SetRts(ftHandle);

//time to tx data
Sleep(23000);  

FT_ClrRts(ftHandle);

Von den 500Bytes werden nur 20Bytes übertragen - an der Sleep-Time-Länge 
liegt es nicht. Für Hinweise wäre ich sehr dankbar!

Gruß
Bernd

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keiner eine Idee, an was dieses merkwürdige Verhalten legen könnte?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sicher, dass das richtig herum ist? Normal ist CTS und RTS Low-Aktiv. 
CTS = Low bedeutet, du kannst Daten senden. Wenn du bereit bist, Daten 
zu empfangen, setzt du RTS auf Low. Und wieso machst du das manuell, und 
lässt das nicht die Logik im Chip machen?

Autor: Bernd Schuster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian R. schrieb:
> Sicher, dass das richtig herum ist? Normal ist CTS und RTS Low-Aktiv.
> CTS = Low bedeutet, du kannst Daten senden.

Dass das anscheinend irgendwie verdreht ist, stimmt komischerweise.

>Wenn du bereit bist, Daten
> zu empfangen, setzt du RTS auf Low. Und wieso machst du das manuell, und
> lässt das nicht die Logik im Chip machen?

Das hab ich noch nicht ausprobiert, d.h. das müsste eigentlich ohne dem 
ganzen Clre/SetRTS gehen? Hab lediglich bemerkt, dass gleich nach dieser 
Code-Zeile
ftStatus = FT_SetFlowControl(ftHandle, FT_FLOW_RTS_CTS, NULL, NULL );
der RTS auf low gesetzt wird. Obwohl noch gar nichts zu senden ist etc. 
Mittels
FT_ClrRts(ftHandle);
 wird RTS wieder auf high gesetzt.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Schuster schrieb:
> Das hab ich noch nicht ausprobiert, d.h. das müsste eigentlich ohne dem
> ganzen Clre/SetRTS gehen?

Genau so sollte es sein.

> Hab lediglich bemerkt, dass gleich nach dieser
> Code-Zeile
>  ftStatus = FT_SetFlowControl(ftHandle, FT_FLOW_RTS_CTS, NULL, NULL );
> der RTS auf low gesetzt wird.

Damit ist der automatische Handshake aktiviert.

> Obwohl noch gar nichts zu senden ist etc.

RTS ist nicht eine "Ankündigung", daß etwas zu senden da ist, sondern 
ein Steuerausgang für die Gegenseite, mit der Empfangsbereitschaft 
signalisiert wird.

> Mittels
>  FT_ClrRts(ftHandle);
> wird RTS wieder auf high gesetzt.

Das solltest Du bei aktivem automatischen Handshake tunlichst bleiben 
lassen, dem fasst Du damit gewissermaße zwischen die Beine.

Autor: Bernd Schuster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:
> Damit ist der automatische Handshake aktiviert.

ist es dann auch normal dass gleich zu beginn RTS auf low gesetzt wird? 
Ich dachte dieser ist per default erstmal high und wird nur wenn was 
gesendet wird auf low gezogen für diese Zeit?

Autor: Bernd Schuster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Schuster schrieb:
> Das solltest Du bei aktivem automatischen Handshake tunlichst bleiben
> lassen, dem fasst Du damit gewissermaße zwischen die Beine.

noch eine Frage, gibt es auch die Möglichkeit diesen Handshake manuell 
durchzuführen? Muss dazu lediglich
ftStatus = FT_SetFlowControl(ftHandle, FT_FLOW_NONE, NULL, NULL );
geschrieben werden, dass bei RTS high trotzdem nichts gesendet wird?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Schuster schrieb:
> Ich dachte dieser ist per default erstmal high und wird nur wenn was
> gesendet wird auf low gezogen für diese Zeit?

Nein, RTS hat nichts mit dem Senden zu tun. RTS dient dazu, einer 
sendenden Gegenstelle mitzuteilen, ob sie senden darf oder nicht. Der 
korrespondierende Eingang dazu ist CTS, damit wird von der empfangenden 
Gegenstelle Sendefreigabe erteilt.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was willst du denn damit erreichen? Wenn deine Gegenstelle CTS auf Low 
setzt, darfst du Senden. Und da brauchts doch keine extra Mitteilung, 
dass gesendet wird, denn das merkt die ja, dass was kommt.

Autor: Bernd Schuster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:
> Nein, RTS hat nichts mit dem Senden zu tun. RTS dient dazu, einer
> sendenden Gegenstelle mitzuteilen, ob sie senden darf oder nicht

ok, dann hab ich die beiden Signale grad verwechselt. D.h. der RTS würde 
erst dann auf high gezogen, wenn der receive-Buffer voll ist?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, so sollte das aussehen.

Wenn Du übrigens ein Signal benötigst, das während des Sendens von 
Daten aktiv ist, dann sieh Dir mal im Datenblatt die Beispielbeschaltung 
für den RS485-Betrieb an, da wird dieses Signal zur 
Sende-/Empfangsumschaltung des RS485-Transceivers verwendet - das aber 
hat mit Handshake nichts zu tun.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.