Forum: Mikrocontroller und Digitale Elektronik FTDI Handshake funktioniert nicht einwandfrei


von Bernd S. (mms)


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
1
//init
2
ftHandle = FT_W32_CreateFile((LPCTSTR)Buffer6,GENERIC_READ|GENERIC_WRITE,0,0, 
3
               OPEN_EXISTING, 
4
               FILE_ATTRIBUTE_NORMAL | 
5
       FT_OPEN_BY_DESCRIPTION, 
6
               0); 
7
8
ftStatus = FT_SetFlowControl(ftHandle, FT_FLOW_RTS_CTS, NULL, NULL );
9
10
11
/* eigentlicher schreibzyklus */
12
13
//set RTS to high 
14
FT_ClrRts(ftHandle);
15
16
//daten reinschreiben
17
BOOL res = FT_Write(ftHandle, &mDataframe, 500, &bytesWritten);
18
if (res != FT_OK)
19
   return;
20
21
//clear RTS 
22
FT_SetRts(ftHandle);
23
24
//time to tx data
25
Sleep(23000);  
26
27
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

von Bernd S. (mms)


Lesenswert?

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

von Christian R. (supachris)


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?

von Bernd Schuster (Gast)


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
1
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
1
FT_ClrRts(ftHandle);
 wird RTS wieder auf high gesetzt.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Bernd Schuster (Gast)


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?

von Bernd Schuster (Gast)


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
1
ftStatus = FT_SetFlowControl(ftHandle, FT_FLOW_NONE, NULL, NULL );
geschrieben werden, dass bei RTS high trotzdem nichts gesendet wird?

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Christian R. (supachris)


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.

von Bernd Schuster (Gast)


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?

von Rufus Τ. F. (rufus) Benutzerseite


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.

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.