www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik mehr Speed in FT245 BitBang

Autor: Gerd (Gast)
Datum:

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
private sub TogglePin
For i = 1 To 1000
        Sende2 &HFF
        Sende2 &H0
Next
end sub
--------------------------------------------------------------                          
Public Function Sende2(ByVal Daten As Byte) As Boolean
 
' BitBang initialisieren
    If FT_SetBitMode(lngNumDevices, bytChOut, &H1) <> FT_OK Then ' set 1 for each output, $H1 for bitbang
        Sende2 = False
        Exit Function
    End If
    

If FT_Write(lngNumDevices, Chr(Daten), 1, lngBytesWritten) <> FT_OK Then
        Sende2 = False
    Else
        Sende2 = True
    End If
End Function

-------------------------------------------------------------- 
 
Public Function Open_USB() As Boolean

Open_USB = True
If FT_GetNumDevices(lngNumDevices, vbNullString, FT_LIST_BY_NUMBER_ONLY) <> FT_OK Then
    Open_USB = False
    Exit Function
End If
 
If FT_ListDevices(0, strDescription, FT_LIST_BY_INDEX Or FT_OPEN_BY_DESCRIPTION) <> FT_OK Then
    Open_USB = False
    Exit Function
End If
 
If FT_ListDevices(0, strSerialNumber, FT_LIST_BY_INDEX Or FT_OPEN_BY_SERIAL_NUMBER) <> FT_OK Then
    Open_USB = False
    Exit Function
End If
 
If FT_Open(0, lngNumDevices) <> FT_OK Then
    Open_USB = False
    Exit Function
End If
End Function
 --------------------------------------------------------------
Public Function Close_USB() As Boolean
  If FT_Close(lngNumDevices) <> FT_OK Then
  End If
End Function
Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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.
Autor: Falk Brunner (falk)
Datum:

@ 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
Autor: Andreas Weschenfelder (Firma: http://wesche.we.ohost.de) (rupplyn) Benutzerseite
Datum:

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...
Autor: Falk Brunner (falk)
Datum:

@  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
Autor: Gerd (Gast)
Datum:

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...
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-Pro... document
for this project

http://www.ftdichip.com/Projects/MPSSE/FT2232C-Pro... source
code for the project
Autor: KlaRa (Gast)
Datum:

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.
Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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.
Autor: Gerd (Gast)
Datum:

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

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net