mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik at90usb1287 usb-controller Einrichtungsprobleme


Autor: kingpintsele (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

int lowspeed = 1;

// ------------------- USB RESET ------------------------------------------

  USBCON  = (1<<FRZCLK);
  OTGIEN  = 0;
  UDIEN  = 0;
  UHIEN  = 0;
  UEIENX  = 0;
  UPIENX  = 0;
  UHWCON  = (1<<UIMOD);

// ------------------- USB INIT -------------------------------------------

  UHWCON = ((1<<UIMOD) | (1<<UVREGE));
  USBCON = ((1<<USBE) | (1<<OTGPADE) | (1<<FRZCLK));
  _delay_us(50);
  if (lowspeed) UDCON = (1<<LSM);
  USBCON = ((1<<USBE) | (1<<OTGPADE));
  USBCON = ((1<<USBE) | (1<<OTGPADE) | (1<<FRZCLK)); 
  UDIEN = ((1<<WAKEUPE) | (1<<EORSTE));


  ClearBit(UDCON, DETACH);  

 _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

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: kingpintsele (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke,

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
void hif_init(const uint16_t baudrate)
{
    /* ... some debug stuff... */
    /*
     * Enable the USB macro, the VCC pad (which is misnamed "OTG
     * pad"), and the Vbus transition interrupt.
     */
    USBCON = _BV(USBE) | _BV(OTGPADE) | _BV(VBUSTE);

    if (USBSTA & _BV(VBUS))
    {
        /* We are already connected to the USB. */

        /*
         * Start USB clock PLL.
         */
        PLLCSR = PLLSETUP;
        while ((PLLCSR & _BV(PLOCK)) == 0)
        {
            /* wait for PLL lock */
        }
        /*
         * Enable the end-of-reset and suspend function interrupts.
         * Activate the voltage regulator.  Unfreeze the clock, and
         * attach.
         */
        UDIEN = _BV(EORSTE) | _BV(SUSPE);
        UHWCON |= _BV(UVREGE);
        USBCON &= ~_BV(FRZCLK);
        UDCON &= ~_BV(DETACH);

        attached_to_usb = true;
    }
    else
    {
        /*
         * We are not connected to the USB: wait for the bus power
         * being detected (which triggers a VBUSTI interrupt).
         */
        attached_to_usb = false;
    }

    rxhead = rxtail = 0;
}

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.

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.