Aus RN-Wissen.de
Wechseln zu: Navigation, Suche


USI (Universal Serial Interface) steht für Universelle serielle Schnittstelle, die vor allem in kleineren Atmel AVR Controllern, wie zB. beim ATTiny2313, aber auch in einigen ATMegas anzutreffen ist.

Wie der Name schon aussagt, kann diese Schnittstelle universell eingestellt werden, um unterschiedliche Funktionen auszuführen. Sie ist hauptsächlich dafür gedacht, verschiedene Arten der seriellen Kommunikation auszuüben.


Hauptfunktionen

Die Hauptfunktionen sind

  • Three-wire Modus, bzw. SPI
  • Two-wire Modus, bzw. TWI oder I2C


Alternative Funktionen

Wenn die Schnittstelle nicht für die serielle Kommunikation verwendet wird, gibt es, wegen der universellen Auslegung, weitere Möglichkeiten, sie trotzdem zu verwenden. Dies wären:

  • Halb-Duplex Asynchrone Datenübertragung
  • 4-Bit Counter (0-15) mit verschiedenen Taktquellen
  • 12-Bit Timer/Counter in Verbindung mit Timer0
  • externer Interrupt, löst bei jeder Flanke aus
  • Software Interrupt, kann durch Setzen in einem USI-Register ausgelöst werden


USI-Register

Hier eine kurze Beschreibung der für den USI Betrieb notwendigen Register

USIDR

USI Data Register, alle 8 bit
Über dieses Register wird direkt auf das serielle Register zugegriffen, ohne Puffer dazwischen, auch während gerade ein Byte übertragen wird, anders als bei echtem TWI !

USISR

USI Status Register
Bit: 7 6 5 4 3 2 1 0
Name: USISIF USIOIF USIPF USIDC USICNT3 USICNT2 USICNT1 USICNT0
Das Statsregister enthält die Interruptflags, den Status der Datenleitungen und den 4-Bit Counter
  • USISIF Startbedingung Interrupt Flag
Bei TWI: Wenn eine Startbedingung erkannt wurde, wird dieses Flag gesetzt, und ein Interrupt ausgelöst falls USISIE im Controlregister gesetzt ist.
Die Taktleitung wird solange gehalten, bis das Flag zurückgesetzt wird, siehe auch Clock Stretching.
Anderer Modus: Bei externer Takquelle wird bei jeder Flanke an USCK dieses Flag gesetzt.
Um das Flag zurückzusetzen muss es gesetzt werden.
  • USIOIF Counter Overflow Interrupt Flag
Wenn der Counter überläuft (15 + 1), wird dieses Flag gesetzt, und ein Interrupt ausgelöst falls USIOIE im Controlregister gesetzt ist.
Bei TWI: Die Taktleitung wird solange gehalten, bis das Flag zurückgesetzt wird, siehe auch Clock Stretching.
Um das Flag zurückzusetzen muss es gesetzt werden.
  • USIPF Stopbedingung Interrupt Flag (nur bei TWI)
Wenn eine Stopbedingung erkannt wurde, wird dieses Flag gesetzt, es kann kein Interrupt generiert werden.
Um das Flag zurückzusetzen muss es gesetzt werden.
  • USIDC Data Output Collision (nur bei TWI)
Tritt auf, wenn gleichzeitg ein anderer Busteilnehmer auf den Bus zugreift (Multimaster).
  • USICNTx Wert des 4-Bit-Zählers
Aktueller Wert des Zählers, kann jederzeit gelesen oder neu beschrieben werden. Zählt bei jeder Flanke (fallend oder steigend) der Taktquelle um eins hoch (siehe USICSx im Controlregister).

USICR

USI Control Register
Bit: 7 6 5 4 3 2 1 0
Name: USISIE USIOIE USIWM1 USIWM0 USICS1 USICS0 USICLK USITC
Im Controlregister wird der Modus eingestellt, Taktquelle ausgewählt und Interruptanforderungen aktiviert
  • USISIE Startbedingung Interrupt ermöglichen (nur bei TWI)
Wenn eine Startbedingung erkannt wurde und global Interrupts erlaubt sind, wird ein Interrupt ausgelöst.
  • USIOIE Counter Overflow Interrupt ermöglichen (nur bei TWI)
Wenn ein Zählerüberlauf aufgetreten ist und global Interrupts erlaubt sind, wird ein Interrupt ausgelöst.
  • USIWMx Modus wählen:
USIWM1 USIWM0 Modus
0 0 kein Modus
PortPins können normal verwendet werden.
0 1 Three-wire Modus, bzw. SPI
Es werden die Pins DO, DI und USCK verwendet.
1 0 TWI für Master und Slave
Es werden die Pins SDA und SCL verwendet.
1 1 TWI für Slave,
Es werden die Pins SDA und SCL verwendet.
Gleicher Modus wie 10 bis auf diese Zusatzfunktion:
Die Taktleitung wird beim Zählerüberlauf gehalten
bis die Software dieses freigibt (USIOIF = 1),
siehe auch Clock Stretching
  • USICSx Taktquelle wählen (in Verbindung mit USICLK):
USICS1 USICS0 USICLK Takquelle
Schieberegister
Taktquelle
Counter
0 0 0 keine Taktquelle keine Taktquelle
0 0 1 Software (USICLK) Software (USICLK)
0 1 X Timer/Counter0 Timer/Counter0
1 0 0 extern, positive Flanke extern, beide Flanken
1 1 0 extern, negative Flanke extern, beide Flanken
1 0 1 extern, positive Flanke Software (USITC)
1 1 1 extern, negative Flanke Software (USITC)
Ist der Timer0 als Taktquelle ausgewählt, kann je nach AVR ein Timerüberlauf oder ein Comparematch den Impuls für das USI-Modul auslösen.
Die Taktleitung SCL muss dabei jeweils per Software umgeschaltet (getoggelt) werden, am einfachsten in einer Timer-ISR USITC setzen.
  • USICLK Clock Strobe
Bei Softwaretakt wird beim Setzen dieses Bits das Schieberegister (USIDR) um ein Bit weitergeschoben und der Counter um eins hochgezählt. Der Ausgang wechselt noch im gleichen CPU-Takt auf den neuen Bitwert.
Bei externer Taktquelle siehe vorhergehende Tabelle für die Verwendung von USICLK.
Das Auslesen von USICLK ergibt immer 0.
  • USITC Toggle Clock Port Pin
Beim Setzen wird der Zustand von USCK/SCL gewechselt (0->1 oder 1->0)
Bei externer Taktquelle (siehe Tabelle bei USICSx) kann der 4-Bit-Zähler um eins hochgezählt werden.
Das Auslesen von USITC ergibt immer 0.


In ganz neuen AVR Tiny Controllern (wie dem ATTiny261, ATTiny24 und ATTiny25) sind weitere Register zu finden:

USIBR

USI Buffer Register, alle 8 bit
Dieses Register kann nur gelesen werden, entspricht aber eigentlich dem USIDR-Register. Es hat den Vorteil, das das letzte empfangene Byte hier gehalten wird, und die zeitliche Abfolge zum Auslesen der Daten aus USIDR nicht mehr so kritisch ist, da z.B. nach einem ACK bei TWI das USIDR schon um ein Bit weitergeschoben wird.

USIPP

USI Pin Position
Bit: 7 6 5 4 3 2 1 0
Name: USIPOS
  • USIPOS USI Pin Position
Es ist möglich, die Datenleitungen auf einen alternativen Port zu legen, wenn dieses Bit gesetzt wird. Die alternative Position ist aber auch festgelegt, man schaltet nur zwischen den Möglichkeiten um.


Quellen

Atmel-AVR-Datenblätter


Siehe auch

Weblinks

  • [1] - Forum-Artikel, in dem eine Bascom-Lib vorgestellt wird, um die Bascom-I2C-Befehle mit dem USI-Modul als Master zu verwenden.
  • [2] - Forum-Artikel, der letztendlich dazu geführt hat diesen Wiki-Artikel zu erstellen. Mit einigen Beispielprogrammen.


--Linux 80 19:19, 18. Nov 2006 (CET)