K |
|||
Zeile 156: | Zeile 156: | ||
* [[RS485]] | * [[RS485]] | ||
* [[RN-Slave ID Übersicht]] | * [[RN-Slave ID Übersicht]] | ||
+ | |||
+ | |||
+ | --[[Benutzer:Linux 80|Linux 80]] 00:52, 6. Jan 2006 (CET) | ||
Version vom 6. Januar 2006, 00:52 Uhr
Inhaltsverzeichnis
Two-wire Serial Interface
Bezeichnung von Atmel für den auf vielen AVR Mega's vorhandenen I2C.
In diesem Artikel soll nur auf Besonderheiten der Atmel Microcontroller eingegangen werden, Einzeilheiten zu I2C finden sich in den entsprechenden Artikeln.
Merkmale
- Master- und Slavemodus
- Multimaster
- 7-Bit Adressierung (als Master möglicherweise auch 10-Bit Adressierung)
- Übertragungsrate von bis zu 400kBit/s
TWI verwenden
Um TWI mit dem AVR verwenden zu können sind einige Einstellungen nötig, die hier, in Abhängigkeit der Anwendung, aufgezeigt werden.
TWI-Register
Hier eine kurze Beschreibung der für den TWI Betrieb notwendigen Register
- TWBR
- Bit Rate Register, alle 8 bit
- dient zum einstellen des Bus-Taktes als Master, siehe Bit Rate Generator
- TWCR
- Control Register
Bit: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Name: | TWINT | TWEA | TWSTA | TWSTO | TWWC | TWEN | ––– | TWIE |
- die Hauptschaltstelle befindet sich hier, für
- aktivieren des TWI-Moduls, Start- und Stopsequenz senden, ACK-Bit senden, Interruptanforderung aktivieren
- TWSR
- Status Register
Bit: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Name: | TWS7 | TWS6 | TWS5 | TWS4 | TWS3 | ––– | TWPS1 | TWPS0 |
- die oberen 5 Bit geben den Status der letzten Aktion wieder
- die zwei niederwertigen Bit zum einstellen des Prescaler als Master, siehe Bit Rate Generator
- TWDR
- Data Register, alle 8 bit
- Beim Senden: nächstes Byte das auf den Bus ausgegeben werden soll
- Beim Empfangen: letztes Byte, das über den Bus gekommen ist
- Die Daten sind gültig, solange das Bit TWINT in TWCR gesetzt ist
- TWAR
- Slave Address Register
Bit: | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Name: | TWA6 | TWA5 | TWA4 | TWA3 | TWA2 | TWA1 | TWA0 | TWGCE |
- Wird der AVR als Slave eingesetzt, wird in den oberen 7 Bit die Adresse eingetragen auf die reagiert werden soll
- als Master ist es unbenutzt
- Setzt man Bit0, kann zusätzlich auf einen General Call reagiert werden
Übertragungsarten
Bei TWI gibt es diese Übertragungsarten
- Master Transmitter (nur senden)
- Master Receiver (senden und empfangen)
- Slave Transmitter (auf abruf senden)
- Slave Receiver (nur empfangen)
Abhängig von der Anwendung, kann der AVR alle Arten der Übertragung im gleichen Programm ausführen.
Master
Ist der AVR Master, bestimmt er was und wie schnell es auf dem I2C-Bus zugeht. (Ausnahme: Clock_Stretching )
Zur Bestimmung der Bus-Geschwindigkeit ist der Bit Rate Generator zuständig.
Bit Rate Generator
Zur Übertragung gibt es die Bitraten Standard, mit bis zu 100kBit/s, und FastMode, mit bis zu 400kBit/s. Der Master muss immer den Takt erzeugen, der bei bedarf auf der Leitung SCL angelegt wird. Der SCL-Takt ist beim AVR abhängig von der CPU-Frequenz, deshalb ist es von Vorteil (im gegensatz zu RS232), wenn man Frequenzen mit geraden Werten verwendet, zB. 8.0 MHz, da sich der Wert besser teilen lässt um auf 100kHz bzw. 400kHz zu kommen.
Im TWI-Modul des AVR gibt es zwei stellen, an denen man die Teilung der Frequenz einstellen kann.
- die Prescaler Bits (TWPS), diese 2 Bits befinden sich im TWI Status Register (TWSR)
- für die genauere Einstellung das TWI Bit Rate Register (TWBR)
Formel zur Berechnung der SCL-Frequenz:
[math]\mathrm{SCL{-}Frequenz = \frac{CPU{-}Frequenz}{16\ +\ 2\ ( TWBR )\ 4 ^ { TWPS } } }[/math]
Da ein AVR zur Zeit max. mit 20MHz getaktet werden kann, ist es nicht nötig den Prescaler zu benutzen, bzw. er wird auf den Teiler 1 gestellt, was keiner Teilung entspricht. Mit diesem Teiler können alle CPU-Frequenzen und TWI-Takte abgedeckt werden.
Mögliche Prescaler Werte:
BitWert | Teiler |
00 | 1 |
01 | 4 |
10 | 16 |
11 | 64 |
Die Werte von TWBR gehen von theoretisch 0 bis 255. Laut Atmel soll der Wert aber mind. 10 Betragen, da es sonst zu Problemen bei der Übertragung kommen kann.
Beispiel Berechnung
Es soll eine SCL-Frequenz von 100kHz erzeugt werden, die CPU-Frequenz beträgt 8.0MHz, der Teiler (Prescaler) ist, wie oben erwähnt, auf 1 (TWPS = 0).
Laut der Formel ergibt das dann:
100kHz = 8.0MHz / (16 + 2 * x * 4^0 ) / 1 fällt weg 100kHz = 8.0MHz / (16 + 2 * x ) / *(16 + 2 * x ) 100kHz * (16 + 2 * x ) = 8000kHz / kürzen / : 100 16 + 2 * x = 80 / -16 2 * x = 64 / :2 x = 32
Ergebnis: Der Wert für TWBR muss 32 sein, damit die SCL-Frequenz 100kHz, bei 8.0MHz CPU-Frequenz, ergibt.
Es Ergibt sich somit Folgende Formel zum Berechnen von TWBR:
[math]\mathrm{TWBR = \frac{ \frac {CPU{-}Frequenz}{SCL{-}Frequenz} - 16}{2}}[/math]
Kommt ein Wert kleiner 10 heraus, sollte eine höhere CPU-Frequenz gewählt werden. Wird eine krumme CPU-Frequenz verwendet was kein Ganzzahliges Ergebnis zur folge hat, kann man mit der 1. Formel überprüfen ob der Wert auf- oder Abgerundet wird. Auf der sicheren Seite ist man, wenn der Wert aufgerundet wird, das entspricht einer grösseren Teilung, also eine geringfügig kleinere Bitrate und liegt deshalb im Standard.
Slave
Um den AVR als Slave zu konfigurieren sind nur diese wenigen Schritte notwendig:
- gewünschte Slaveadresse im Address Register (TWAR) setzen
- im Control Register (TWCR)
- mit TWEN das TWI Modul aktivieren
- mit TWEA das Senden des Bestätigungsbits (ACK) zulassen
anschliessend als Slave
- warten bis im Control Register (TWCR) das Bit TWINT gesetzt ist, welches anzeigt, das auf dem Bus was los ist
- das Status Register (TWSR) abfragen und entsprechend darauf reagieren
Anmerkung zur CPU-Frequenz
Da der Master den Takt vorgibt, muss der Slave nur mit dessen Takt am Bus mitlauschen. Um zu gewährleisten, das der Slave dem Takt folgen kann sollte laut Atmel die CPU-Frequenz des Slave mind. das 16-fache der Bus-Frequenz betragen.
das ergibt folgende Werte
Bus-Frequenz | minimale CPU-Frequenz |
100 kHz | 1,6 MHz |
400 kHz | 6,4 MHz |
Quellen
Atmel Datenblätter
Siehe auch
--Linux 80 00:52, 6. Jan 2006 (CET)