Ich möchte eine USB-Verbindung zwischen Windows-PC und pic32mz herstellen. Sobald der pic die 5V Spannung erkennt, aktiviert er die SoftConn (d+, d- leitungen enabled) und es passiert folgendes: - Host gibt resetsignal an pic - Host gibt resetsignal an pic - Host fordert Device-Descriptor an - Device sendet Device-Descriptor - Host gibt resetsignal an pic - Host gibt resetsignal an pic - Host fordert Device-Descriptor an - Device sendet Device-Descriptor - Windows meldet: USB-Device nicht erkannt (oder so) Manchmal sind es nicht 2 sonder 3, 4 oder 1 resetsignal in Folge. Immer wird jedoch bei der Enumeration der DeviceDescriptor 2 mal angefordert, danach ist Ende. Wo könnte der Fehler liegen? Ich denke, dass ich mit den resetsignalen falsch umgehe. Welche Aufgaben hat das USB-Device, wenn es ein Reset-Signal erkennt? Und wie erledige ich diese Aufgaben im pic32mz (die register sind doch sehr anders als bei den anderen pic's). Ich hatte auch Probleme mit dem 12MHz Quarz, der den Takt für die USBPLL erzeugen soll. Könnten Taktprobleme die Ursache sein? Vielen Dank für jeden Hinweis.
Das ist das typische vorgehen wenn Irgendwas nicht stimmt. Es wird dreimal versucht den Geräte-Descriptor anzufordern, danach ist Schluss. Normalerweise kommt danach das setzen der Geräte-Adresse. Da das nicht passiert, nehme ich an, dass schon beim ersten senden des Descriptors etwas faul ist. Woher weisst Du, dass das Gerät den Descriptor auch tatsächlich sendet? Hast Du einen Bus-Analysator?
> Woher weisst Du, dass das Gerät den Descriptor auch tatsächlich sendet? > Hast Du einen Bus-Analysator? Ich weiß es leider nicht, und einen BUS-Analysator habe ich auch nicht. Meine Interpretation des Datenblatt: ich muss den Descriptor in den FIFO des EP0 schreiben und anschließend das USBE0CSR0bits.TXRDY-Bit setzten. Da der FIFO alle 18Byte des Descriptors enthält, ist dies das einzige Datenpaket, das übertragen werden muss, und ich setze deshalb auch noch das USBE0CSR0bits.DATAEND-Bit. Bei dieser Variante taucht eben diesr zweite GetDeviceDescriptor-Request auf. Ich habe nun diverse Varianten (DATAEND-Bit nicht setzen, nur 8Byte in den FIFO schreiben, gar keine Daten in den FIFO, etc.) ausprobiert, bei denen bereits nach dem ersten Request Schluss ist. Daher dachte ich, dass bei meiner Variante irgendetwas besser ist, z.B. dass der Descriptor auch beim Host ankommt. Kann ich durch irgendeine Software feststellen, ob der Descriptor ankommt, bzw. was könnte die Ursache für nichtAnkommen sein?
Andi S. schrieb: > Ich weiß es leider nicht, und einen BUS-Analysator habe ich auch nicht. Den brauchst du auch nicht. Ich häng dir mal nen funktionierenden Treiber dran, wo du sehen kannst, wie die Bearbeitung der diversen Anforderungen so gemacht wird. Ist NICHT für deinen µC, aber zum Verstehen der Abläufe gut. Da Problem bei dir scheint zu sein, daß du entweder den Device-Reset nicht richtig behandelst oder daß du den Empfang des Setup-Paketes nicht richtig behandelst. Du mußt zum Lösen deines Problems die Doku zum USB-Core nochmal gründlichst lesen - am besten auch zwischen den Zeilen. Oft hängt es an irgend einer verdammten Kleinigkeit. Ich hatte z.B. schon mal bei einem LPC, daß man dort den Interrupt nicht nur im Satusregister löschen mußte, sondern zusätzlich auch per Command an die SIE. Irgend so ein Knacks ist es auch bei dir. Guck also mal nach dem Löschen von Interrupt-Anforderungen - wenn an mehreren Stellen in der Doku was dazu steht, dann mußt du vermutlich auch an mehereren Stellen dazu was tun, sonst blockiert der Core. W.S.
> Da Problem bei dir scheint zu sein, daß du entweder den Device-Reset > nicht richtig behandelst oder daß du den Empfang des Setup-Paketes nicht > richtig behandelst. Danke für den Tip. Ich versuch mal, am Empfang des Setup-Paketes etwas zu verändern und das Datenblatt genauer zu lesen.
Frank K. schrieb: > Warum nutzt Du nicht den Microchip USB Stack? Was ist das und wo bekomme ich das?? Ich hab's mit Harmony versucht. Ein Demo-Projekt (HID_Keyboard) hat nicht auf Anhieb funktioniert (kann allerdings auch an meinen Taktproblemen liegen) und ich dachte, die Einarbeitungszeit kann ich zu Fuß reinholen. Naja. Inzwischen bekomme ich zumindest einen SetAdress-Request nach dem DevDesc-Request. Es lag allem Anschein nach an der Reihenfolge, wie die RXRDY-, TXRDY- und DATAEND-Bits gesetzt, bzw. gelöscht werden. Kann aber auch daran liegen, dass ich den Descriptor falsch deklariert habe:
1 | typedef union __attribute__((packed)) |
2 | {
|
3 | //uint8 datas[18];
|
4 | //uint16 datasW[9];
|
5 | //uint32 datasDW[5];
|
6 | struct __attribute__((packed)) |
7 | {
|
8 | uint8 bLength; // Length of this descriptor. |
9 | uint8 bDescriptorType; // DEVICE descriptor type |
10 | etc. |
11 | etc. |
12 | |
13 | };
|
14 | } DEVDESC; |
15 | |
16 | typedef union __attribute__((packed)) |
17 | {
|
18 | uint8 datas[18]; |
19 | uint16 datasW[9]; |
20 | uint32 datasDW[5]; |
21 | struct __attribute__((packed)) |
22 | {
|
23 | uint8 bLength; // Length of this descriptor. |
24 | uint8 bDescriptorType; // DEVICE descriptor type |
25 | etc. |
26 | etc. |
27 | |
28 | };
|
29 | } DEVDESC; |
Ich dachte, bis auf die Größe sollten beide Strukturen gleich sein.
Andi S. schrieb: > Frank K. schrieb: >> Warum nutzt Du nicht den Microchip USB Stack? > > Was ist das und wo bekomme ich das?? > Ich hab's mit Harmony versucht. Das ist das neue. Es gibt noch die alte MLA, aber die kennt wohl den PIC32MZ nicht mehr. > Ein Demo-Projekt (HID_Keyboard) hat > nicht auf Anhieb funktioniert (kann allerdings auch an meinen > Taktproblemen liegen) und ich dachte, die Einarbeitungszeit kann ich zu > Fuß reinholen. Naja. Glaube ich nicht.
Frank K. schrieb: > Das ist das neue. Es gibt noch die alte MLA, aber die kennt wohl den > PIC32MZ nicht mehr. Glaub ich auch. >> Ein Demo-Projekt (HID_Keyboard) hat >> nicht auf Anhieb funktioniert (kann allerdings auch an meinen >> Taktproblemen liegen) und ich dachte, die Einarbeitungszeit kann ich zu >> Fuß reinholen. Naja. > > Glaube ich nicht. Muss nicht perfekt werden, soll nur ein paar Sensordaten auf den PC transportieren. EP0-Zeugs funktioniert inzwischen (bin beim Configured-State angelangt) und ich bin zuversichtlich, dass sich irgendwann auch noch ein BULK-EP dazugesellt.
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.