Wie USB bitbang mit FT232R ueber D2XX ?

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
geriatroniker
Beiträge: 13
Registriert: 07.06.2011 19:19
Wohnort: Wien
Kontaktdaten:

Wie USB bitbang mit FT232R ueber D2XX ?

Beitrag von geriatroniker »

Hi!

Wenn ich Pins per Get-/SetSerialPortStatus ueber den VCP bediene (fuer einen SPI-Port auf externer HW) braucht jede Aktion dieser Funktionen mindestens ca. 1mS. Offenbar unabhaengig vom Rechnertyp oder der Plattform (Win/Linux). In wenigen Einzelfaellen ist mir das aber zu lange weil manche Aktionen die Zeit aufsummieren und schon spuerbar die Oberflaeche bremsen. Diese Echtzeitkopplung (SPI <-> PB-Window) moechte ich aber beibehalten.

Kann man so einen D2XX-Treiber von der FTDI-Homepage mit PB verwenden?
Wenn ja wie?
Geht es dann mit dem sog. bitbang Modus auch wirklich schneller?

Schon mal wer gemacht?
Irgendwo ein Beispiel?

Danke schon Mal im Voraus!
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Re: Wie USB bitbang mit FT232R ueber D2XX ?

Beitrag von Rings »

uups, da iss mir grad doch die Glaskugel runtergefallen.
Immer diese Fremdwörter die die Kugel net versteht......
.
.
.
.
.
Sorry, aber ich (sicherlich viele andere auch) kann nichts
mit den Begriffen bitbang mit FT232R ueber D2XX,SPI etc.
anfangen.
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Wie USB bitbang mit FT232R ueber D2XX ?

Beitrag von NicTheQuick »

Vielleicht solltest du in einem Forum danach fragen, das sich damit besser auskennt: Mikrocontroller.net

Wenn du aber eine spezielle DLL hast, die du zum Laufen kriegen willst, nenne sie uns hier und zeig auf, was du schon alles probiert hast.
Bild
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Re: Wie USB bitbang mit FT232R ueber D2XX ?

Beitrag von Falko »

diesen FTDI-Chip, der diese speziellen Treiber benötigt,
hatte ich auch bei meinem AM AD-USB 2.0 Messmodul probiert.

http://www.ftdichip.com/

Soweit ich weis, funktioniert der auf Basis serielle Schnittstelle, welche nach Treiberinstallation erstellt werden.
Diese kann man dann über die Purebasic Serial Port ansprechen. Ich weiß jetzt nicht auf die Schnelle,
wo wir hier im Forum über dieses AD USB geschrieben hatten, aber die Suche sollte helfen.

Gruß Falko
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
geriatroniker
Beiträge: 13
Registriert: 07.06.2011 19:19
Wohnort: Wien
Kontaktdaten:

Re: Wie USB bitbang mit FT232R ueber D2XX ?

Beitrag von geriatroniker »

OK, also dann nochmal weniger prinzipiell sondern im Detail und mit etwas anderen Worten:

Ich habe mit SerialPort von PB einen USB-Schnittstellenadapter auf TTL-Pegel dazu verwendet um ein Protokoll (fuer einen speziellen IC) zu produzieren das sich SPI nennt und neben Daten noch Clock und eine weiteren Latch-Leitung benoetigt. Man kann es ruhig als ein paralleles, synchrones Interface bezeichnen. Die Pins steuere ich derzeit ausschliesslich ueber die PB-Funktionen SetSerialPortStatus und GetSerialPortStatus zum Zuruecklesen.

Ich habe diese Methode gewaehlt weil das Programm dann ueber einen Virtuellen-Com-Port per USB mit der Hardware kommuniziert. Die Installation u. der Betrieb des VCP ist Sache des Betriebssystems ist und nicht der Applikation. Soweit so gut - das funktioniert problemlos. Der Nachteil dieser Methode ist offenbar aber das hier Grenzen in der Geschwindigkeit auftreten. ich masse mir nicht an hier PB oder dem VNC-Treiber oder dem USB-Adapter oder wem auch immer als Verursacher anzugeben. Das moegen andere entscheiden.

Ich habe nun festgestellt das unabhaengig von Plattform, CPU-Takt, PB-Compiler-Einstellungen immer mindestens eine Millisekunde vergeht bis man aus den *SerialPortStatus-Funktionen wieder zurueckkommt und damit wieder das main window. Muss man eben akzeptieren. Ist so. Leider kommt es nun manchmal vor das kurzzeitig bei der Bedienung des Mainwindows sich Datenbytes die zur Hardware geschickt werden muessen akkumulieren und dann summieren sich diese mS so stark das man es bei der Bedienung merkt. Das ist "haptisch verwirrend" und nicht gerade elegant. Die sofortige unmittelbare Ausfuehrung der Steuerung ist aber notwendig. Hier kann ich keine Pufferung in einem Task vorsehen wo dann die HW quasi der Oberflaeche manchmal hinterherhinken wuerde.

Nun habe ich gesehen das PB offenbar auch mit anderen DLL als den selber gbeauten umgehen kann. Bisher war DLL fuer mich aber gar kein Thema. Da es fuer die hier verwendeten USB-Serial-Adapter mit den Bausteinen FT232R von FTDI einen sogenannten D2XX-Treiber gibt wollte ich wissen ob es uebrhaupt Sinn macht sich das anzutun. Fuer Windows gibt es Files die da z.B. ft2xx.dll heissen. Es gibt da Unterschiede fuer dll, lib und jeweils 32 und 64 Bit. Ich blicke da aber nicht durch. Und fuer Linux/Mac gitb es ja ueberhaupt keine dll. Was macht man da? Gibt es da ein Interface zum Kernel? Seriell betriebene FT232R melden sich bei neueren Kernel als /dev/ttyUSBn ohne Probleme automatisch an - habe ich gesehen.

Warum jetzt uebehaupt D2XX?
Nun diese Treiber erlauben es einen FT232R neu zu konfigurieren. Damit werden die Pins (TXD, RXD, RTS, usw.) zu Datenleitungen (u.a. D0...D7) mit denen in einem "bit bang" genannten Verfahren die Pins mit den Treiber -Funktionen FT_GetBitMode und FT_SetBitMode offenbar als I/O-Pins benuzten kann. Damit wuerde jeder USB-seriell-Adapter mit einem FT232R zu einem FT245er und d.h. ein paralleles Interface. Wuerde ich mal behaupten falls ich es richtig verstanden habe.

Angeblich soll I/O dann schneller gehen als wenn man es ueber die VNC-Schnittstelle ausfuehrt.

Ich moechte mir das aber eigentlich nicht antun ohne zu wissen ob es mein Problem ueberhaupt loest. Denn erstens scheint es nicht trivial zu sein. Zweitens braucht man dann eben ein spezielles File das dann unter Windows wieder wer weiss wo herumliegt. Nochdazu ist mir die Linux/Mac-Seite noch komplett unkklar.

Ich wiederhole meine Fragen also zusammengefasst:

Wie benutzt man ft2xx.dll unter Windows ?
Was macht man dafuer unter Unix (Lin/Mac) ?
Hat das jemand schon so in Betrieb und kann mir einen Zeitgewinn bei I/O bestaetigen?
Hat jemand ein rudimentaeres Beispiel fuer einen FT232R und ft2xx.dll anhand dessen ich mal an einem Pin messen kann ob es wirklich schneller geht?

Danke!
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Re: Wie USB bitbang mit FT232R ueber D2XX ?

Beitrag von Falko »

Hier mal ein kleines Beispiel zur D2XX von FTDI um die Versionsnummer der DLL auszuslesen.
Ähnlich müsste man dann die ganzen anderen DLL-Funktionen nutzen können. Ich hoffe damit kannst
du schon etwas weiter kommen. :roll:

Code: Alles auswählen

;Hierzu den Treiber aus dem Setupprogramm von Windows vorerst installieren
;http://www.ftdichip.com/Drivers/CDM/CDM20814_Setup.exe
;oder die 32-bit
;http://www.ftdichip.com/Drivers/CDM/CDM20814_WHQL_Certified.zip
;sowie 64-Bit-Version als ZIP
;http://www.ftdichip.com/Drivers/CDM/CDM20814_WHQL_Certified.zip
; @DarkDragon.. Vielen Dank für die Korrekturen zu diesem Bespiels, ohne
; diese hätte ich diesen kleinen Source nicht online stellen können
;
;Diesen PB-Source in das Verzeichnis zu der ftd2xx.lib kopieren und ausführen.
;Ohne Gerät und Openbefehl kann man hiermit die Libraryversion auslesen, die aus Hex noch 
;laut Handbuch noch entschlüsselt werden muss.

ImportC "ftd2xx.lib" 
  FT_GetLibraryVersion(*LibraryVer.Long) As "_FT_GetLibraryVersion@4" 
EndImport 

Define LibraryVer.l 
Define Result.i 

Result = FT_GetLibraryVersion(@LibraryVer) 

Debug Result 
Debug Hex(LibraryVer)
Um weitere Befehle testen zu können müsste ich mir das RAMBUS-Modul, welcher ebenfalls einen FTDI-Chip enthält und von USB nach Seriell wandelt von meinem Sohn zurückholen. Dann kann ich weiteres testen.

[Edit] hier habe ich mal versucht alle Funktionen mithilfe des tools von ts-soft Library2PBImport.exe
zusammen gestellt. Zu den Variablen bitte im Handbuch von FTDI vergleichen und evtl. anpassen.
Das Auslesen der Lib-Versionsnummer funktioniert schonmal.

Code: Alles auswählen

Import "ftd2xx.lib" 
  FT_Close(a.l) As "_FT_Close@4"
  FT_ClrDtr(a.l) As "_FT_ClrDtr@4"
  FT_ClrRts(a.l) As "_FT_ClrRts@4"
  FT_CreateDeviceInfoList(a.l) As "_FT_CreateDeviceInfoList@4"
  FT_CyclePort(a.l) As "_FT_CyclePort@4"
  FT_EE_Program(a.l,b.l) As "_FT_EE_Program@8"
  FT_EE_ProgramEx(a.l,b.l,c.l,d.l,e.l,f.l) As "_FT_EE_ProgramEx@24"
  FT_EE_Read(a.l,b.l) As "_FT_EE_Read@8"
  FT_EE_ReadConfig(a.l,b.l,c.l) As "_FT_EE_ReadConfig@12"
  FT_EE_ReadEcc(a.l,b.l,c.l) As "_FT_EE_ReadEcc@12"
  FT_EE_ReadEx(a.l,b.l,c.l,d.l,e.l,f.l) As "_FT_EE_ReadEx@24"
  FT_EE_UARead(a.l,b.l,c.l,d.l) As "_FT_EE_UARead@16"
  FT_EE_UASize(a.l,b.l) As "_FT_EE_UASize@8"
  FT_EE_UAWrite(a.l,b.l,c.l) As "_FT_EE_UAWrite@12"
  FT_EE_WriteConfig(a.l,b.l,c.l) As "_FT_EE_WriteConfig@12"
  FT_EraseEE(a.l) As "_FT_EraseEE@4"
  FT_GetBitMode(a.l,b.l) As "_FT_GetBitMode@8"
  FT_GetComPortNumber(a.l,b.l) As "_FT_GetComPortNumber@8"
  FT_GetDeviceInfo(a.l,b.l,c.l,d.l,e.l,f.l) As "_FT_GetDeviceInfo@24"
  FT_GetDeviceInfoDetail(a.l,b.l,c.l,d.l,e.l,f.l,g.l,h.l) As "_FT_GetDeviceInfoDetail@32"
  FT_GetDeviceInfoList(a.l,b.l) As "_FT_GetDeviceInfoList@8"
  FT_GetDriverVersion(a.l,b.l) As "_FT_GetDriverVersion@8"
  FT_GetEventStatus(a.l,b.l) As "_FT_GetEventStatus@8"
  FT_GetLatencyTimer(a.l,b.l) As "_FT_GetLatencyTimer@8"
  FT_GetLibraryVersion(a.l) As "_FT_GetLibraryVersion@4"
  FT_GetModemStatus(a.l,b.l) As "_FT_GetModemStatus@8"
  FT_GetQueueStatus(a.l,b.l) As "_FT_GetQueueStatus@8"
  FT_GetQueueStatusEx(a.l,b.l) As "_FT_GetQueueStatusEx@8"
  FT_GetStatus(a.l,b.l,c.l,d.l) As "_FT_GetStatus@16"
  FT_IoCtl(a.l,b.l,c.l,d.l,e.l,f.l,g.l,h.l) As "_FT_IoCtl@32"
  FT_ListDevices(a.l,b.l,c.l) As "_FT_ListDevices@12"
  FT_Open(a.l,b.l) As "_FT_Open@8"
  FT_OpenEx(a.l,b.l,c.l) As "_FT_OpenEx@12"
  FT_Purge(a.l,b.l) As "_FT_Purge@8"
  FT_Read(a.l,b.l,c.l,d.l) As "_FT_Read@16"
  FT_ReadEE(a.l,b.l,c.l) As "_FT_ReadEE@12"
  FT_Reload(a.l,b.l) As "_FT_Reload@8"
  FT_Rescan() As "_FT_Rescan@0"
  FT_ResetDevice(a.l) As "_FT_ResetDevice@4"
  FT_ResetPort(a.l) As "_FT_ResetPort@4"
  FT_RestartInTask(a.l) As "_FT_RestartInTask@4"
  FT_SetBaudRate(a.l,b.l) As "_FT_SetBaudRate@8"
  FT_SetBitMode(a.l,b.l,c.l) As "_FT_SetBitMode@12"
  FT_SetBreakOff(a.l) As "_FT_SetBreakOff@4"
  FT_SetBreakOn(a.l) As "_FT_SetBreakOn@4"
  FT_SetChars(a.l,b.l,c.l,d.l,e.l) As "_FT_SetChars@20"
  FT_SetDataCharacteristics(a.l,b.l,c.l,d.l) As "_FT_SetDataCharacteristics@16"
  FT_SetDeadmanTimeout(a.l,b.l) As "_FT_SetDeadmanTimeout@8"
  FT_SetDivisor(a.l,b.l) As "_FT_SetDivisor@8"
  FT_SetDtr(a.l) As "_FT_SetDtr@4"
  FT_SetEventNotification(a.l,b.l,c.l) As "_FT_SetEventNotification@12"
  FT_SetFlowControl(a.l,b.l,c.l,d.l) As "_FT_SetFlowControl@16"
  FT_SetLatencyTimer(a.l,b.l) As "_FT_SetLatencyTimer@8"
  FT_SetResetPipeRetryCount(a.l,b.l) As "_FT_SetResetPipeRetryCount@8"
  FT_SetRts(a.l) As "_FT_SetRts@4"
  FT_SetTimeouts(a.l,b.l,c.l) As "_FT_SetTimeouts@12"
  FT_SetUSBParameters(a.l,b.l,c.l) As "_FT_SetUSBParameters@12"
  FT_SetWaitMask(a.l,b.l) As "_FT_SetWaitMask@8"
  FT_StopInTask(a.l) As "_FT_StopInTask@4"
  FT_W32_CancelIo(a.l) As "_FT_W32_CancelIo@4"
  FT_W32_ClearCommBreak(a.l) As "_FT_W32_ClearCommBreak@4"
  FT_W32_ClearCommError(a.l,b.l,c.l) As "_FT_W32_ClearCommError@12"
  FT_W32_CloseHandle(a.l) As "_FT_W32_CloseHandle@4"
  FT_W32_CreateFile(a.l,b.l,c.l,d.l,e.l,f.l,g.l) As "_FT_W32_CreateFile@28"
  FT_W32_EscapeCommFunction(a.l,b.l) As "_FT_W32_EscapeCommFunction@8"
  FT_W32_GetCommMask(a.l,b.l) As "_FT_W32_GetCommMask@8"
  FT_W32_GetCommModemStatus(a.l,b.l) As "_FT_W32_GetCommModemStatus@8"
  FT_W32_GetCommState(a.l,b.l) As "_FT_W32_GetCommState@8"
  FT_W32_GetCommTimeouts(a.l,b.l) As "_FT_W32_GetCommTimeouts@8"
  FT_W32_GetLastError(a.l) As "_FT_W32_GetLastError@4"
  FT_W32_GetOverlappedResult(a.l,b.l,c.l,d.l) As "_FT_W32_GetOverlappedResult@16"
  FT_W32_PurgeComm(a.l,b.l) As "_FT_W32_PurgeComm@8"
  FT_W32_ReadFile(a.l,b.l,c.l,d.l,e.l) As "_FT_W32_ReadFile@20"
  FT_W32_SetCommBreak(a.l) As "_FT_W32_SetCommBreak@4"
  FT_W32_SetCommMask(a.l,b.l) As "_FT_W32_SetCommMask@8"
  FT_W32_SetCommState(a.l,b.l) As "_FT_W32_SetCommState@8"
  FT_W32_SetCommTimeouts(a.l,b.l) As "_FT_W32_SetCommTimeouts@8"
  FT_W32_SetupComm(a.l,b.l,c.l) As "_FT_W32_SetupComm@12"
  FT_W32_WaitCommEvent(a.l,b.l,c.l) As "_FT_W32_WaitCommEvent@12"
  FT_W32_WriteFile(a.l,b.l,c.l,d.l,e.l) As "_FT_W32_WriteFile@20"
  FT_WaitOnMask(a.l,b.l) As "_FT_WaitOnMask@8"
  FT_Write(a.l,b.l,c.l,d.l) As "_FT_Write@16"
  FT_WriteEE(a.l,b.l,c.l) As "_FT_WriteEE@12"
EndImport 

Define LibraryVer.l 
Define Result.i 

Result = FT_GetLibraryVersion(@LibraryVer) 

Debug Result 
Debug Hex(LibraryVer)
[/Edit]


Gruß Falko
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
geriatroniker
Beiträge: 13
Registriert: 07.06.2011 19:19
Wohnort: Wien
Kontaktdaten:

Re: Wie USB bitbang mit FT232R ueber D2XX ?

Beitrag von geriatroniker »

Danke das war wirklich sehr hilfreich!

Leider musste ich dann feststellen das zumindest die beiden Funktionen FT_SetBitMode und FT_GetBitMode zwar wie beschrieben funktionieren aber eben leider um keinen Deut schneller als SetSerialPortStatus und GetSerialPortStatus. Eine simple Schleife mit 1000 x set abwechselnd mit 1 und 0 war genauso "langsam".

Zwar habe ich jetzt gelesen das eine andere (neuere?) Type FT232H speziell I2C unterstuetzen soll. Das hilft mir aber nicht weil der nicht verwendet wird. Ich hab eben nur den FT232R und da nur die Pins TXD, RTS und CTS.

Es war aber nicht ganz umsonst - wenigstens habe ich als PB-Newbe im Ansatz mal gelernt wie man mit so externen Funktionen arbeiten kann.

Also vielen Dank fuer Eure Hilfe!
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Wie USB bitbang mit FT232R ueber D2XX ?

Beitrag von WPö »

Hallo, Geriatroniker!

Falko hat ja schon eine ganze Menge Arbeit erledigt. Das Thema habe ich nur überflogen. Wenn Du SPI über einen zweckentfremdeten FTDI232 erreichen willst, wird das gesamte Übertragungssystem notgedrungen ein einziger Müllhaufen - speziell bei erforderlichen maximalen Reaktionszeiten.

1.: Windows ist kein Echtzeitbetriebssystem.
2.: USB ist kein Echtzeitbus.
3.: Der Datenweg SPI, Pseudo-USART, USB, D2xx-Treiber, VirtualCOM-Treiber, Anwendung ist viel zu lang.

Selbst habe ich schon reichlich Schaltungen gehabt, die mit PureBasic kommunizieren, aber das waren immer Mikrokontroller-Anwendungen. Die hatten entweder USB gleich im Gehäuse drin oder machten das über einen FTDI245BQ. Was steuerst Du denn damit und was liest Du aus?

Gruß - WPö

Thema in die Hardware-Ecke verschoben.
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
geriatroniker
Beiträge: 13
Registriert: 07.06.2011 19:19
Wohnort: Wien
Kontaktdaten:

Re: Wie USB bitbang mit FT232R ueber D2XX ?

Beitrag von geriatroniker »

Hallo WPoe! (sorry keine Umlaute hier...)

ad 1 : sind die anderen wie Mac und Linux ohne Zusatz auch nicht. ;-)
ad 2 : hat keiner behauptet, und Echtzeit ist was anderes als nur schneller. Echtzeit kann ich mit Reaktionen beleibiger Dauer (und wenn es Minuten oder Stunden sind!) erreichen wenn es denn halt so spezifiziert ist.
ad 3 : VCP <-> USB <-> FT232 <-> SPI (nennen wir es mal so) oder D2XX <-> USB <-> FT245 <-> SPI. Nicht beides. Und wenn ich per PureBasic einzelne Pins anschreibe und lese ist das IMHO kein Muellhaufen. So funktioniert Hardware-Handshake auch bei hohen Datenraten nun mal.

Der Grundgedanke war mit absolut geringstem Aufwand und nur mit einer gaengigen OS-Installation (FTDI-Treiber fuer VCP) mit PB plattformunabhaengig (!!) einen Pruefaufbau ansteuern zu koennen. Auf der Seite des Prueflings kann man naturgemaess nix drehen/aendern mit uC oder so. Ist wie meistens fix vorgegeben gewesen. Von FTDI gibt es ein fertiges Kabel um ein paar Euro das direkt von USB auf TTL-Draehte endet und fertig. Der Rest war fuer mich eben reines PB.

Die minimale Latenzzeit der einzelnen USB-Frames wurde halt (von mir) uebersehen.

"...verschoben..."

Warum eigentlich?
Ich war absoluter DLL-Anfaenger und mir wurde mit einem tollen Besipiel von Falko soweit geholfen das ich danach alleine weiterkam. Auf die Umstaende (Hardware) bin ich nur eingegangen weil man im Forum meinte man verstehe meine Frage zu den DLL allgemein noch nicht. Ich wollte keine HW-Hilfe.

Fuer mich ist das Thema erstmal erledigt. Ich habe die Bedienung mit einem eigenen Task von der Ansteuerung entkoppelt was den angesprochenen Effekt etwas mildert. Ich wollte mir halt Arbeit sparen weil das Programm eben schon fertig war.

Sollte mir noch eine plattformuebergreifende Loesung unterkommen, bei der man nur mit PB (und ohne extra HW wie uC) schneller werden kann als die USB-Einzelframes es eben erlauben, werde ich es posten.

Danke jedefalls.
Antworten