FTDI Handshake funktioniert nicht einwandfrei

OP #1811757
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
Gast #1811936
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.
Persönliche Seite #1811943
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.
Gast #1812000
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?
Persönliche Seite #1812016
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.

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