Forum: Mikrocontroller und Digitale Elektronik suche FTDI Projekt mit D2XX Treiber


von Johannes (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein bord mit einem FTDI232R gebaut: PC <-> FTDI <-> USART
eines uC. Den Treiber hab ich installiert (D2XX). Windows erkennt das
device, alles scheint zu ok zu sein.

Was ich nicht gefunden habe ist ein einfaches Tutorial, in dem
beschrieben wird, wie man mit dem Chip Daten austauscht. Die Programme
auf der FTDI Internetseite sind immer gleich so umfangreich und
modular, dass es fuer Anfaenger schwierig ist. Es muss doch ein
einfaches C Programm geben, in dem der Chip initialisiert wird,
baudrate angeben (evtl.), 2byte schreiben und 2byte lesen... Wer so
etwas kennt und bereit ist es zB hier im Forum oder in der Codesammlung
zu veroeffentlichen, wuerde sicher nicht nur mir sehr helfen.

Vielen dank fuer Links, Tips oder sogar Code im Voraus.
macht's gut,
Johannes

von Bjoern B. (tishima)


Lesenswert?

Hallo!

Warum möchtest Du dafuer unbedingt den Direct Treiber verwenden, diesen
Treiber verwenden macht doch nur Sinn wenn Du den FTDI nicht als Com
Port verwenden willst, sondern z.B. nur im Bit Bang Modus.
Mit dem VCP Treiber kannst Du einfach mit jedem Terminel PRG oder RS232
Komponente aus deiner Software drauf zugreifen.

mfg,
Bjoern

von Günter R. (galileo14)


Lesenswert?

Ja, so ist es. Du installierst einfach den VCP-Preiber am PC und
bekommst einen neuen COM-Port, z.B. COM5 oder so. Damit steuerst Du den
FT232R an (etwa mit einem Terminalprogramm, HyperTerm, oder HTerm von
Tobias Hammer (www.der-hammer.info), als ob er ein UART im PC wäre; am
Chip selbst erscheinen diese Daten so, als wäre deine uC-Platine über
einen MAX232 mit dem PC verbunden; daß Du es mit USB zu tun hast, kommt
dabei fast nicht zum Vorschein (außer durch ein etwas verändertes
Timing).

Viel Erfolg
Günter

von Fabian (Gast)


Lesenswert?

Der VCP ist aber langsam. Beim FTDI245 (den darf ich grad verwenden)
kommt man damit kaum über 300kbit/s ... wenn das zu wenig ist
braucht's den D2XX Treiber.
Bei meiner Anwenung ginge es darum Daten über den FTDI möglichst
schnell (3-4Mbit/s) in den PC zu pumpen...also nur unidirektional, aber
selbst da braucht man dann ja ein Programm was den Datenstrom
entgegennimmt.
Hat jemand solch ein Prog schonmal geschrieben? Die uC Seite ist kein
Problem...

Gruß
Fabian

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

Wo hast du das denn her das du mit dem VCP-Treiber auf maximal
300kbit/s kommst? Ich komme hier mit einem FT245MB und dem VCP-Treiber
auf 6MBit/s.

Matthias

von Fabian (Gast)


Lesenswert?

Datenblatt FT245BM Seite eins unter Features:

- Transfer Data rate to 1M Byte / Sec - D2XX Drivers
- Transfer Data rate to 300 Kilobyte / Sec - VCP Drivers

stimmt... sind kbyte/s nicht kbit/s ... ist aber für meine Anwenung zu
langsam; ich brauch eigentlich min 500kbyte/s! Darum muss es wohl mit
dem D2XX gehen.

Gruß
Fabian

von Michael W. (mictronics) Benutzerseite


Lesenswert?

@Johannes

Ich habe schon mit dem D2XX Treiber unter VS6 C++ programmiert.
Das Projekt ist allerdings nicht Open Source, aber ich kann Dir helfen
bzw. Tips geben wenn Du willst.

Kontakt: michael AT mictronics DOT de

/Michael

von arc (Gast)


Lesenswert?

#include "FTD2XX.h"

class Serial {
protected:
 FT_HANDLE mFTHandle;
 FTDCB mFTDCB;
 FTTIMEOUTS mFTTimeouts;

public:
 bool openFTDI(DWORD devID);
};

bool Serial::openFTDI(DWORD devID) {
 FT_DEVICE_LIST_INFO_NODE* nodesP;

 DWORD flags, type, id, loc;
 char serial[256], desc[256];

 mFTHandle = INVALID_HANDLE_VALUE;
 if (FT_CreateDeviceInfoList(&numDevs) == FT_OK) {
    nodesP = new FT_DEVICE_LIST_INFO_NODE[numDevs];
    if (FT_GetDeviceInfoList(nodesP, &numDevs) == FT_OK) {
       for (DWORD i = 0; i < numDevs; i++) {
           // add type, serial number checks if required
           if (nodesP[i].ID == devID) {
              FT_GetDeviceInfoDetail(i, &flags, &type, &id, &loc,

                                     &serial, &desc, &mFTHandle);
              FT_Open(i, &mFTHandle);
              break;
           }
        }
    }
 }
 if (mFTHandle == INVALID_HANDLE_VALUE) return false;
 FT_W32_SetupComm(mFTHandle, 1024, 1024);
 if (FT_W32_GetCommState(mFTHandle, &mFTDCB)) {
    if (BuildCommDCB(parameter.c_str(), &mFTDCB)) {
       mFTDCB.BaudRate = 4800;
       // ... restliche Einstellungen im DCB
       FT_W32_SetCommTimeouts(mFTHandle, &mFTTimeouts);

       return FT_W32_SetCommState(mFTHandle, &mFTDCB);
    }
 }
 return false;
}

Das Einlesen/Schreiben läuft z.B. über die, dem Win32-API
nachgebildeten, Funktionen in etwa so:
DWORD bytesInQueue = 0, bytesRead = 0;
FT_GetQueueStatus(mFTHandle, &bytesInQueue);
if (FT_W32_ReadFile(mFTHandle, bufferP, bytesInQueue,
                    &bytesRead, NULL)) {
...
}

Die Übertragungsraten sollten beim FT232R bis zu 3MBit/s betragen, egal
welcher Treiber benutzt wird.
Beim FT245R gibt FTDI 300kByte/s für VCP und 1MByte/s für den D2XX an.

von arc (Gast)


Lesenswert?

Kleiner Nachtrag: Die maximale Datenrate des FT232R ist auf 3MBit/s
begrenzt, da die internen 48MHz mindestens durch 16 geteilt werden.

von Johannes (Gast)


Lesenswert?

Hallo,

herzlichen Dank an alle fuer die Antworten.

ehrlich gesagt, wollte ich den D2XX Treiber nur hernehmen um etwas
Neues zu lernen. Dabei entdeckt man ja oft Sachen die einfacher oder
besser (oder beides) sind als das was man bisher gemacht hat. In diesem
Fall scheint es nicht ganz so zu sein :)... Jedenfalls mit dem
"einfacher" ists scheinbar nicht so.

@arc: vielen Dank fuer den Sourcecode. Ich werd ihn gleich mal
ausprobieren.

mg,
Johannes

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.