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
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.
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?
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.
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
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.
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
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.
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?
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?
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.
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.
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...
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.
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
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
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
-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.
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
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.
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?
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?
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.
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
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
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