Hallo zusammen, ich habe ein kleines Problem mit dem Tusb3410[1] von TI. Und zwar bin ich bei der Programmierung des Usb-Enumeration-Vorgangs auf Schwierigkeiten gestossen. Nachdem der Tusb3410 eine Adresse vom Host zugewiesen bekommt, empfängt er einen GetDescriptor-Request (dabei handelt es sich um einen Devicedescriptor-Request mit wLength=0x08). Trotz der vielen Versuche scheint der Tusb3410 keinen Devicedescriptor zum Host zu senden, und aus diesem Grund wird er nicht vollständig enumeriert. Am Oszi kann man beobachten, dass nach dem Empfang des Getdescriptor-Requests weitere Datenpakete übertragen werden, aber leider kann ich nicht feststellen, vom welchen Busteilnehmer diese gesendet werden, und um welche Datenpakete es sich dabei handelt. Nun möchte ich den Datenverkehr zwischen Host und Device genauer untersuchen, aber leider ist die Dekodierung an meinem Oszi sehr schwierig, und deswegen habe ich nach einer Software gesucht, die mir die Datenpakete protokolliert. Leider arbeiten alle Usb-Sniffers, die ich gefunden habe, erst nach der Enumeration (oder kennt vielleicht jemand einen Usb-Sniffer, der auch die Enumeration mitprotokolliert..!?) und helfen mir bei meinem Problem nicht weiter. Danach habe ich nach Hardware-Lösungen gesucht und auch welche gefunden. Mit einem Usb Analyzer, wie z.B. der SBAE-30 von Catylst[2] könnte ich mein Problem genauer untersuchen, aber leider ist das Gerät für mich zu teuer. Also habe ich mich gefragt, wie schwer es wohl wäre, einen Usb "Analyzer" zu entwickeln. Mit Analyzer meine ich einen uC, der am Usb-Bus angeschlossen wird, und Datenpakete über einen Zeitraum in einem Buffer speichert. Der Zeitraum für die Aufnahme könnte mit Hilfe eines externen IO-Ports des Tusb3410 getriggert werden, oder vielleicht direkt über das Sync-Feld des Usb-Frames. Da der Tusb3410 in Full-Speed-Modus (12MBits/s, tBit ~80ns) arbeitet, muss der uC schnell genug sein, um die Daten in einem Buffer (vielleicht reicht ein uC mit on-chip XRAM in der Größenordnung einiger KBytes aus !?!) zu speichern. Die aufgenommenen Daten könnte man danach am PC weiterverarbeiten und filtern, bis man die einzelne Usb-Datenpakete erhält. Leider kenne ich mich mit Mikrocontrollern nicht so gut aus, deswegen würde ich gerne die Meinung von Euch lesen, um zu erfahren, ob es überhaupt möglich ist, mit einfachen Mitteln (uC, RAM, Usb-Bustreiber, ...??) einen solchen Analyzer zu realisieren. Für Kommentare oder andere Lösungsansätze zu diesem Thema wäre ich sehr dankbar. Danke im Voraus Felipito PS: ich habe die Suchfunktion verwendet, und habe einen Thread vom 02.08.2002 gefunden. Aber vielleicht ist es heute ein wenig leichter einen solchen Analyzer zu entwickeln; wobei mir klar ist, dass bereits die Verarbeitung der Datenpakete im PC auch nicht leicht sein wird (NRIZ-Kodierung, Bit-Stuffing, ...) PS2: falls jemand den Tusb3410 programmiert hat, dann bitte melden [1] http://focus.ti.com/docs/toolsw/folders/print/tusb3410gpiopdk.html [2] http://www.getcatalyst.com/analyzers_pro_SBAE30.jsp
Du hast ein generelles Problem. Bei der Enumerierung von Win kommt gar nie ein GetDescriptor (Device) mit wLength=0x0008. Windows macht das entweder mit wLength = 0x0040 vor dem SetAddress danach mit wlength = 0x0012. Sehr warscheinlich ist dein SetAddress kaput. Einen USB Analyzer selbst zu bauen kannst du vergessen, solange du eine Enum nicht hinbekommst. schau mal bei http://www.ellisys.com/ die bieten sowas relativ preiswert an. Ich habe übrigens die TUSBs schon programmiert.:-) Thomas
Hallo Thomas, herzlichen Dank für Deine Antwort. Ich gebe Dir Recht, laut Spezifikation müsste wLength=0x40 sein, und nach dem SetAddress müsste er einen Request mit wLength=0x12 erhalten, aber aus irgendeinem Grund erhalte ich folgenden GetDeviceDescriptor-Request: 80 06 00 01 00 00 08 00 Diese Werte stammen aus dem Setup-Paket-Block (bei einem VECINT=0x32), und wie man sieht, ist wLength=0x08. Nach dem Anschliessen des Tusb3410 an meinem PC (Linux-BS) erhalte ich folgende Systemmeldungen: Dec 30 01:08:23 felipito kernel: usb 1-1: new full speed USB device using address 8 Dec 30 01:08:28 felipito kernel: usb 1-1: control timeout on ep0in Dec 30 01:08:31 felipito kernel: usb 1-1: device descriptor read/all, error -110 (Da die Usb-Enumeration laut Spezifikation generisch sein sollte, müsste auch bei Windows gleich ablaufen, aber mangels eines Windows-Systems habe ich es nicht testen können) Nachdem Anschliessen des Tusb3410 an dem Usb-Bus (CONT=1) erhalte ich folgende Setup-Pakete vom Host: 00 05 08 00 00 00 00 00 80 06 00 01 00 00 08 00 80 06 00 01 00 00 08 00 80 06 00 01 00 00 08 00 Dreimal den gleichen GetDeviceDescriptor-Request mit wLength=0x08, und danach ist Feierabend. Nun ich weiss nicht, ob es zu viel verlangt ist, aber könntest Du mir vielleicht sagen, ob Du einen Eeprom für das Speichern Deines Anwenderprogramms (Firmware) verwendet hast...?! und wenn ja, mit welcher Art von Firmware Du es hingekriegt hast: Binary Firmware oder Autexec Binary Firmware ?! Ich wäre Dir sehr dankbar für diese Infos, denn ich habe in den letzten Tagen mit beiden Optionen versucht, aber leider erfolglos. Danke im Voraus, und frohes neues Jahr wünsche ich Dir Felipe
Hallo! Ich kenne den TUSB zwar nicht, aber kann es vielleicht sein, daß Du die Adresse zu früh aktivierst? Die Status-Stage des SetAddress-Requests muß auf jeden Fall noch auf Adresse 0 laufen, ansonsten passieren die dollsten Sachen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.