Forum: Mikrocontroller und Digitale Elektronik at90usb1287 usb-controller Einrichtungsprobleme


von kingpintsele (Gast)


Lesenswert?

Hi,

bin dabei bei meinem at90usb1287 den usb-controller einzurichten, habe 
die Internetseite von Dr. Stefan Salewski gefunden und probiere mit 
Hilfe von Codefetzen aus seinem Quelltext "ich hoffe er nimmt es mir 
nicht übel" etwas herum

Folgendes habe ich gebastelt bzw. kopiert:
1
int lowspeed = 1;
2
3
// ------------------- USB RESET ------------------------------------------
4
5
  USBCON  = (1<<FRZCLK);
6
  OTGIEN  = 0;
7
  UDIEN  = 0;
8
  UHIEN  = 0;
9
  UEIENX  = 0;
10
  UPIENX  = 0;
11
  UHWCON  = (1<<UIMOD);
12
13
// ------------------- USB INIT -------------------------------------------
14
15
  UHWCON = ((1<<UIMOD) | (1<<UVREGE));
16
  USBCON = ((1<<USBE) | (1<<OTGPADE) | (1<<FRZCLK));
17
  _delay_us(50);
18
  if (lowspeed) UDCON = (1<<LSM);
19
  USBCON = ((1<<USBE) | (1<<OTGPADE));
20
  USBCON = ((1<<USBE) | (1<<OTGPADE) | (1<<FRZCLK)); 
21
  UDIEN = ((1<<WAKEUPE) | (1<<EORSTE));
22
23
24
  ClearBit(UDCON, DETACH);  
25
26
 _delay_ms(5000);

nun zu meiner frage

durch das löschen des detach bits wird ja der pullup bzw. pulldown auf 
D+ oder D- gezogen und danach müsste doch der PC erkennen das versucht 
wird ein usb gerät anzuschließen leider bei mir nicht.
wenn ich einen 10k widerstand zwischen D+ und VBus halte, auch wenn in 
der software noch nichts mit usb eingerichtet wurde, erkennt der PC(win 
xp) ein usb gerät.

laut datenblatt wird der pullup nicht benötigt,
liegt der fehler in meinem code da der usb port erst z.B. nach 
irgendwelchen reset interrupts oder so freigeschlatet wird, da ich in 
bezug auf usb nichts weiter programiert habe als oben angegeben
oder muss der pullup eingelötet werden.

Danke

kingpintsele

von Stefan Salewski (Gast)


Lesenswert?

>Internetseite von Dr. Stefan Salewski gefunden und probiere mit
>Hilfe von Codefetzen aus seinem Quelltext "ich hoffe er nimmt es mir
>nicht übel" etwas herum

Übel nehme ich nichts, aber mit Codefetzen ist das heikel. Es kommt da 
oft auf Kleinigkeiten an. Den Rest des Spagetti-Textes habe ich nicht 
gelesen.
Mögliche Alternative:

http://www.fourwalledcubicle.com/MyUSB.php

von kingpintsele (Gast)


Lesenswert?

ok danke,

aber du kannst mir doch bestimmt sagen ob der pull up widerstand beim 
at90usb1287 gebraucht wird.?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nein, du musst da nichts extern dranhängen, das macht der AT90USB1287
allein.  Aber ich kann Stefan nur beipflichten, ich habe vor kurzem
den AT90USB1287-Support für µracoli gezimmert (ein reiner CDC-Modul),
es kommt auf ganz viele Kleinigkeiten bei diesem Chip an.  Um mal nur
die init-Funktion aus µracoli zu zitieren:
1
void hif_init(const uint16_t baudrate)
2
{
3
    /* ... some debug stuff... */
4
    /*
5
     * Enable the USB macro, the VCC pad (which is misnamed "OTG
6
     * pad"), and the Vbus transition interrupt.
7
     */
8
    USBCON = _BV(USBE) | _BV(OTGPADE) | _BV(VBUSTE);
9
10
    if (USBSTA & _BV(VBUS))
11
    {
12
        /* We are already connected to the USB. */
13
14
        /*
15
         * Start USB clock PLL.
16
         */
17
        PLLCSR = PLLSETUP;
18
        while ((PLLCSR & _BV(PLOCK)) == 0)
19
        {
20
            /* wait for PLL lock */
21
        }
22
        /*
23
         * Enable the end-of-reset and suspend function interrupts.
24
         * Activate the voltage regulator.  Unfreeze the clock, and
25
         * attach.
26
         */
27
        UDIEN = _BV(EORSTE) | _BV(SUSPE);
28
        UHWCON |= _BV(UVREGE);
29
        USBCON &= ~_BV(FRZCLK);
30
        UDCON &= ~_BV(DETACH);
31
32
        attached_to_usb = true;
33
    }
34
    else
35
    {
36
        /*
37
         * We are not connected to the USB: wait for the bus power
38
         * being detected (which triggers a VBUSTI interrupt).
39
         */
40
        attached_to_usb = false;
41
    }
42
43
    rxhead = rxtail = 0;
44
}

Das dürfte so ziemlich die minimale Sequenz sein, mit der du das
Gerät dem Host erst einmal verkündigst.  Danach geht es aber dann
erst richtig los ;-), dann musst du nämlich den ganzen Setup-Kram
vom Host abhandeln.  Ich denke, dass die 1400 Zeile Code, die ich
im µracoli dafür aufgewendet habe, so ziemlich das Minimum
darstellen dürften, was man benötigt, um ein CDC-Device zu
implementieren.

von Stefan Salewski (Gast)


Lesenswert?

>ob der pull up widerstand beim
>at90usb1287 gebraucht wird.?

Nein. Der AT90USB1287 hat den Pullup intern, dadurch kann man per 
Software zwischen Low- und Fullspeed wählen.

Aber man bekommt den AT90USB1287 nicht mal so eben durch das setzen 
einiger Register "eingeschaltet". Bis ich die ersten Bytes der 
Enumeration übertragen konnte habe ich weit mehr als 100 Stunden 
benötigt. Sehr lange war der Chip USB-mäßig scheinbar tot. Es kommt da 
wirklich auf die Reihenfolge an, in der man bestimmte Register 
beschreibt, und auch auf das Timing. Und diese Feinheiten standen nicht 
im Datenblatt.

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.