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

K (Bit Rate Generator)
K (neues Achtung zum prescaler)
 
(28 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
= Two-wire Serial Interface =
+
TWI ('''T'''wo-'''w'''ire Serial '''I'''nterface) ist eine Bezeichnung von [[Atmel|Atmel]] für die auf vielen [[AVR|AVR]] Megas vorhandene  [[I2C|I<sup>2</sup>C]]-Hardware.
  
Bezeichnung von [[Atmel|Atmel]] für den auf vielen [[AVR|AVR]]'s vorhandenen  [[I2C|I<sup>2</sup>C]].
+
In diesem Artikel soll nur auf Besonderheiten der [[AVR]]-[[Microcontroller]] eingegangen werden, Einzelheiten zu [[I2C|I<sup>2</sup>C]] finden sich in den entsprechenden Artikeln.
  
In diesem Artikel soll nur auf Besonderheiten der [[Atmel]] [[Microcontroller]] eingegangen werden, Einzeilheiten zu [[I2C|I<sup>2</sup>C]] finden sich in den entsprechenden Artikeln.
+
 
 +
__TOC__
  
 
= Merkmale =
 
= Merkmale =
Zeile 9: Zeile 10:
 
* Master- und Slavemodus
 
* Master- und Slavemodus
 
* Multimaster
 
* Multimaster
* 7-Bit Adressierung (als Master möglicherweise auch 10-Bit Adressierung)
+
* 7-Bit Adressierung (als Master auch 10-Bit Adressierung möglich)
 
* Übertragungsrate von bis zu 400kBit/s
 
* Ü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 benutzen =
+
== 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|Bit Rate Generator]]
 +
 
 +
==== TWCR ====
 +
:Control Register
 +
<div align="center">{{Registertabelle8BitFix|TWINT|TWEA|TWSTA|TWSTO|TWWC|TWEN|&ndash;|TWIE}}</div>
 +
:die Hauptschaltstelle befindet sich hier,
 +
:*'''TWINT''' TWI Interrupt Flag
 +
::Nach Abarbeitung der letzten Aktion wird dieses Flag gesetzt, und ein Interrupt ausgelöst falls ''TWIE'' gesetzt ist.
 +
::Es sollte anschliessend das Datenregister und das Statusregister ausgelesen werden und darauf entsprechend reagiert werden.
 +
::Um das Flag zurückzusetzen muss es gesetzt werden.
 +
::Mit dem zurücksetzen (löschen) von ''TWINT'' wird die nächste Aktion ausgelöst, es müssen deshalb vorher alle notwendigen Flags und Register (zB. ''TWDR'') entsprechend gesetzt werden.
 +
:*'''TWEA''' TWI Enable Acknowledge Bit
 +
::Sendet ein ACK nach einer Übertragung wenn
 +
:::*als Slave die eigene Slaveadresse (''TWAR'') erkannt wurde,
 +
:::*ein General Call erkannt wurde und das ''TWGCE''-Flag in ''TWAR'' gesetzt ist,
 +
:::*ein ganz normales Byte als Slave oder als Master empfangen wurde.
 +
:*'''TWSTA''' TWI Start Sequenz senden
 +
::Die TWI-Hardware überprüft ob der Bus frei ist, und gibt die Startsequenz aus.
 +
::Ist der Bus nicht frei, wartet das TWI-Modul bis eine Stopsequenz erkannt wurde und sendet die Startsequenz erneut.
 +
::Dieses Flag muss per Software wieder gelöscht werden.
 +
:*'''TWSTO''' TWI Stop Sequenz senden
 +
::Als Master wird durch setzen eine Stopsequenz ausgegeben. Ist die Stopsequenz gesendet wird das Flag automatisch gelöscht.
 +
::Als Slave kann dieses Flag zum zurücksetzen nach einem Fehler verwendet werden. Es wird keine Stopsequenz ausgegeben, aber das Modul beeinflusst anschliessend nicht mehr die Leitungen SCL oder SDA, das TWI-Modul befindet sich in einem definierten unadressierten Zustand.
 +
:*'''TWWC''' TWI Write Collision Flag
 +
::In das Datenregister ''TWDR'' sollte man nur schreiben, wenn ''TWINT'' High ist, ist ''TWINT'' Low, wird dieses Flag gesetzt und zeigt einen Fehler an.
 +
:*'''TWEN''' TWI Enable
 +
::Aktivieren des TWI-Moduls. Das TWI-Modul übernimmt u.a. die Steuerung über die Leitungen SCL und SDA.
 +
:*'''TWIE''' TWI Interrupt Anforderung erlauben
 +
::Interruptanforderung aktivieren, wenn eine Aktion durchgeführt wurde und global Interrupts erlaubt sind, wird ein Interrupt ausgelöst.
 +
 
 +
==== TWSR ====
 +
:Status Register
 +
<div align="center">{{Registertabelle8BitFix|TWS7|TWS6|TWS5|TWS4|TWS3|&ndash;|TWPS1|TWPS0}}</div>
 +
:*'''TWSx''' TWI Status
 +
::die oberen 5 Bit geben den Status der letzten Aktion wieder
 +
:*'''TWPSx''' TWI Prescaler
 +
::die zwei niederwertigen Bit zum einstellen des Prescaler als Master, siehe [[#Bit_Rate_Generator|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
 +
<div align="center">{{Registertabelle8BitFix|TWA6|TWA5|TWA4|TWA3|TWA2|TWA1|TWA0|TWGCE}}</div>
 +
:*'''TWAx''' Slave Adresse
 +
::Wird der [[AVR]] als Slave eingesetzt, wird in den oberen 7 Bit die Adresse eingetragen, auf die reagiert werden soll.
 +
:*'''TWGCE''' General Call Enable
 +
::Setzt man Bit0, kann zusätzlich auf einen ''General Call'' reagiert werden.
 +
:als Master ist es unbenutzt
 +
 
 +
==== TWAMR ====
 +
:Slave Address Mask Register
 +
:Zus&auml;tzlich zu den schon geannten Registern, kann es bei einigen ATMegas, wie dem [[ATMega168]], dieses Register geben, in der Regel hat es aber den Standardwert von $00, wobei sich das TWI-Modul verh&auml;lt wie bei den anderen ATMegas.
 +
:Mit dem setzen von einzelnen Bits werden beim vergleich der Slaveadresse (die vom Master gesendet wurde) mit ''TWAR'' diese Bits ausmaskiert, dH. treffen immer zu, was bedeutet, dass der ATMega auf mehr als nur einer bestimmten Slaveadresse (''TWAR'') angesprochen werden kann.
 +
:Werden zB. alle Bits gesetzt, fühlt sich der [[AVR]] immer angesprochen, egal welche Slaveadresse über den Bus gesendet wurde.
 +
<div align="center">{{Registertabelle8BitFix|TWAM6|TWAM5|TWAM4|TWAM3|TWAM2|TWAM1|TWAM0|&ndash;}}</div>
 +
:Wird der [[AVR]] als Slave eingesetzt, kann in den oberen 7 Bit die Adressmaske eingetragen werden,
 +
:als Master ist es unbenutzt
 +
 
 +
== Übertragungsarten ==
 +
Bei TWI gibt es diese Übertragungsarten
 +
* Master Transmitter (nur Senden)
 +
* Master Receiver (nur 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 ==
 
== Master ==
 +
Ist der AVR Master, bestimmt er was und wie schnell es auf dem [[I2C|I<sup>2</sup>C]]-Bus zugeht. (Ausnahme: [[Clock_Stretching]] )
 +
 +
Zur Bestimmung der Bus-Geschwindigkeit ist der ''Bit Rate Generator'' zuständig.
  
 
=== Bit Rate Generator ===
 
=== Bit Rate Generator ===
 
Zur Übertragung gibt es die Bitraten ''Standard'', mit bis zu 100kBit/s, und ''FastMode'', mit bis zu 400kBit/s.
 
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 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.
+
Der SCL-Takt ist beim AVR abhängig von der CPU-Frequenz.
 +
Da [[I2C]], im Gegensatz zu [[RS232]], ein synchrones Protokoll ist, das mit dem Taktsignal SCL arbeitet, muss man nicht exakt auf eine Frequenz von 100kHz bzw. 400kHz kommen.
  
Im TWI-Modul des AVR gibt es zwei stellen, an denen man die Teilung der Frequenz einstellen kann.
+
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)
 
* 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)
 
* für die genauere Einstellung das ''TWI Bit Rate Register'' (TWBR)
Zeile 28: Zeile 108:
 
'''Formel zur Berechnung der SCL-Frequenz:'''
 
'''Formel zur Berechnung der SCL-Frequenz:'''
 
<div align="center">
 
<div align="center">
<math>\mathrm{SCL{-}Frequenz =  \frac{CPU{-}Frequenz}{16\ +\ 2\ ( TWBR )\ 4 ^ { TWPS } } }</math>
+
<math>\mathrm{SCL{-}Frequenz =  \frac{CPU{-}Frequenz}{16 + 2 \cdot TWBR \cdot 4^{TWPS} } }</math>
 
</div>
 
</div>
  
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.
+
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:'''
 
 
<div align="center">
 
<div align="center">
 
{| {{Blauetabelle}}
 
{| {{Blauetabelle}}
|'''BitWert'''
+
|+ '''Mögliche&nbsp;Prescaler-Werte'''
|'''Teiler'''
+
|- {{Hintergrund1}}
|-
+
!| Bit-Wert || Teiler
|00
+
|- align="center"
|1
+
|00 ||1
|-
+
|- align="center"
|01
+
|01 ||4
|4
+
|- align="center"
|-
+
|10 ||16
|10
+
|- align="center"
|16
+
|11 ||64
|-
+
|11
+
|64
+
 
|}
 
|}
 
</div>
 
</div>
 
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.
 
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 Ergibt sich somit folgende Formel zum Berechnen von TWBR:'''
 +
<div align="center">
 +
<math>\mathrm{TWBR = \frac{ \frac {CPU{-}Frequenz}{SCL{-}Frequenz} - 16}{2 \cdot 4^{TWPS} }}</math>
 +
</div>
  
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).
+
'''Achtung!''' In der Formel bei TWPS den Bitwert 0..3 einsetzen!
  
Laut der Formel ergibt das dann:
+
Kommt ein Wert kleiner 10 heraus, kann ein höherer CPU-Takt gewählt werden, oder falls das nicht möglich ist, wird der Bus mit einem geringeren Takt betrieben, was trotzdem innerhalb der Spezifikation liegt. Wird eine krumme CPU-Frequenz verwendet, die kein ganzzahliges Ergebnis zur Folge hat, kann man mit der ersten 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.
<pre>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
+
</pre>
+
'''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:'''
+
== 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, daß 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, daß der Slave dem Takt folgen kann sollte laut [[Atmel]] die CPU-Frequenz eines ATMega-Slave mind. das 16-fache der Bus-Frequenz betragen.
 +
 
 +
das ergibt folgende Werte :
 
<div align="center">
 
<div align="center">
<math>\mathrm{TWBR = \frac{ \frac {CPU{-}Frequenz}{SCL{-}Frequenz} - 16}{2}}</math>
+
{| {{Blauetabelle}}
 +
|- {{Hintergrund1}}
 +
!| Bus-Frequenz || minimale CPU-Frequenz
 +
|-
 +
|100 kHz || 1,6 MHz
 +
|-
 +
|400 kHz || 6,4 MHz
 +
|}
 
</div>
 
</div>
 
Kommt ein Wert kleiner 10 heraus, sollte eine höhere CPU-Frequenz gewählt werden.
 
  
 
= Quellen =
 
= Quellen =
Atmel Datenblätter
+
[http://www.atmel.com/dyn/products/devices.asp?family_id=607 Atmel-AVR-Datenblätter]
  
 
= Siehe auch =
 
= Siehe auch =
* [[I2C|I<sup>2</sup>C]]
+
* [[I2C|I<sup>2</sup>C]] - Details zu I2C
* [[RS232]]
+
* [[RS232]] - serielle Schnittstelle
* [[RS485]]
+
* [[RS485]] - serieller (asynchroner) Bus
 +
* [[TWI Praxis]] - Programmbeispiele
 +
* [[TWI_Slave_mit_avr-gcc|TWI-Slave mit avr-gcc]]
 +
* [[USI (Avr)]] - USI Modul mit dem TWI nachgebildet werden kann, ist bei den meisten ATTinys und einigen ATMegas vorhanden.
 +
* [[RN-Slave ID Übersicht]]
 +
 
 +
 
 +
--[[Benutzer:Linux 80|Linux 80]] 00:52, 6. Jan 2006 (CET)
  
  
 
[[Kategorie:Abkürzung]]
 
[[Kategorie:Abkürzung]]
 
[[Kategorie:Grundlagen]]
 
[[Kategorie:Grundlagen]]
 +
[[Kategorie:Kommunikation]]
 
[[Kategorie:Microcontroller]]
 
[[Kategorie:Microcontroller]]
 
[[Kategorie:Elektronik]]
 
[[Kategorie:Elektronik]]
 +
[[Kategorie:Praxis]]

Aktuelle Version vom 15. Februar 2020, 02:04 Uhr

TWI (Two-wire Serial Interface) ist eine Bezeichnung von Atmel für die auf vielen AVR Megas vorhandene I2C-Hardware.

In diesem Artikel soll nur auf Besonderheiten der AVR-Microcontroller eingegangen werden, Einzelheiten zu I2C finden sich in den entsprechenden Artikeln.


Merkmale

  • Master- und Slavemodus
  • Multimaster
  • 7-Bit Adressierung (als Master auch 10-Bit Adressierung möglich)
  • Ü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,
  • TWINT TWI Interrupt Flag
Nach Abarbeitung der letzten Aktion wird dieses Flag gesetzt, und ein Interrupt ausgelöst falls TWIE gesetzt ist.
Es sollte anschliessend das Datenregister und das Statusregister ausgelesen werden und darauf entsprechend reagiert werden.
Um das Flag zurückzusetzen muss es gesetzt werden.
Mit dem zurücksetzen (löschen) von TWINT wird die nächste Aktion ausgelöst, es müssen deshalb vorher alle notwendigen Flags und Register (zB. TWDR) entsprechend gesetzt werden.
  • TWEA TWI Enable Acknowledge Bit
Sendet ein ACK nach einer Übertragung wenn
  • als Slave die eigene Slaveadresse (TWAR) erkannt wurde,
  • ein General Call erkannt wurde und das TWGCE-Flag in TWAR gesetzt ist,
  • ein ganz normales Byte als Slave oder als Master empfangen wurde.
  • TWSTA TWI Start Sequenz senden
Die TWI-Hardware überprüft ob der Bus frei ist, und gibt die Startsequenz aus.
Ist der Bus nicht frei, wartet das TWI-Modul bis eine Stopsequenz erkannt wurde und sendet die Startsequenz erneut.
Dieses Flag muss per Software wieder gelöscht werden.
  • TWSTO TWI Stop Sequenz senden
Als Master wird durch setzen eine Stopsequenz ausgegeben. Ist die Stopsequenz gesendet wird das Flag automatisch gelöscht.
Als Slave kann dieses Flag zum zurücksetzen nach einem Fehler verwendet werden. Es wird keine Stopsequenz ausgegeben, aber das Modul beeinflusst anschliessend nicht mehr die Leitungen SCL oder SDA, das TWI-Modul befindet sich in einem definierten unadressierten Zustand.
  • TWWC TWI Write Collision Flag
In das Datenregister TWDR sollte man nur schreiben, wenn TWINT High ist, ist TWINT Low, wird dieses Flag gesetzt und zeigt einen Fehler an.
  • TWEN TWI Enable
Aktivieren des TWI-Moduls. Das TWI-Modul übernimmt u.a. die Steuerung über die Leitungen SCL und SDA.
  • TWIE TWI Interrupt Anforderung erlauben
Interruptanforderung aktivieren, wenn eine Aktion durchgeführt wurde und global Interrupts erlaubt sind, wird ein Interrupt ausgelöst.

TWSR

Status Register
Bit: 7 6 5 4 3 2 1 0
Name: TWS7 TWS6 TWS5 TWS4 TWS3 TWPS1 TWPS0
  • TWSx TWI Status
die oberen 5 Bit geben den Status der letzten Aktion wieder
  • TWPSx TWI Prescaler
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
  • TWAx Slave Adresse
Wird der AVR als Slave eingesetzt, wird in den oberen 7 Bit die Adresse eingetragen, auf die reagiert werden soll.
  • TWGCE General Call Enable
Setzt man Bit0, kann zusätzlich auf einen General Call reagiert werden.
als Master ist es unbenutzt

TWAMR

Slave Address Mask Register
Zusätzlich zu den schon geannten Registern, kann es bei einigen ATMegas, wie dem ATMega168, dieses Register geben, in der Regel hat es aber den Standardwert von $00, wobei sich das TWI-Modul verhält wie bei den anderen ATMegas.
Mit dem setzen von einzelnen Bits werden beim vergleich der Slaveadresse (die vom Master gesendet wurde) mit TWAR diese Bits ausmaskiert, dH. treffen immer zu, was bedeutet, dass der ATMega auf mehr als nur einer bestimmten Slaveadresse (TWAR) angesprochen werden kann.
Werden zB. alle Bits gesetzt, fühlt sich der AVR immer angesprochen, egal welche Slaveadresse über den Bus gesendet wurde.
Bit: 7 6 5 4 3 2 1 0
Name: TWAM6 TWAM5 TWAM4 TWAM3 TWAM2 TWAM1 TWAM0
Wird der AVR als Slave eingesetzt, kann in den oberen 7 Bit die Adressmaske eingetragen werden,
als Master ist es unbenutzt

Übertragungsarten

Bei TWI gibt es diese Übertragungsarten

  • Master Transmitter (nur Senden)
  • Master Receiver (nur 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. Da I2C, im Gegensatz zu RS232, ein synchrones Protokoll ist, das mit dem Taktsignal SCL arbeitet, muss man nicht exakt auf eine Frequenz von 100kHz bzw. 400kHz 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 \cdot TWBR \cdot 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
Bit-Wert 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.

Es Ergibt sich somit folgende Formel zum Berechnen von TWBR:

[math]\mathrm{TWBR = \frac{ \frac {CPU{-}Frequenz}{SCL{-}Frequenz} - 16}{2 \cdot 4^{TWPS} }}[/math]

Achtung! In der Formel bei TWPS den Bitwert 0..3 einsetzen!

Kommt ein Wert kleiner 10 heraus, kann ein höherer CPU-Takt gewählt werden, oder falls das nicht möglich ist, wird der Bus mit einem geringeren Takt betrieben, was trotzdem innerhalb der Spezifikation liegt. Wird eine krumme CPU-Frequenz verwendet, die kein ganzzahliges Ergebnis zur Folge hat, kann man mit der ersten 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, daß 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, daß der Slave dem Takt folgen kann sollte laut Atmel die CPU-Frequenz eines ATMega-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-AVR-Datenblätter

Siehe auch


--Linux 80 00:52, 6. Jan 2006 (CET)


LiFePO4 Speicher Test