Forum: Mikrocontroller und Digitale Elektronik FX2 wird nicht erkannt? Firmwareproblem?


von Stefan K. (stefan82)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

hab mir ne angepasste Firmware für einen FX2 geschrieben. Aber obwohl 
ich im Device Descriptor erstmal die VID/PID/DID aus den Cypress 
Beispielen verwende, meldet mir Windows, das dass Gerät nicht richtig 
erkannt werden konnte und daher auch kein Treiber installiert wurde?!

Komm da grad nicht so richtig weiter ... hab den Projektordner mal in 
den Anhang gepackt ... vllt kann ja mal jemand drüber gucken.

Soll ein reines "streaming" Device sein und nur Daten über EP6 an den 
Host schicken. Ep6 daher mit AUTOIN, Quad Buffer, BULK IN konfiguriert.

Danke & Gruß

Stefan

von Christian R. (supachris)


Lesenswert?

Also ich hab die IIC Datei aus deinem Zip File mal auf mein FX2 Board 
ins EEPROM geschoben, das klappt. Inf Datei noch angepasst, dann lädt 
der Treiber und in der CyConsole wird der EP86 mit 1024 Byte max. 
paketgröße angezeigt.

von Stefan K. (stefan82)


Lesenswert?

Danke Christian!

Der Hinweis mit der INF hat mir geholfen. Grml mal wieder H / L Byte 
verdreht. Naja, nu hab ichs ...

Nebenbei gefragt ... für private Bastelzwecke ... spricht irgendwas 
gegen ne PID / DID 1234?

von Christian R. (supachris)


Lesenswert?

Wenn das Gebilde deine privaten Räumlichkeiten nicht verlässt, kannst du 
machen, was du willst. Cypress VID und eine PID deiner Wahl und dann ist 
gut. Verkaufen kannst du das Ding nur mit eigener VID. Kostet 2000 US$.

Achja. Mach mal nicht 1024 Byte Pakete bei Bulk, das klappt nicht gut. 
Aus irgend einem Grund ist das total langsam. Nimm 512 Byte, Quad-Buffer 
und hole gleich massig Daten auf einmal ab, also ganzzahlige Vielfache 
von 512 Byte, dann wird das richtig schnell. Achja, KernelTransferSize 
noch hochsetzen, 128kibyte ist ein guter Wert.

Und das komische REVCTL Register ist auch mit Vorsicht zu 
genießen....ich hab das nicht angefasst, dann funktioniert der Chip so 
wie er soll. Mit der 0x03 da drauf gibts seltsame Effekte.....

Und nochwas: vergib Seriennummern, dann musst du nicht jedes Mal Admin 
sein, wenn du das mal an einen anderen Port ansteckst.

von Stefan K. (stefan82)


Lesenswert?

N'abend!

@Christian:

Danke für deine bisherigen Antworten, ... und für die die hoffentlich 
ncoh kommen :-) ...
die Tips aus deinem letzten Posting hab ich grade noch nicht in meine 
Firmware implementiert ... werd ich wohl morgen machen ...

Im moment kämpfe ich mit der Fehlermeldung:

USBD_STATUS_XACT_ERROR (0xC0000011)

Diese erhalte ich sobald ich Versuche die Daten die mein FPGA in den FX2 
schreibt mit einem Bulk Transfer versuche abzurufen. Meist hat ein 
solcher Transfer Versuch zur Folge, dass mir danach die EZ-USB Controll 
abstürzt.
Versuche den USB Bus mit UTLog zu überwachen und sehe dort diese 
Fehlermeldung.

Bin aber im Moment ratlos, ob diese Fehlermeldung durch mein FPGA Design 
Verursacht wird, der FX2 also irgendwie "unsauber" beschrieben wird, 
oder ob das Problem in der FW des FX2 liegt.

Habe versucht mir die Schnittstelle zwischen FPGA und FX2 (Datenbits, 
SLWR und FLAGB auf einem Digital-Scope anzeigen zu lassen. Ist ein wenig 
schwierig zu beobachten ... sollte aber denk ich funktionieren.

hat irgendjemand nen Tipp für mich wie ich da besser debuggen kann, bzw. 
einen Ansatzpunkt wo der oder die Fehler noch begraben sein könnten?

Gruß,

stefan

von Christian R. (supachris)


Lesenswert?

Stefan K. schrieb:

> Im moment kämpfe ich mit der Fehlermeldung:
>
> USBD_STATUS_XACT_ERROR (0xC0000011)
>
> Diese erhalte ich sobald ich Versuche die Daten die mein FPGA in den FX2
> schreibt mit einem Bulk Transfer versuche abzurufen. Meist hat ein
> solcher Transfer Versuch zur Folge, dass mir danach die EZ-USB Controll
> abstürzt.

EZ-USB Controll? Was ist denn das? Versucht du etwa den alten ezUSB 
Treiber mit dem FX2 zu benutzen? Für den FX benötigst du den CyUSB.sys 
Treiber und zum einfachen Testen diese CyConsole oder diese .NET 
Umsetzung....

> Bin aber im Moment ratlos, ob diese Fehlermeldung durch mein FPGA Design
> Verursacht wird, der FX2 also irgendwie "unsauber" beschrieben wird,
> oder ob das Problem in der FW des FX2 liegt.

Hm, naja, wenn man sich an das Timing hält, kann man da höchstens das 
BlockEnde vergessen oder so 8ist bissl tückisch), aber ansonsten....was 
im FIFO ist, ist drin.

> Habe versucht mir die Schnittstelle zwischen FPGA und FX2 (Datenbits,
> SLWR und FLAGB auf einem Digital-Scope anzeigen zu lassen. Ist ein wenig
> schwierig zu beobachten ... sollte aber denk ich funktionieren.

Naja, Speicher-Oszi und/oder Logik-Alayzer helfen schon. Allerdings bei 
dir etwas schwierig, da du offenbar immer Daten streamst und nicht auf 
Anforderung.

Achso, Vorsicht mit asynchronen Anfragen über die CyAPI, die gehen meist 
schief, da musst du über device io control direkt auf den CyUSB Treiber 
arbeiten (ist eh besser). Mit dem aktuellen Treiber (3.4.1.20) gibts 
auch keine Bluescreens bei vielen parallel gestellten asynchronen 
Anfragen mehr.

von Thomas R. (tinman) Benutzerseite


Lesenswert?

Christian R. schrieb:
>
> Achso, Vorsicht mit asynchronen Anfragen über die CyAPI, die gehen meist
> schief, da musst du über device io control direkt auf den CyUSB Treiber
> arbeiten (ist eh besser). Mit dem aktuellen Treiber (3.4.1.20) gibts
> auch keine Bluescreens bei vielen parallel gestellten asynchronen
> Anfragen mehr.


meinst du den hier ?

http://www.cypress.com/?rID=34870

von Christian R. (supachris)


Lesenswert?

Thomas R. schrieb:

> meinst du den hier ?
>
> http://www.cypress.com/?rID=34870

Genau. Der klappt gut.

von Stefan K. (stefan82)


Lesenswert?

Hallo zusammen.

Dank dem Tipp mit dem CyUSB.dll hab ich es nun geschafft Daten aus 
meinem FPGA zu holen, ohne das mir die Console (respektive der Rechner) 
abstürzt.
Leider bekomme ich nicht die Daten heraus, die ich in meinem Chip gerne 
sehen würde. Nach Bulk Anforderung meldet die Konsole ein:
1
Bulk IN Transfer
und anschließend ein
1
Bulk IN success

Jedoch besteht der inhalt der empfangen Daten immer nur aus Hexadressen 
und 00 00 00 00 00 00 00 00 00 ...

Ich übertrage also nur Nullen über den USB Bus. Also muß mein Problem 
nun wohl doch noch am Timing bei der Eintaktung der Daten aus meinem 
FPGA in die EP6 FIFOs liegen. Gibts da noch irgendwas spezielles auf das 
ich achten muß?

Mein PKTEnd wird nach 512 geschriebenen Bytes gesetzt ... das SLWR wird 
bei einer fallenden Flanke zu Null gesetzt ... mit der folgenden 
steigenden Flanke soll der FX2 die Daten laut Datenblatt übernehmen ... 
und mit der danach folgenden Flanke wird das SLWR wieder auf high 
gesetzt.
Als Schreibttakt wird der interne IFCLK des FX2 mit 30MHz verwendet, 
welchen ich mir an den FPGA ausgeben lasse.

So ein mist mir gehen da langsam die Ideen aus wo der Fehler noch liegen 
könnte.

Gruß,

Stefan K.

von Stefan K. (stefan82)


Lesenswert?

kurze Frage am Rande ... sollte ich hierfür eher einen neuen Thread 
aufmachen? weil zur Überschrift passts ja nun nicht mehr ... oder kann 
man die Überschrift ändern?

von Christian R. (supachris)


Angehängte Dateien:

Lesenswert?

Wenn immer Nullen sind, denke ich mal, das ist kein Timing Problem. Dann 
wären komische "verwurstete" Daten. Und bei 30MHz ist das alles recht 
gemütlich. Ich fahre mit 40Mhz ext. IFCLK und aktualisiere die SLWR, 
SLRD und PacketEnd Signale bei der steigenden Flanke des um 90° 
verzögerten Taktes. Somit halte ich selbst im schlimmsten Fall noch alle 
Setup- und Hold Zeiten ein. Im Anhang mal das Schreiben eines einzelnen 
Wortes mit anschließendem Paket-Ende in den FX2.

Übrigens: Wenn du alle Pakete nach 512 Byte schon abschließt, kommst du 
auf eine maximale Datenrate von etwas über 4MB/s. Reicht das?

von Stefan K. (stefan82)


Lesenswert?

Das PKTEnd hab ich durch einen Zähler in der FSM eingebaut der mit einer 
Generic verglichen wird. Daher kann ich die Größe der Pakete mehr oder 
weniger anpassen. Hatte vor mich an die Größe der Pakete langsam ran zu 
tasten. Schonmal danke für dein Beispiel das werde ich morgen mal näher 
anschauen.

von Stefan K. (stefan82)


Lesenswert?

Hab mir grade dein Beispiel mal angeguckt,
...von der Taktung SLWR zum IFCLK unterscheiden wir uns eigentlich nicht 
maßgeblich (abgesehen von der Taktinvertierung) ...

Aber ein paar Fragen hab ich doch noch ...
Du hast da ein USBOE (Out enable?) ... muss ich das konkret auf High 
legen? Da ich keine Ausgabe in dieser Richtung realisert habe, dachte 
ich ich könnte mir das sparen. Habe diesen Pin glaub ich auch über die 
Einstellung des IFCONFIG[1:0] zu einem normalen IO Pin gemacht ... schau 
ich mir aber gleich nochmal an.

Und dann kann ich noch mit den drei Signalen usb_pa0, usb_pa3 und usbbe 
nicht wirklich was anfangen. Wofür stehen die? Insbesondere usbbe 
interessiert mich da weil dort ja noch mal ein Low Toggle drin ist ...

Gruß,

Stefan
P.S.: Ich werd gleich nochmal ein Bild von meinem aktuellen Timing 
posten.

von Christian R. (supachris)


Lesenswert?

Hm, naja, ich hab ja bidirektional, da muss das OE natürlich zum 
Schreiben auf den FX2 auf High. PA0 und PA3 sind nur ein paar 
zusätzliche Steuersignale, die kannst du ignorieren. USBBE ist das 
PacketEnd. (BE Block Ende). Vielleicht liegts an dem fehlenden OE, ich 
glaub nicht, dass man das generell weglassen kann...

Soweit ich das in Erinnerung habe, muss aber IFCONFIG 1:0 11 sein, damit 
das Slave FIFO Interface überhaupt an ist...

von Stefan K. (stefan82)


Lesenswert?

Erfolgsmeldung...

Fehler lag wohl an dem fehlenden OE. Jedenfalls funktionierts nun 
richtig und ich sehe meine Daten erfolgreich und "vermutlich" korrekt in 
der CyConsole.

Nochmal ne Frage zur KernelTransferSize ... ist die im Treiber oder in 
der Firmware des FX2 zu suchen ? ...

DANKE nochmal für alle hilfreichen Wortmeldungen!

Gruß,

Stefan K.

von Christian R. (supachris)


Lesenswert?

Die ist im Treiber einstellbar und sollte möglichst hoch sein 
(ganzzahlige Vielfache vom 512 Byte).

von Stefan K. (stefan82)


Lesenswert?

Also nicht in der INF ... beudet ich muß den Treiber CyUSB.sys neu 
kompilieren ?

von Christian R. (supachris)


Lesenswert?

Nein, das ist eine Funktion, die du entweder über das CyAPI oder direkt 
auf IOControl des Treibers anwenden kannst.

von Tom A. (thomas_a)


Lesenswert?

Hallo,
das Thema ist zwar schon etwas älter. Meine Frage bezieht sich auch nur 
auf den ersten Teil. Ich versuche mir auch gerade eine FW zu basteln und 
habs bisher einfach nicht hinbekommen.
Da habe ich mir gedacht ich lade einfach mal die funktionierende FW von 
hier runter.

Auch das hat leider nicht funktioniert. Die FW ins EEPROM geladen. Wenn 
ich dann das USB device ausstecke und wieder einstecke kommt nur wieder 
VID=PID=0.

Das kann doch nicht sein oder? Ich hoffe mir kann mal jmd. helfen :-/

Vielen Dank schonmal

Grüße Thomas

von Christian R. (supachris)


Lesenswert?

Hast du die fertigen iic Files genommen oder selbst erzeugt? Das 
Programm, dass die iic Files erzeugt, braucht ein paar Kommandozeilen 
Parameter....

von Tom A. (thomas_a)


Angehängte Dateien:

Lesenswert?

Hi Chris,
Ich hab das iic selbst erzeugt. Mit den folgenden Parametern.
-i -r -v 0x04B4 -p 0x8613 -c 0x41 -f 0xC2 -o fw.iic fw.hex

Um das ganze zu vereinfachen habe ich einfach mal das Programm 
angehängt. Im grunde gibt es nur ein Rechteck auf edm Pin A0 aus.

An der Hardware muss ich nichts verändern oder? Also alle pins hängen 
"frei" in der "Luft".

Danke für die Antwort.
Tom

von Christian R. (supachris)


Lesenswert?

Ich schau mir das mal an. In meinem hex2bix steht kein -r drin. Außerdem 
verlangt der die VID und PID Byte-gedreht.

von Tom A. (thomas_a)


Lesenswert?

mh.. das ist richtig, der Reset am ende des files fehlt. reset hier zu 
müsste es lauten E6 00 01 oder nicht?

VID und PID sind aber meiner Meinung nach schon richtig. Laut TRM :

EEPROM Address Contents
0      0xC2
1      Vendor ID (VID) L
2      Vendor ID (VID) H
3      Product ID (PID) L
4      Product ID (PID) H
5      Device ID (DID) L
6      Device ID (DID) H
7      Configuration byte

Somit kommt zuerst das low und dann das high byte und da ich ja -v 
0x04B4 und -p 0x8613 habe sind diese genau gedreht. Oder nicht?

Grüße,
Tom

von Christian R. (supachris)


Lesenswert?

-v 0x04B4 und -p 0x8613 bewirkt dann im Gerätemanager eine VID B404 und 
PID 1386. Ich hab das mal getestet, meldet sich nicht an am PC. Ich guck 
mal weiter. Hast du mal meine Slave-FIFO Test Firmware hier aus dem 
Forum probiert anzupassen? Oder das BulkLoop Beispiel? Das läuft auf 
jeden Fall.

von Tom A. (thomas_a)


Lesenswert?

Also ich hab es gerade eben nochmal mit der FW aus diesem Thread 
probiert. Auch hier passiert nichts. Ich weiß nicht ob ich beim laden 
ins EEPROM etwas falsch mache. Ich beschreibe einfach mal kurz mein 
vorgehen.

Ich lade zuerst die vend_ax.hex mit dem "download"-button ins RAM.
Anschließend lade ich mit EEPROM die *.iic ins EEPROM.
Dann stecke ich die Spannungsversorgung (im moment das USB Kabel ab) und 
wieder an. Dann müsste aus dem EEPROM gebootet werden oder nicht?

Was hier jetzt komisch ist. Normalerweise kommt das device also 
"Unbekanntes Gerät" aber mit deiner FW die du hier gepostet hast 
passiert einfach gar nichts.

Ich werde jetzt denk mal das BlukLoop ausprobieren...

Danke schonmal für deine Hilfe.

Tom

von Christian R. (supachris)


Lesenswert?

Hm, also ich programmiere das in der CyConsole. Das Gerät in der Liste 
auswählen -> Options -> EZ USB Interface -> Lg EEPROM. iic File 
auswählen. Fertig. Dann abstecken und anstecken. Mehr ist es nicht. In 
dem .NET USB Control Center ist es noch einfacher. Gerät aufwählen -> 
Programm FX2 -> 64k EEPROM. Fertig.

von Tom A. (thomas_a)


Lesenswert?

mh, also bei der CyConsole, die ist ja bei dem Cypres Dev. version 
dabei. Ich hab die jetzt mal geladen und installiert. ich kann das 
EZ-USB Interface öffen, aber nichts anklicken.

Ich kann auch vorher schon kein USB Device auswählen, weil keines 
angezeigt wird.

Ich habe das board von Brain Technology (USB High Speed Interface 2.5) 
das dürfte ja trotzdem gehen oder? Mir ist gerade aufgefallen, das wenn 
ich etwas in das EEPROM lade mit dem EZ-USB Control Panel, ganz am ende 
noch ein Pending befehl drin steht. ("Pending: OpIndex=50: 
OpType=3=Vendor Request").

Bei dir meldet er sich dann wieder an mit der hier geposteten Version?

von Tom A. (thomas_a)


Lesenswert?

The CyConsole  communicates with USB devices via  the CyUSB.sys device 
driver.  Only USB devices serviced by the CyUSB.sys  driver can be 
accessed from the CyConsole application.

Jetzt bin ich etwas verwirrt. Ich verwende doch den ezusbw2k.inf treiber 
oder nicht?! verwendet ihr etwa den CyUSB?

von Christian R. (supachris)


Lesenswert?

Ich hab überhaupt kein EZ USB Control Panel. Wenn du in der CyConsole 
nix programmieren kannst bzw. nicht mal Geräte angezeigt bekommst, hast 
du offenbar den hundealten EzUSB Treiber für das Board installiert. Nimm 
mal den CyUSB Treiber. Ist auch im Entwicklerpaket dabei. Die CyConsole 
ist übrigens auch in dem kleinen Entwicklerpaket, wo die .NET DLL dabei 
ist usw. mit drin. Also, welchen Treiber nutzt du? Falls doch cyUSB.sys 
dann mal in der CyConsole auf den letzten Reiter gehen und evtl. in der 
Drop Down Box den passenden auswählen. Diese Brain Boards hab ich auch 
hier. Mal abgesehn davon, dass die offenbar ein 8-Klässler beim 
Abendbrot geroutet hat, funktionieren sie eigentlich. Anstatt des 
EEPROM-Deaktivier-Widerstandes hab ich einen jumper eingelötet, um mal 
schnell das EEPROM auszuschalten.

Edit: Das hat sich jetzt überschhnitten. Ja, der ezusb Treiber ist 
steinalt. Aktuell ist der CyUSB Treiber.

von Tom A. (thomas_a)


Lesenswert?

mh... ok, wie eben schon oben geschrieben hatte ich wohl den alten 
Treiber. Naja ich weiß nicht mit was mein vorgänger gearbeitet hat, aber 
ich glaube jetzt habe ich mal wieder ein weiteres grundsätzliches 
Problem gelöst ;)

Die FW die ich programmiert habe geht noch immer nicht, aber jetzt kann 
ich zumindest nochmal anfangen alles zu testen und auszuprobieren und 
nochmal dein slave_fifo versuchen zum laufen zu bringen.

Du hast nicht zufällig einen fehler in meiner anderen FW gefunden oder?

Danke schonmal.

Grüße Thomas

von Christian R. (supachris)


Lesenswert?

Nee, ich hatte dann erst mal keine Zeit mehr. Probier mal mein Slave 
FIFO oder das BulkLoop Demo. Kannst du ja leicht abändern dann.

von Tom A. (thomas_a)


Lesenswert?

ok, jetzt sieht die welt schon ganz anders aus ;)

er bootet aus dem EEPROM und gibt auch wieder das Rechteck aus :)

Nur die VID/PID sind dannach = 0000

naja jetzt muss ich eben mal schauen waran das liegen kann, aber jetzt 
gab es zumindest mal ein Fortschritt ;)

Danke Chris

Ich hoffe, die unterschiedlichen Laufzeiten werde mich nicht 
betreffen... sonst wird das alles noch kritischer ;)

Gruß Thomas

von Tom A. (thomas_a)


Angehängte Dateien:

Lesenswert?

Hallo ich bin es schon wieder.

Das booten aus dem EEPROM klappt jetzt. Allerdings, verwende ich den T0 
und natürlich auch eine ISR. Wenn ich das jetzt versuche einzubinden, 
dann findet die renumeration nicht mehr ordnunggemäß statt. ich vermute, 
dass sich der 8051 irgendwie verliert. Also dass der pointer auf die 
service routine irgendwie nicht passt. Muss ich da etwas verändern?!
Beim kompilieren kommmt auch schon die Fehlermeldung, dass ein teil des 
Programmes nicht durchlaufen wird und dann wird genau der name der ISR 
angezeigt.

Zuvor hat die ISR ja problemlos funktioniert (im RAM ohen FW natürlich).

Kann mir da jemand weiter helfen. Es kann doch eigentlich nicht sein, 
dass die Programme im RAM laufen und wenn ich sie dann ins EEPROM 
schreibe, dass ich sie komplett verändern muss oder?

Ich hab das Projekt einfach mal angehängt. Ihr könnt es euch ja bei 
gelegenheit einfach mal anschauen oder einfah eure Ideen posten, was ich 
beachten muss/sollte.

Danke schonmal.

Grüße Thomas

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.