K (→USICR) |
K (USICR Taktquelle Timer) |
||
Zeile 84: | Zeile 84: | ||
| 0 || 0 || 1 || Software (USICLK) || Software (USICLK) | | 0 || 0 || 1 || Software (USICLK) || Software (USICLK) | ||
|- align="center" | |- align="center" | ||
− | | 0 || 1 || X || Timer/Counter0 | + | | 0 || 1 || X || Timer/Counter0 || Timer/Counter0 |
|- align="center" | |- align="center" | ||
| 1 || 0 || 0 || extern, positive Flanke || extern, beide Flanken | | 1 || 0 || 0 || extern, positive Flanke || extern, beide Flanken | ||
Zeile 95: | Zeile 95: | ||
|} | |} | ||
</div> | </div> | ||
+ | ::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 | :*'''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 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. |
Version vom 26. Dezember 2006, 17:27 Uhr
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. Hauptsächlich gedacht um verschiedene Arten der seriellen Kommunikation auszuüben.
Inhaltsverzeichnis
Hauptfunktionen
Die Hauptfunktionen sind
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) sind zwei 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 zB. 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
Siehe auch
- I2C - Details zu I2C
- TWI - Two-wire Serial Interface
- SPI - Serial Peripheral Interface
- Atmel_AVR310 - Using the USI module as a I2C master
- Atmel_AVR312 - Using the USI module as a I2C slave
Baustelle
An diesem Artikel arbeitet gerade Mitglied Linux_80.
Am besten momentan noch keine gravierenden Ergänzungen / Änderungen vornehmen. Dieser Hinweis verschwindet wenn der Autor soweit ist. Sollte dieser Hinweis länger als drei Tage auf einer Seite sein, bitte beim Autor Linux_80 per PM / Mail oder Forum nachfragen ob er vergessen wurde. |
--Linux 80 19:19, 18. Nov 2006 (CET)