Forum: FPGA, VHDL & Co. FTDI FT232H/UM232H über USB an PC


von Johannes M. (potz_blitz)


Lesenswert?

Hallo!

Für ein Projekt möchte ich einen DSP (TMS320C28346) mit einem PC 
verbinden via SPI-USB Schnittstelle. Der USB-Treiber ist dabei der 
UM232H von FTDI. Das Programm schreibe ich in C, die nötigen 
Bibliotheken habe ich heruntergeladen und in den Projektordner kopiert 
(ftd2xx.h, libMPSSE_spi.h).

Der Projekt sieht bisher so aus:
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
/* OS specific libraries */
5
#ifdef _WIN32
6
#include<windows.h>
7
#endif
8
9
#include <ftd2xx.h>
10
#include <libMPSSE_spi.h>
11
12
//FT_HANDLE ftHandle;
13
14
15
int main(void)
16
{
17
  FT_STATUS ftStatus;
18
  DWORD lpdwnumDevs;
19
  
20
  // create the device information list
21
  ftStatus = FT_CreateDeviceInfoList(&lpdwnumDevs);
22
  if (ftStatus == FT_OK) {
23
    printf("Number of devices is %d \n",lpdwnumDevs);
24
  }
25
  else {
26
  // FT_CreateDeviceInfoList failed
27
  }
28
}
Es handelt sich dabei um einen Auszug aus einem Beispielprogramm. Wenn 
ich das Programm compiliere bekomme ich "undefined reference to 
'_imp_FT_CreateDeviceInfoList'" als Fehlermeldung. Weiterhin "ld 
returned 1 exit status" und "Error 1".
Ich habe mit gcc compiliert und auch mit Dec-C.

Hat jemand eine Idee, woran es liegen könnte bzw. hat jemand 
Beispielcode abseits von dem, den es von FTDI gibt? Könnte ein 
Zusammenhang bestehen, dass auf dem DSP Board der gleich FTDI-chip 
sitzt, hier aber als Debugger verwendet wird?

Ihr würdet mir sehr helfen!
Vielen Dank und einen schönen Abend,

Johannes

von Stefan (Gast)


Lesenswert?

Ja, du musst die entsprechende lib (FTD2XX.LIB) einbinden damit der 
Linker weiss das die Funktionen in der dll sind. Wie bei GCC weiss ich 
nicht.
Borland und VS verstehen #pragma comment (lib,"FTD2xx.lib").Oder man 
gibt's in den Projektoptionen under Linker Libs an. Alternativ kannst Du 
die Funktionen per LoadLibrary() zur Laufzeit laden.
Stefan

von Johannes M. (potz_blitz)


Lesenswert?

Vielen Dank für den Hinweis!

Hast Du schonmal den FT232 programmiert und kannst einen Compiler 
empfehlen? Eigentlich sollte das mit gcc und/oder Dev-C++ gehen nach 
meinem Verständnis.

Die Probleme an sich bleiben: mal fehlt eine Bibliothek (ich hangel mich 
von einer zur nächsten), dann sagt er wieder entweder eine Variable ist 
nicht definiert und/oder es fehlt angeblich ein Semikolon - es handelt 
sich hier aber um die vordefinierten Bibliotheken von FDTI, da kann ich 
mir solche Fehler eigentlich nicht vorstellen.

Hat jemand konkreten Code, der funktioniert? Oder am besten die 
Beispiele (z.B. sample-static.c) vom Hersteller zum Laufen gebracht?

Vielen Dank!!

von Cihan K. (lazoboy61)


Angehängte Dateien:

Lesenswert?

Ich hatte das gleiche Board.

Allerdings habe ich die Files ftd2xx.h und ftd2xx.lib auch in den 
Projektordner kopiert gehabt und Projektoptionen den Header Ordner 
eingebunden, indem die Files enthalten waren.

Im Anhang findest du die Routinen die ich für den Synch. Fifo Mode 
benutzt habe.

mfg
Cihan

von Johannes M. (potz_blitz)


Lesenswert?

Super, vielen Dank!
Ich werde das gleich ausprobieren!

Mit welchem Programm hast Du geschrieben und compiliert?

Vielen Dank und viele Grüße!

Johannes

von Cihan K. (lazoboy61)


Lesenswert?

Ich hab mit PELLES C und dem darin enthaltenen Standard Compiler 
gearbeitet. Allerdings habe ich die selben Routinen auch in Delphi 
angewendet. Es ist mehr oder weniger immer das selbe.

Zu Not kannst du dir ja die Beispiele auf der Homepage von FTDI 
angucken.
http://www.ftdichip.com/Support/SoftwareExamples/CodeExamples.htm

Müsstest dich mal durchwühlen.

Übrigens die Routinen kannst du hier in dem Dokument nochmal 
nachvollziehen.
http://www.ftdichip.com/Support/Documents/AppNotes/AN_130_FT2232H_Used_In_FT245%20Synchronous%20FIFO%20Mode.pdf

Hier ist alles nochmal schön erklärt, allerdings wie gesagt, für den 
Sync. FIFO Modus.

MfG
Cihan

von Johannes M. (potz_blitz)


Lesenswert?

Ok, danke! Hab Pelles C installiert, FTDI_FUNCTIONS.h fehlt allerdings!
Diesen Header hast Du selbst geschrieben, oder? Kannst Du den bitte noch 
zeigen? Das wäre super!

Die Beispiele habe ich schon angesehen und mich auch durch die Seite 
gewühlt. Hab soweit auch alle Infos erstmal zusammengetragen gehabt, 
sodass ich starten konnte. Und dann kamen eben die Probleme!

Ich habe bisher den Dev-C++ genommen gehabt, nur scheint der ein Problem 
mit den Bibliotheken zu haben!

Vielen Dank und viele Grüße!

Johannes

von Cihan K. (lazoboy61)


Angehängte Dateien:

Lesenswert?

Hier der Header.

Du musst aber noch beachten, dass ich beim Öffnen des FTDIs mit der 
Serial Number gearbeitet habe. Musst du also anpassen.

Desweiteren hast du ja schon mit FTProg den richtigen Modus aktiviert, 
oder?

MfG
Cihan

von Johannes M. (potz_blitz)


Lesenswert?

Ja, mit dem FTProg hab ich mich schon auseinander gesetzt. Hier bekomm 
ich ja auch die Serial-Number her. Ich muss zugeben, dass die 
Programmierung in C noch Neuland ist. Ich habe lediglich in Code 
Composer meinen DSP soweit erstmal programmiert wie es bisher nötig war.

Daher verstehe ich z.B. den Fehler nicht, den Pelles C jetzt anzeigt:

<unistd.h> require the -Go compiler option!
C:\Users\J. Miersch\Documents\Pelles C Projects\Juno\Juno.c(36): warning 
#2018: Undeclared function 'sleep'; assuming 'extern' returning 'int'.

Muss ich bei den Projekteigenschaften noch Einstellungen vornehmen, 
sodass unistd.h mitkompiliert wird?

Viele Grüße und vielen Dank,

Johannes

von Cihan K. (lazoboy61)


Angehängte Dateien:

Lesenswert?

Versuch mal unter Projektoptionen -> Compiler die makierten häckchen 
rein zu nehmen. Weiterhin muss du unter Verzeichnisse den Link für die 
headers angeben, sowohl FTDI_FUNCTIONS.h als auch für die ftd2xx.h und 
ftd2xx.lib ist dieses nötig.

Achte bitte noch auf folgendes, wenn du den 32-Bit Treiber verwendest, 
dann erstelle auch ein 32-Bit Konsolenprogramm, 64-Bit entsprechend.

MfG

Cihan

von Johannes M. (potz_blitz)


Lesenswert?

Ok, das habe ich gemacht!
Das Kompilieren klappt problemlos, keine Fehlermeldungen!

Wenn ich allerdings die .exe erstellen möchte, bekomme ich:

POLINK: error: Unresolved external symbol '__imp_FT_OpenEx'.

Die Fehlerreihe zieht sich durch bis zu FT_Read.
Das ist ein Linkerproblem oder?

Vielen Dank und viele Grüße,

Johannes

von Cihan K. (lazoboy61)


Lesenswert?

Das selbe Problem hatte ich auch.

Cihan Kalayci schrieb:
> Achte bitte noch auf folgendes, wenn du den 32-Bit Treiber verwendest,
> dann erstelle auch ein 32-Bit Konsolenprogramm, 64-Bit entsprechend.

Achte mal bitte auf das was ich im posting vorher geschrieben hatte.

Benutzt du 32-Bit oder 64-Bit? (Sowohl FTDI-Treiber Library und Header 
als auch für die Konsolenanwendung unter PELLES C)

MfG

Cihan

von Johannes M. (potz_blitz)


Lesenswert?

Ok, da lag der Fehler - ich war von den 64bit ausgegangen, hatte aber 
die 32bit genommen!

Jetzt besteht nur noch der Fehler:

POLINK: error: Unresolved external symbol 'main'.

Woran kann das nun noch liegen?

Vielen Dank für Deine Hilfe!

Johannes

von Cihan K. (lazoboy61)


Lesenswert?

Zeig doch mal deinen aktuellen Quellcode.

Oder besser, lade mal die Projektfiles hoch als .Zip

Cihan

von Johannes M. (potz_blitz)


Angehängte Dateien:

Lesenswert?

Das ist das .zip-File.
Ich habe Deinen Code genommen vorerst genommen, um überhaupt 
reinzukommen. Die letzten Tage waren sehr geprägt von frustierendem, 
wenig von Erfolg gekrönten Versuchen, den Beispielcode von FTDI zu 
verwenden.

Für mein Projekt werde ich natürlich eigenen Code verwenden!

Dankeschön!

Johannes

von Cihan K. (lazoboy61)


Angehängte Dateien:

Lesenswert?

Du hast da überhaupt keine Main-funktion.

In der FTDI_FUNCTIONS File sind ja nur Funktionen, die von der Main 
Funk. aus aufgerufen werden müssen.

Schau mal in die Zip rein!
Bei mir hat es jetzt funktioniert bzw. mein FT232H wurde geöffnet und 
geschlossen.

Die Main kannst du nun erweitern, indem du Daten schickst und empfängst.

MfG

Cihan

von Johannes M. (potz_blitz)


Lesenswert?

Ok super, vielen Dank!

Das klappt nun! Das mit der main hat mich eben auch gewundert, da ich 
gar keine definiert hatte!

Ich werde mich jetzt mal dran setzen, den Treiber anzusprechen, so wie 
es auch im Beispielcode vorgesehen ist.

Vielen Dank, Du hast mir bis hierher wirklich geholfen!

Johannes

von Cihan K. (lazoboy61)


Lesenswert?

Kein Problem. Viel Erfolg weiterhin.

Cihan

von Johannes M. (potz_blitz)


Lesenswert?

Quatsch mit Soße:

Ich habe KEINE main definiert, daher kommt ja der Fehler erst! Argh!

Danke ;-)

von Johannes M. (potz_blitz)


Angehängte Dateien:

Lesenswert?

Soweit erstmal ganz gut, jetzt kommt doch noch eine Frage:

Um den SPI-Modus zu konfigurieren ist die Bibliothek libMPSSE_spi.h zu 
verwenden (siehe Anhang).

Allein beim Integrieren (include) in meine Files kommt folgende 
Fehlermeldung:

 warning #2099: Missing type specifier; assuming 'int'.
 error #2014: Empty declaration.
 error #2001: Syntax error: expected ';' but found 'string constant'.
 error #2156: Unrecognized declaration.

Diese Meldungen kommen für jede Funktion die ab Zeile 139 definiert 
werden.
Zu Beginn jeder Definition steht "FTDI_API", in der fdt2xx.h werden die 
Funktionen allerdings mit "FTD2XX_API" deklariert.

Besteht da ein Zusammenhang bzw. wie kann man dieses Problem beheben?

Vielen Dank und einen schönen Abend!

Johannes

von Stefan (Gast)


Lesenswert?

>> Um den SPI-Modus zu konfigurieren ist die Bibliothek libMPSSE_spi.h zu >> 
verwenden.

eine .h ist keine Bilbiothek sondern nur ein Header. Eine Library ist 
entweder eine .lib in der die Funktionen enthalten sind. Diese wird dann 
statisch gelinkt. Oder eine .lib in der nur steht in welcher .dll die 
Funktionen enthalten sind. Die Funktionen werden dann erst zur Laufzeit 
gebunden. Die Fehler kommen allerdings vom compiler und beziehen sich 
offenbar hierauf.

in der fdt2xx.h (unbedingt FT_HANDLE)

typedef PVOID  FT_HANDLE;

in der libMPSSE_spi.h (bedingt FTDI_API)

#ifdef _MSC_VER
#define FTDI_API extern "C"
#else
#define FTDI_API
#endif

Wenn _MSC_VER definiert ist sieht der prototyp so aus
extern "C" PVOID SPI_foo()
ansonsten
PVOID SPI_foo()

Was PVOID ist wissen wir nicht muss irgendwo anders definiert sein.
Vermutlich void*. Da aber ohne die libMPSSE_spi.h alles läuft scheint 
das ok zu sein. Also ist das Problem offenbar FTDI_API.

Kommentiere doch mal den Block

#ifdef _MSC_VER
#define FTDI_API extern "C"
#else
#define FTDI_API
#endif

aus, definiere

#define FTDI_API

und klammere den kompletten Block mit den Prototypen

extern "C" {
FTDI_API FT_STATUS SPI_GetNumChannels(uint32 *numChannels);
......
FTDI_API FT_STATUS FT_ReadGPIO(FT_HANDLE handle,uint8 *value);
}

Stefan

von Johannes M. (potz_blitz)


Lesenswert?

Vielen Dank!
Ich habe den ersten Block auskommentiert und FTDI_API definiert. Das 
klappt auch soweit, die Fehlermeldungen sind weg!
Lediglich folgende ist geblieben:

 error #2095: Expected type for parameter 2, but found 'bool'.
 warning #2099: Missing type specifier; assuming 'int'.
 error #2001: Syntax error: expected ')' but found '*'.
 error #2001: Syntax error: expected ';' but found ')'.

Diese beziehen sich alle auf den gleichen Header (libMPSSE.h) in der 
Zeil 154.

hier ist definiert:

FTDI_API FT_STATUS SPI_IsBusy(FT_HANDLE handle, bool *state);

Das Klammern des Blockes mit
#ifdef __cplusplus
extern "C" {
#endif

und

#ifdef __cplusplus
}
#endif

wie im ftd2xx.h Header hat keine Auswirkung. Wenn ich allerdings nur mit 
extern "C" klammere bleiben die Fehlermeldungen.

Woran kann das liegen?

Vielen Dank für die Hilfe!

Johannes

von Johannes M. (potz_blitz)


Lesenswert?

Ok, das war vorschnell!

In dem Header ist nochmals an anderer Stelle definiert:

#ifndef _MSC_VER
typedef unsigned char  bool;
#endif

Hier habe ich das auskommentiert und nur die Typedefinition gelassen!
Jetzt kommt auch keine Fehlermeldung mehr.

Ich hoffe, dass das soweit richtig ist und der Header so funktioniert!

Vielen Dank!

Johannes

von Johannes M. (potz_blitz)


Lesenswert?

Zu früh gefreut:

POLINK: error: Unresolved external symbol 'SPI_GetNumChannels'.
POLINK: fatal error: 1 unresolved external(s).

Diese Fehlermeldung bleibt, beim Aufruf der Funktion SPI_GetNumChannels 
aus dem libMPSSE.h Header. Der Header ist eingebunden, eigentlich sollte 
hier kein Fehler kommen. Es handelt sich hierbei um einen Linker-Fehler, 
oder?

Mein Code dazu sieht so aus:

void SPI_INIT(void){
  uint32 channels;
  ftStatus = SPI_GetNumChannels(&channels);
    printf("Number of available SPI channels = %d \n", channels);

}

SPI_INIT ist dabei auch ausreichend definiert! Was diesen Header angeht 
kann hier auch nicht in 32 oder 64bit unterschieden werden.

Vielen Dank und viele Grüße!

Johannes

von Christian R. (supachris)


Lesenswert?

"Unresolved external symbol" bedeutet, der Linker findet die Lib nicht, 
in der die Funktion ist. Hast du denn die Lib dem Linker angegeben? Nur 
ins Verzeichnis kopieren reicht nicht aus.

von DSP (Gast)


Lesenswert?

was macht "FTDI FT232H/UM232H über USB an PC" im "Forum: FPGA, VHDL & 
Co." ???

von Johannes M. (potz_blitz)


Lesenswert?

Ok! Ich habe hier eine libMPSSE.dll und libMPSSE.a.
Wie kann ich die dem Linker übergeben bei Pelles C z.B.?

Danke!

von Johannes M. (potz_blitz)


Lesenswert?

Verzeihung, der Zuordnung zu einem bestimmten Forum war ich mir beim 
Erstellen des Beitrags nicht bewusst!

von Johannes M. (potz_blitz)


Lesenswert?

Weiß jemand wie man eine .dll Bibliothek dem Linker übergibt?

von Duke Scarring (Gast)


Lesenswert?

Johannes Miersch schrieb:
> Weiß jemand wie man eine .dll Bibliothek dem Linker übergibt?
RTFM

von Christian R. (supachris)


Lesenswert?

Die DLL übergibt man gar nicht. Wenn dann übergibt man dem Linker eine 
*.lib (Visual Studio, Borland...) oder *.a (GCC...). Lies die Doku des 
Kompilers. Die DLL wird dann vom Programm selber benutzt, den Kompiler 
geht die nichts an.

von Stefan (Gast)


Lesenswert?

Johannes Miersch schrieb:
> Weiß jemand wie man eine .dll Bibliothek dem Linker übergibt?

Da muss ich mich doch mal selbst zitieren :

Stefan schrieb:
> Eine Library ist
> entweder eine .lib in der die Funktionen enthalten sind. Diese wird dann
> statisch gelinkt. Oder eine .lib in der nur steht in welcher .dll die
> Funktionen enthalten sind. Die Funktionen werden dann erst zur Laufzeit
> gebunden.

google doch mal ein bischen nach :

compiler
linker
librarian
archiver
bedingte compilierung
statisches linken
dynamisches linken
toolchain

immer im Kontext mit C Programmierung. Ich denke wenn Du das zumindest 
mal gelesen hast wird es für alle einfacher und wir werden  hier noch 
vor Weihnachten fertig.

Stefan

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.