Kampis Elektroecke

Betriebsmodus: USB-Device


Im letzten Teil bin ich etwas detailierter auf die Grundlagen des USB eingegangen, um ein erstes Verständnis über den Ablauf der USB-Kommunikation zu schaffen. Dieses Wissen soll jetzt genutzt werden um den AT90USB1287 als USB-Device zu betreiben.

Für den Anfang soll der MIkrocontroller als Standard USB-Maus verhalten. Dazu muss der Mikrocontroller als USB-Gerät initialisiert und konfiguriert werden, was in mehreren Schritten erfolgt. In diesem Teil des Tutorials werde ich auf die Initialisierung des Mikrocontrollers als USB-Device eingehen. Der nächste Teil wird sich mit der Konfiguration der USB-Endpunkte beschäftigen und sämtliche Mausfunktionalitäten zeige ich dann in den darauf folgenden Teilen.

Die Konfiguration des USB-Moduls unterteilt sich in die folgenden Schritte:

  • Konfiguration des USB-Controllers
  • Konfiguration des USB Device-Controllers
  • Konfiguration des USB Host-Controller

Allgemeine Konfigurationen werden im USB-Controller durchgeführt und für die jeweilige Betriebsart wird der Host-, bzw. Device-Controller genutzt. Da der Mikrocontroller als USB-Device arbeiten soll, werden sowohl der USB-Controller, als auch der USB-Device-Controller benötigt.

Bevor der USB-Controller genutzt werden kann, muss er zurückgesetzt werden, damit sich der USB-Controller in einem definierten Zustand befindet. Dazu wird das USBE-Bit im USBCON-Register des USB-Controllers gelöscht und direkt wieder gesetzt:

Der USB-Controller befindet sich nun im Reset-Zustand. Im weiteren Verlauf dieses Programms sollen bestimmte Aktionen nur durchgeführt werden, wenn sich das USB-Modul in einem bestimmten Zustand befindet (z. B. soll die Anmeldung beim Host nicht durchgeführt werden, wenn der USB-Controller nicht initialisiert worden ist). Daher wird der Zustand zusätzlich noch in einer Variable gespeichert.

Das weitere Vorgehen kann dem Datenblatt entnommen werden.

Nach einem Reset ist automatisch der USB-Device-Modus aktiviert, da der externe UID-Pin des Mikrocontrollers deaktiviert ist (UIDE = 0) und das UIMOD-Bit gesetzt ist. Weiterhin wird bei einem Reset die PLL für das USB-Modul deaktiviert, indem das FRZCLK-Bit im USBCON-Register gesetzt wird. Auch dieses Bit muss nach einem Reset gelöscht werden.

Es wird empfohlen den internen Spannungsregler zu verwenden um die Versorgungsspannung der Datenleitungen zu gewährleisten. Dieser Spannungsregler ist nach einem Reset automatisch inaktiv und muss daher aktiviert werden, indem das UVREGE-Bit im UHWCON-Register gesetzt wird.

Damit sich der Mikrocontroller am USB anhängen und der Host das neue Gerät erkennen kann, muss zudem das VBUS-Pad über das OTGPADE-Bit im USBCON-Register aktiviert werden.

Die Konfigurationen am USB-Controller sind damit abgeschlossen. Das USB-Modul arbeitet nun im Device-Modus und der USB-Controller ist einsatzbereit. Jetzt muss noch der Device-Modus konfiguriert werden.

Die USB-Geschwindigkeit wird über das LSM-Bit im UDCON-Register gesteuert. Je nachdem ob das Bit gesetzt oder gelöscht wird, wird der Pull-Up Widerstand für die Datenleitung beim Verbinden entweder an D+ oder D- gelegt.

Da sich eine USB-Maus in der Regel als Low-Speed-Device anmeldet, soll der Mikrocontroller ebenfalls für Low-Speed konfiguriert werden, indem das LSM-Bit gesetzt wird.

Sowohl der USB-Controller, als auch der USB-Device-Controller verfügen über eine ganze Reihe von Interrupts um auf externe Signale zu reagieren.

Aktuell wird lediglich der VBUS-Interrupt benötigt, da dieser für die Plug-In Erkennung genutzt wird. Dieser Interrupt wird über das VBUSTE-Bit im USBCON-Register aktiviert.

Damit der Mikrocontroller mit dem Bus verbunden werden kann, muss noch das DETACH-Bit im UDCON-Register gelöscht werden. Dadurch wird der ausgewählte Pull-Up Widerstand mit der entsprechenden Datenleitung verbunden und das Gerät wird vom Host erkannt.

Für eine ordnungsgemäße Funktion des USB-Controllers wird ein 48 MHz Takt benötigt. Aus diesem Takt wird der 12 MHz Takt für den Full-Speed, bzw. der 1,5 MHz Takt für den Low-Speed Modus generiert. Der 48 MHz Takt wird mit Hilfe einer internen PLL aus einem externen 8 MHz Quarztakt erzeugt.

Es ist durchaus sinnvoll, dass die PLL erst aktiviert wird, wenn eine Verbindung mit einem Host erkannt wird um die Stromaufnahme des Gerätes bei Nichtbenutzung weiter zu reduzieren. Die PLL wird über das PLLCSR-Register gesteuert und konfiguriert. Bei einem AT90USB1287 muss ein externes 8 MHz Quarz verwendet werden um den USB-Takt zu erzeugen. Weiterhin muss sowohl das PLLP1-, als auch das PLLP0-Bit im PLLCSR-Register gesetzt werden.

Die Konfiguration der PLL erfolgt in der ISR des USB-Controllers, sobald ein VBUS-Interrupt ausgelöst worden ist. 

Da der USB-Controller nur einen gemeinsamen Interruptvektor für alle allgemeinen USB-Interrupts besitzt, muss in der ISR zuerst überprüft werden, ob das VBUSTI-Bit im USBINT-Register gesetzt ist und ob der VBUS-Interrupt überhaupt aktiviert ist.

Anschließend wird das Interruptflag gelöscht und geprüft ob ein Gerät angeschlossen ist, indem das VBUS-Bit im USBSTA-Register abgefragt wird..

Erst wenn alle Bedingungen zutreffen wird die PLL konfiguriert. Dazu wird der Vorteiler über das PLLP1– und das PLLP0-Bit eingestellt und die PLL über das PLLE-Bit aktiviert. Durch die Abfrage des PLOCK-Bits wird gewartet bis die PLL eingeschwungen ist.

Als letztes wird der interne Zustand des USB-Treibers aktualisiert. 

Der Mikrocontroller ist jetzt fertig konfiguriert. Das Programm kann jetzt gestartet und der Mikrocontroller mit einem Host verbunden werden. Beim Einstecken wird allerdings noch nicht so viel passieren, da der Host bisher lediglich erkennt, dass ein Gerät da ist, aber nicht um was für ein Gerät es sich handelt. Daher meldet der Host einen Fehler beim Anfordern einer Gerätebeschreibung.

 

Dieses Problem soll dann in den nächsten Teilen des Tutorials gelöst werden. Doch bevor dieses Thema angegangen werden kann, muss der Kontrollendpunkt des USB-Gerätes initialisiert werden. Dies soll Thema des nächsten Teils des USB-Tutorials sein.

Das komplette Projekt könnt ihr bei GitLab downloaden.

Zurück

Last Updated on

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.