Forum: Mikrocontroller und Digitale Elektronik mehr Speed in FT245 BitBang


von Gerd (Gast)


Lesenswert?

Hallo zusammen,

neulich hatte ich ein Frage zu I²C via FT245.
Beitrag "I2C @USB via FT245"

Die Umsetztung im BitBang Modus funktioniert so weit - damit ist keine 
"zweite Intelligenz" (Tiny15) nötig, die die WR und RD-Leitungen 
bedient.

Soweit so gut, ABER: Die Übertragungsgeschwindigkeit läst sehr zu 
wünschen übrig, mehr wie 250Hz (500 1/s die Pins toggeln) ist nicht 
drin.
Lt. Application Note von FTDI sind theoretisch 3MBaud (!!) möglich.
Verschiedene Einstellungen der Baudrate über FT_SetBaudRate habe ich 
schon probiert, aber die werden ignoriert :-(

Ein zweistelliger kHz-Bereich würde mir schon reichen.....

Weiß jemand, wie ich mehr Speed raushole?


Gerd


Der Code in VB6
1
private sub TogglePin
2
For i = 1 To 1000
3
        Sende2 &HFF
4
        Sende2 &H0
5
Next
6
end sub
7
--------------------------------------------------------------                          
8
Public Function Sende2(ByVal Daten As Byte) As Boolean
9
 
10
' BitBang initialisieren
11
    If FT_SetBitMode(lngNumDevices, bytChOut, &H1) <> FT_OK Then ' set 1 for each output, $H1 for bitbang
12
        Sende2 = False
13
        Exit Function
14
    End If
15
    
16
17
If FT_Write(lngNumDevices, Chr(Daten), 1, lngBytesWritten) <> FT_OK Then
18
        Sende2 = False
19
    Else
20
        Sende2 = True
21
    End If
22
End Function
23
24
-------------------------------------------------------------- 
25
 
26
Public Function Open_USB() As Boolean
27
28
Open_USB = True
29
If FT_GetNumDevices(lngNumDevices, vbNullString, FT_LIST_BY_NUMBER_ONLY) <> FT_OK Then
30
    Open_USB = False
31
    Exit Function
32
End If
33
 
34
If FT_ListDevices(0, strDescription, FT_LIST_BY_INDEX Or FT_OPEN_BY_DESCRIPTION) <> FT_OK Then
35
    Open_USB = False
36
    Exit Function
37
End If
38
 
39
If FT_ListDevices(0, strSerialNumber, FT_LIST_BY_INDEX Or FT_OPEN_BY_SERIAL_NUMBER) <> FT_OK Then
40
    Open_USB = False
41
    Exit Function
42
End If
43
 
44
If FT_Open(0, lngNumDevices) <> FT_OK Then
45
    Open_USB = False
46
    Exit Function
47
End If
48
End Function
49
 --------------------------------------------------------------
50
Public Function Close_USB() As Boolean
51
  If FT_Close(lngNumDevices) <> FT_OK Then
52
  End If
53
End Function

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das geht nicht im Bitbangmodus. Für den muss für jedes Gewackel ein 
USB-Paket übertragen werden, und das geht nicht schneller als im 
1msec-Raster.

Wenn Du ein serielles Protokoll wie SPI, I²C oder JTAG implementieren 
willst, solltest Du Dir die MPSSE des FT2232 ansehen.

von Falk B. (falk)


Lesenswert?

@ Gerd (Gast)

>Soweit so gut, ABER: Die Übertragungsgeschwindigkeit läst sehr zu
>wünschen übrig, mehr wie 250Hz (500 1/s die Pins toggeln) ist nicht
>drin.

Tja, reines "dummes" Bit-Bang ist bei USB langsam. Da kann man max. 1 
kHz Zugriffsrate erreichen, nämlich die USB Rahmenfrequenz.

>Lt. Application Note von FTDI sind theoretisch 3MBaud (!!) möglich.
>Verschiedene Einstellungen der Baudrate über FT_SetBaudRate habe ich
>schon probiert, aber die werden ignoriert :-(

Das muss man in den speziellen Modi machen. Keine Ahnung wie es genau 
funktioniert.

MfG
Falk

von Andreas W. (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite


Lesenswert?

Auszug:

AN232R-01 Bit Bang Modes for the FT232R and FT245R:

FT_Write
Data can be written to the device in Asynchronous Bit Bang mode using 
the
FT_Write command. If multiple bytes are written to the device the values
on the pins will change at the rate set by FT_SetBaudRate.


-> Soll heißen, schreib ein Array runter und nicht immer nur 1 Byte, 
dann wird entsprechend schneller...

von Falk B. (falk)


Lesenswert?

@  Andreas Weschenfelder (rupplyn)

>-> Soll heißen, schreib ein Array runter und nicht immer nur 1 Byte,
>dann wird entsprechend schneller...

Aber nur solange du nur schreibst und nicht zwischendurch liest. Und das 
musst du nach jedem Bit beim lesen von I2C.

MFG
Falk

von Gerd (Gast)


Lesenswert?

Danke zusammen, wenn auch nicht die erhoffte "frohe Kunde" dabei war! Es 
scheint, als ob ich doch wieder den Weg mit der "zweiten Intelligenz" in 
Betracht ziehen muss...
Ich habe parallel vom FTDI-Support folgende Mail bekommen:

Hello,
The FT245R chip was not meant for I2C transfer and therefore bit banging 
an I2C interface will be very slow.
I recommend that you look at the FT2232D chip if you wish to create an 
I2C interface. This chip has a MPSSE engine that will allow you to set 
up an I2C interface that work at considerable higher speed than the 
FT245R chip in bit bang mode. The relevant documents that you will need 
to look at are below:

http://www.ftdichip.com/Documents/ProgramGuides.htm look at the 
FT_SetBitMode function to put the device into MPSSE mode.

http://www.ftdichip.com/Documents/AppNotes/AN2232C-01_MPSSE_Cmnd.pdf 
opcode that you need to send to the MPSSE engine to set up the I2C 
interface

http://www.ftdichip.com/Products/FT2232C.htm example I2C project

http://www.ftdichip.com/Projects/MPSSE/FT2232C-Proj02_v11.pdf document 
for this project

http://www.ftdichip.com/Projects/MPSSE/FT2232C-Proj02_I2C_v11.zip source 
code for the project

von KlaRa (Gast)


Lesenswert?

Hallo Gerd,
Ursache für die schlechte Performance ist die Latenzzeit. Nach jedem 
Steuerbefehl tritt sie auf und läßt sich nur auf 2 ms begrenzen.
Es geht aber auch mit I2C über BitBang schneller. Allerdings nur wie 
schon erwähnt durch das Übertragen von Blöcken. Dabei kann beim Senden 
gleichzeitig auch gelesen werden. Leider kann man aber nur einen Block 
am Stück senden und danach den Block zu Lesen am Stück laden. D.h., man 
kann erst nach erfolgtem Transfer analysieren was als Antwort der 
einzelnen Bytes so eingegangen ist.
Dieses Verfahren mag für einen PCF8574 ausreichend sein, nur beim DS1631 
hatte ich schon hier und da Probleme. Man kann hierbei eben nicht auf 
Clockstretching langsamer I2C-Clients reagieren.
FDTI bietet für den FT2232 auch eine I2C-Lib an. Nur scheint man damit 
das Speichern und Auslesen von I2C-Speicher getestet zu haben. Beim 
simplen PCF8574 konnte ich den zwar mit über 100 KHz ansteuern, aber 
leider nicht auslesen.
Ansonsten war dieses Konzept schon bestechend gut.

Jetzt bin ich auf den MSP430 gekommen. TI hat hier das I2C-Protokoll 
sehr präzise umgesetzt und sehr gut dokumentiert. Die I2C-Lib, 
slaa368.pdf, habe ich leider auch nicht zum Laufen bekommen, aber zu 
mindest die Examples wie msp430x20x3_usi_06.c laufen. Ich habe sie mit 
Erfolg verwenden können. Man kommt über 100 KHz Taktfrequenz.
Gruss Klaus.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

KlaRa wrote:

> Jetzt bin ich auf den MSP430 gekommen. TI hat hier das I2C-Protokoll
> sehr präzise umgesetzt und sehr gut dokumentiert.

Naja, Hardware-I²C gibt's wohl bei einigen gängigen Microcontrollern.
Musst halt dann bloß eine Anbindung zum PC bauen.  Im Prinzip haben
die Mainboards vieler PCs bereits I²C drauf, aber das ist nicht
rausgeführt.

von Gerd (Gast)


Lesenswert?

Hallo KlaRa,

gelten die 2ms Latenzzeit auch, wenn ich nicht BitBang sondern den Weg 
über "COMx:" gehen würde?
Kannst Du  die Init für Deine "schnelle" BitBang-Variante posten?


Gerd

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.