PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TWI multimaster implementieren



tranh85bo
27.10.2009, 13:51
Hallo ,zusammen

Ich will eine Multimaster Bus mit TWI (I2C) aufbauen.Ich habe schon bei Mikrokontroller.net und in dieser Forum durchgesucht aber ich habe nur die Implementierung in Bascom gefunden.
http://www.rn-wissen.de/index.php/TWI_Praxis_Multimaster

Die Vorgehenweise in Quellecode habe ich nicht wirklich verstanden. Hast jemand von euch schon in C Multimaster für I2C Bus implementiert ?Könnt ihr mir einen Hinweis geben ?
(Wie muss man implementieren ?
Wie kann man die Konflikte auf dem Bus handeln wenn 2 Master gleichzeitig Daten senden ? mit Kontrollvariable über Statusbus ?)

Jeder Tips ist für mich zurzeit sehr hilfreich weil ich seit Tage im Intenetz gesucht habe.

Ich danke euch im Vorraus.

Mit freundlichen Grüssen

SpiekerChris
27.10.2009, 19:45
Du hast leider nicht geschrieben, mit welcher Hardware du auf den I²C-Bus zugreifst.

Auf dem Bus existieren nur TriState- und Low-Zustände.
1. Startbedingung zum senden von SCL: SCL muss frei sein.
2. Sollten zwei Master Taktgleich anfangen zu senden, so gibt es eine Abbruchbedingung (Arbitration = Schiedsverfahren).
Abbrechen muss der Master, der zuerst ein Low-Signal auf SDA feststellt, dass nicht von ihm beim Senden kommt.

siehe dazu "www.nxp.com/.../design_con_2003_tecforum_i2c_bus_overview.pdf" Seiten 31/38/39


Solltest du dies mit einem AVR tun, so findest du unter dem Stichwort USI (Universal Serial Interface) im Datenblatt die Data-, Status- und Controlregister.

Statusregister (USISR):
• Bit 7 – USISIF: Start Condition Interrupt Flag
• Bit 6 – USIOIF: Counter Overflow Interrupt Flag
• Bit 5 – USIPF: Stop Condition Flag
• Bit 4 – USIDC: Data Output Collision
• Bits 3..0 – USICNT3..0: Counter Value

Control Register (USICR):
• Bit 7 – USISIE: Start Condition Interrupt Enable
• Bit 6 – USIOIE: Counter Overflow Interrupt Enable
• Bit 5..4 – USIWM1..0: Wire Mode
• Bit 3..2 – USICS1..0: Clock Source Select
• Bit 1 – USICLK: Clock Strobe
• Bit 0 – USITC: Toggle Clock Port Pin

Gruß
SpiekerChris

tranh85bo
27.10.2009, 20:20
Hallo, sorry dass ich nicht exakt beschrieben hab.

Ich benutzt ein Atmega 644P (Platin A ) , ein Atmega 128 RN Funk (Platin B ) 4 Motoren und 2 Ultraschallsensoren .Das Platin A sendet die Daten (Drehzahl ) für 4 Motoren . In Platin A wird eine Menge von Daten verarbeitet und am Ende kommen 4 Drehzahlen raus . Das Platin B lesen die Entfernungen von 2 Ultraschallsensoren und filtern die .Danach wird diese Daten ( gefiltert Entfernungen ) zum Platin A übertragen . Im Prinzip kann ich die Ultraschallsensorenwerten in Platin A verarbeiten aber das Platin A ist schon genug belastet .Deswegen habe ich ein extra Platin B vorgesehen .Die beide Platine sind hardwaremäßig mit TWI unterstützt.

Ich will Platin A und Platin B wie Master behandeln und 2 Ultraschallsensoren natürlich als Slaves.Dann ist das ein Multimastersystem.

Ich habe noch eine Frage .Ich glaube , dass man soll nur das Status auf dem Bus lesen und auswerten .Wieso braucht man auch USI zu ziehen?

Vielen Dank

Mit freundlichen Grüssen

SpiekerChris
27.10.2009, 21:12
Die oben beschriebenen Register beziehen sich auf den ATtiny2313.

Beim ATmega644P sieht das wieder etwas anders aus:
>siehe Datenblatt des ATmega644P ab Seite 209 (19. 2-wire Serial Interface).<
http://www.atmel.com/dyn/resources/prod_document/doc8011.pdf
Dort sind die Register TWSR (TWI Status Register) und TWCR (TWI Control Register) getrennt vom USI.

TWSR (TWI Status Register):
• Bits 7:3 – TWS: TWI Status
• Bit 2 – Res: Reserved Bit
• Bits 1:0 – TWPS: TWI Prescaler Bits

TWCR (TWI Control Register):
• Bit 7 – TWINT: TWI Interrupt Flag
• Bit 6 – TWEA: TWI Enable Acknowledge Bit
• Bit 5 – TWSTA: TWI START Condition Bit
• Bit 4 – TWSTO: TWI STOP Condition Bit
• Bit 3 – TWWC: TWI Write Collision Flag
• Bit 2 – TWEN: TWI Enable Bit
• Bit 1 – Res: Reserved Bit
• Bit 0 – TWIE: TWI Interrupt Enable


Beim ATmega128 sieht das wieder etwas anders aus:
>siehe Datenblatt des ATmega128A ab Seite 201 (21. Two-wire Serial Interface)<
http://www.atmel.com/dyn/resources/prod_document/doc8151.pdf
Dort sind die Register TWSR (TWI Status Register) und TWCR (TWI Control Register) wie beim ATmega644P aufgebaut.

In den Datenblättern findest du natürlich auch alle Befehle für die Programmierung in C.

Gruß
SpiekerChris