mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FTDI FT245 mit D2XX Treiber - Problem mit FT_Write


Autor: stimpy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich befasse mich gerade mit einem FT245BM. Begonnen habe ich zunächst 
mit einem einfachen Konsolenprogramm:
int _tmain(int argc, _TCHAR* argv[])
{
   DWORD numDevs;
   UINT32 dwDescFlags = FT_LIST_BY_INDEX;

   FT_STATUS ftStatus = FT_CreateDeviceInfoList( &numDevs );
   if (ftStatus == FT_OK)
   {
      FT_HANDLE ftHandle;
      if( FT_OK == FT_Open( 0, &ftHandle ))
      {
         DWORD BytesWritten;
         for(BYTE j=1; j<=8; j++)
         {
            BYTE b = 0xFF ^ (1<<j);
            ftStatus = FT_Write( ftHandle, &b, sizeof(BYTE), &BytesWritten );

            if (ftStatus != FT_OK)
               printf( "FT_Write Failed!" );

            Sleep( 50 ); // sonst geht es nicht! :-(
         }
      }
      FT_Close( ftHandle );
   }
   return 0;
}

Wenn ich FT_Write zu schnell hintereinander ausführe, blockiert es. 
Abhilfe schafft ein "Sleep(50)" oder FT_Purge().

Wie mache ich es aber richtig? Brauche ich evtl. 
FT_SetEventNotification?

Vielen Dank!

Autor: stimpy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe gerade rausgefunden, daß der Takt zum Abholen der Daten extrem lang 
ist. Solange ist der Chip quasi blockiert. Trotzdem sollte die Software 
das abfangen können, aber wie?

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Habe gerade rausgefunden, daß der Takt zum Abholen der Daten extrem lang
> ist. Solange ist der Chip quasi blockiert. Trotzdem sollte die Software
> das abfangen können, aber wie?
USB ist im Gegensatz zu RS232/UART nicht Byte-orientiert, sondern am 
effektivsten bei Paketen, also mehrere Bytes in einem Rutsch. FT_WRITE() 
übergibt in deinem Fall ein Byte an den Treiberbuffer, der Treiber 
wiederum muss erst ne Transaktion draus machen, was dann in einem 
USB-Paket auf der Leitung resultiert. Das ganze braucht also seine Zeit. 
Das Sammeln mehrerer Bytes würde also schon helfen.

Abfangen in der Software könntest du es, indem du prüfst, ob der 
Sendebuffer leer ist. Allerdings kann ich mir nicht vorstellen, warum 
die Sache schon bei acht Bytes blockiert...

Ralf

Autor: stimpy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zwischenstand:

Meine Testhardware hat eine Besonderheit: ich setze RD# zum Auslesen der 
Daten etliche ms runter, damit ist der Chip offenbar "blockiert".
Sende ich in der Zwischenzeit weitere Bytes (mindestens 3), so blockiert 
offenbar der Treiber. Das geht sogar mit dem Terminalprogramm.

Jetzt gucke ich mal, wie ich diesen "nicht aufnahmebereiten" Status 
erkennen kann...

Autor: stimpy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also der Support hat mir geantwortet. Das Verhalten ist völlig in 
Ordnung. Es ist die Aufgabe der Elektronik, die Daten abzuholen:

What you describe is the correct operation.  The buffers swap out every 
16mS or when full.  If you send 4 packets (pausing between each) but do 
not read the data from the module then it will hang as you are seeing 
now.  You must read each packet using a microcontroller or other device 
that will pull RD low.

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.