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
intmain(void)
16
{
17
FT_STATUSftStatus;
18
DWORDlpdwnumDevs;
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
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
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!!
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
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
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
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
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
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
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
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
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
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
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
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
>> 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
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
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
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
"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.
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.
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