Datum: 21.02.2008 16:49
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
|
Datum: 21.02.2008 16:52
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.
Datum: 21.02.2008 16:52
@ 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
Datum: 21.02.2008 18:46
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...
Datum: 21.02.2008 18:56
@ 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
Datum: 22.02.2008 07:12
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
Datum: 22.02.2008 08:27
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.
Datum: 22.02.2008 09:34
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.
Datum: 22.02.2008 10:21
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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel