Forum: Mikrocontroller und Digitale Elektronik USB-Enumeration mit pic 32 mz


von Andi S. (andi1111)


Lesenswert?

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.

von Pit (Gast)


Lesenswert?

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?

von Andi S. (andi1111)


Lesenswert?

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

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Andi S. (andi1111)


Lesenswert?

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

von Frank K. (fchk)


Lesenswert?

Warum nutzt Du nicht den Microchip USB Stack?

von Andi S. (andi1111)


Lesenswert?

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.

von Frank K. (fchk)


Lesenswert?

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.

von Andi S. (andi1111)


Lesenswert?

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
Noch kein Account? Hier anmelden.