FT2232 Dualchannel Bitbang

030904030608000809050205 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit

Hallo!

Ich experimentiere mit dem FT2232 von FTDI und der libftdi, die sich bei intra2net.com findet rum.

Probleme hab ich mit dem Einstellen von Bitbang-Modus für beide Ports, ich hoffe mir kann jemand den Ablauf der Initialisierung erklären, das angeführte Beispiel funktioniert nicht.

Meiner Auffassung nach sollte das so gehen:

**************************** ftdi_init(context1)

ftdi_set_interface(context1, int. a) ftdi_usb_open(context1, id, id) ftdi_enable_bitbang(context1, mask)

ftdi_set_interface(context2, int. a) ftdi_usb_open(context2, id, id) ftdi_enable_bitbang(context2, mask)

****************************

Die Ausgabe meines Testprogramms sieht dann allerdings so aus:

**************************** init set1 open1 enable1 set2 open2 enable2 startloop porta: 00: 0x01 write failed for 0x1, error 1 porta: 00: 0x02 write failed for 0x2, error 1 portb: 00: 0x01 ****************************

Das Testprogramm befindet sich im Anhang

Ich danke schonmal,

Maximilian Rest

Reply to
Maximilian Rest
Loading thread data ...

Hallo!

  • Maximilian Rest schrieb:

Für den FT2232 (nicht 232/245) ist es laut Beispielcode [1] notwendig, zwischen ftdi_init und ftdi_open die Elemente 'interface', 'index', 'out_ep' und 'in_ep' von 'struct ftdi_context' mit den richtigen Werten zu füllen, um das 2. Interface anzusprechen.

[Ausschnitt aus Code]

Bist Du Dir bei dem "if (f)" sicher? Bei meinem Compiler ist dass nur für den Fall f=0 erfüllt. Laut Sourcecode der libftdi gibt ftdi_write_data aber die Anzahl der erfolgreich geschriebenen Bytes zurück. In Deinem Fall also idealerweise 1.

Ganz allgemein würde ich Dir empfehlen, solche Abfragen immer "sauber" aufzuschreiben (also "if (f == 0)" oder "if (f != 0)") und sich da nicht auf den Compiler zu verlassen. Ist dann auch für Menschen schneller erfassbar. Ausserdem erhöht es die Liesbarkeit des Codes sehr, wenn man auch einzeilige, eingerückte Anweisugnen zu Blöcken macht:

if (f

Reply to
Till Wollenberg
090903060307040608030904 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit

Das hab ich mal gemacht, gehe davon aus dass die Parameter in dem Beispiel korrekt sind.

Beim Inspizieren der libftdi hab ich allerdings gesehen, dass das auch von ftdi_set_interface übernommen wird. Habs dennoch zum Testen mal eingefügt.

Hast Recht, etwas schlampig, hat aber bei einem Port funktioniert und ich habs deshalb übernommen. Ist aber definitiv ein FIXME.

Ich habe mal dem Beispielcode von intra2net im Anhang die Schleifen für das Schreiben auf den 2. Port hinzugefügt, die Ausgabe ist nun die Folgende:

*************************************** ftdi open succeeded: 0 enabling bitbang mode ftdi open succeeded: 0 enabling bitbang mode turning everything on turning everything off fe fd fb f7 ef df bf 7f fe fd fb f7 ef df bf 7f fe fd fb f7 ef df bf 7f fe fd fb f7 ef df bf 7f turning everything on write failed for 0x0, error -110 turning everything off write failed for 0xffffffff, error -110 fe write failed for 0xfffffffe, error -110 fd write failed for 0xfffffffd, error -110 fb write failed for 0xfffffffb, error -110 f7 write failed for 0xfffffff7, error -110 ef write failed for 0xffffffef, error -110 ..... ..... disabling bitbang mode *************************************

Die Initialisierung funktioniert, beim Schreiben knallts dann. Ich habe der Lib keinen ordentlichen Sinn für den Errorcode -110 entnehmen können..

Alles sehr magisch.. Hoffe wir finden das Problem zusammen.

Viele Grüße,

Max

Reply to
Maximilian Rest

Erster Fehler!

Und zwar so:

*********************************************************************** int ftdi_set_interface(........) { ..... case INTERFACE_B: ftdi->interface = 1; ftdi->index = INTERFACE_B; ftdi->in_ep = 0x04; ftdi->out_ep = 0x83; break; ..... } ***********************************************************************

Im Beispiel wird das verwechselt:

***********************************************************************

ftdic2.interface=1; ftdic2.index=1; ftdic2.out_ep=0x83; ftdic2.in_ep=0x4

***********************************************************************

Das macht schonmal "viel" aus, die Pinne des zuerst initialisierten Ports halten ihren Zustand. Wenigstens etwas. Es bleibt aber das Problem des "Knalls" beim Zugriff auf den 2. Port.

--max

Reply to
Maximilian Rest

Hallo!

Hey, warum "tötest" Du mich? Durch das Löschen meines Namens ist für die

  1. Zitatebene jetzt nicht mehr sichtbar, wer da geschrieben hat, ohne dass man die anderen Beiträge aus diesem Thread liest.

  • Maximilian Rest schrieb:

Jetzt muss ich mich mal korrigieren. Für das Setzen dieser Parameter gibt es die Funktion ftdi_set_interface, die Du in dem Original-Code auch richtig verwendest. Das hatte ich übersehen.

Allerdings überschreibt diese Funktion nur die vier genannten Parameter, und dass auch nur, wenn man "INTERFACE_B" ausgewählt hat. Alle anderen Werte (bzw. für den Fall "INTERFACE_A") müssen vorher durch Aufruf von ftdi_init gesetzt werden. Dieser Aufruf fehlt in Deinem Original-Code für 'ftdic2'.

Dein Original-Code war also richtig, bis auf die Auswertung des Rückgabe- wertes von ftdi_write_data. Vergiss das direkte Setzen einfach wieder. :)

BTW: -110 ist der Fehlercode für -ETIMEDOUT. Den Wert reicht ftdi_wire_data von usb_bulk_write (aus der libusb) durch, die ihn wahrscheinlich vom USB-Subsystem des Linux-Kernels durchreicht. Warum ETIMEDOUT kommt verstehe ich jetzt auf die Schnelle aber auch nicht.

Außerdem ist mir im Beipspiel-Code noch folgende Stelle aufgefallen:

if(f < 0 && f != -5) { fprintf(stderr, "unable to open ftdi device: %d\n",f); exit(-1); }

Das "f < 0" ist klar, aber warum die -5 nicht als Fehler werten, verstehe ich nicht. Laut Code steht das für "Could not claim device", d.h. jemand anderes verwendet die Schnittstelle bereits...

Gruß, Till.

--
E-Mail: wollenberg (at) web (punkt) de
Reply to
Till Wollenberg

Hallo!

Hey, warum "tötest" Du mich? Durch das Löschen meines Namens ist für die

  1. Zitatebene jetzt nicht mehr sichtbar, wer da geschrieben hat, ohne dass man die anderen Beiträge aus diesem Thread liest.

  • Maximilian Rest schrieb:

Jetzt muss ich mich mal korrigieren. Für das Setzen dieser Parameter gibt es die Funktion ftdi_set_interface, die Du in dem Original-Code auch richtig verwendest. Das hatte ich übersehen.

Allerdings überschreibt diese Funktion nur die vier genannten Parameter, und dass auch nur, wenn man "INTERFACE_B" ausgewählt hat. Alle anderen Werte (bzw. für den Fall "INTERFACE_A") müssen vorher durch Aufruf von ftdi_init gesetzt werden. Dieser Aufruf fehlt in Deinem Original-Code für 'ftdic2'.

Dein Original-Code war also richtig, bis auf die Auswertung des Rückgabe- wertes von ftdi_write_data. Vergiss das direkte Setzen einfach wieder. :)

BTW: -110 ist der Fehlercode für -ETIMEDOUT. Den Wert reicht ftdi_wire_data von usb_bulk_write (aus der libusb) durch, die ihn wahrscheinlich vom USB-Subsystem des Linux-Kernels durchreicht. Warum ETIMEDOUT kommt verstehe ich jetzt auf die Schnelle aber auch nicht.

Außerdem ist mir im Beipspiel-Code noch folgende Stelle aufgefallen:

if(f < 0 && f != -5) { fprintf(stderr, "unable to open ftdi device: %d\n",f); exit(-1); }

Das "f < 0" ist klar, aber warum die -5 nicht als Fehler werten, verstehe ich nicht. Laut Code steht das für "Could not claim device", d.h. jemand anderes verwendet die Schnittstelle bereits...

Gruß, Till.

--
wollenberg (at) web (punkt) de
Reply to
Till Wollenberg

Hallo!

  • Maximilian Rest schrieb:

Jetzt haben sich unsere Antworten überholt; siehe anderen Beitrag von mir. Du initialisierst 'ftdic2' nicht vollständig...

Gruß, Till.

--
E-Mail: wollenberg (at) web (punkt) de
Reply to
Till Wollenberg

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.