Archiv verlassen und diese Seite im Standarddesign anzeigen : I2cslave
svenulm31
27.02.2006, 19:51
Hat hier schon mal jemand mit I2Cslave zu tun gehabt ?
Ich möchte mehrere M8 am I²C anbinden. Alle, außer der Master, sind permanent mit Int0 und Int1 zeitlich fast voll ausgelastet. Ist der I²C Bus an bestimmte Zeiten gebunden (wie zb. RS232)?
Gibt bestimmte Strukturen an die ich mich bei der Programmierung halten sollte oder ist die Datenabfrage und Adressierung willkürlich.
linux_80
27.02.2006, 21:36
Du kannst Dir ja mal TWI angucken, wenns per Hardware geht, muss man eigentlich nur warten bis ein Byte über I2C eintrifft, und anhand des Wertes entscheiden wie's weitergehen soll.
Was wichtig ist, es sollten nicht mehere Geräte gleichzeitig auf den Bus zugreiffen (Buskollision). D.h. der Master sendet Daten und gibt den Bus wieder frei. Der Slave der angesprochen ist übernimmt kurz die Kontrolle
über den Bus und sendet seine Antwort. Danach gibt er den Bus sofort
wieder frei. Alle anderen Slaves halten sich still und lauschen ob ein
Kommando für sie kommt, dürfen aber in dieser Zeit nicht aktiv auf den
Bus zugreifen. Der Bus muss mit 2 Pullup-Widerständen gegen Plus
versehen werden.
---> Wicki IIC
svenulm31
28.02.2006, 08:14
Danke schon mal.
Das heißt die Multimaster Funktion ist wegen der Buskollision nicht zu empfehlen?
Das Programm soll folgendermaßen ablaufen. Der Master füttert alle slave mit Daten und aufgaben nacheinander. Danach gibt er für alle 4? ein Startschuss worauf hin alle gleichzeitig Ihre arbeit beginnen. Im Anschluss gibt jeder Slave sein redy und sein Ergebnis zurück.
Ist das überhaupt möglich über I²C mehrere Slave gleichzeitig anzusprechen(Startschuss) oder sollte ich doch eher ein parallelen Bus verwenden ?
Mfg Sven
Hallo Sven,
mit I2C habe ich bisher noch keine Erfahrung gesammelt. Aber ich mache gerade sowas ähnliches und verwende dazu den SPI-Bus, gut ich brauche noch eine CS Leitung, aber es klappt gut. Für den gemeinsamen Start der Controller nehme ich allerdings noch eine separate Leitung, da die unabhängig vom Bus sein soll, ON/Off. Daten laufen alle über den SPI.
Vielleicht wäre das ja auch eine Möglichkeit für dich den SPI zu verwenden...
Gruß
Sven
svenulm31
28.02.2006, 12:15
Kurz aus MOSI,MISO,SCK,SS+ACK machst du ein gemischten Bus . Das ist auch ne Möglichkeit an die ich schon gedacht hab. Wie läuft es dann mit dem Programmieren? Nimmst du dazu den Bus jedes mal auseinander oder kannst du MOSI,MISO,SCK parallel betreiben?
Ich hab grad gelesen das der I²C Bus Timer0 und Int0 benutzt, was bei meinem Projekt überhaupt nicht geht. Dann bleibt mir wahrscheinlich doch nichts anderes übrig als ein 4 Bit Parallel Bus zu bauen und zu Programmieren.
Wenn Du grössere Distanzen überbrücken willst, so empfehle ich Dir
den RS-485 er Bus.
Allerdings einen seriellen Bus wo alle Slave ***gleichzeitig*** lossenden und du dann noch vernünftige Resultate hast, den gibt es nicht.
Wieso müssen die alle **gleichzeitig** ihre Daten zum master
zurücksenden ?
svenulm31
01.03.2006, 13:08
@ruediw
andersrum der Master füttert die Slave nacheinander mit einer menge Daten und danach gibt er für alle slave gleichzeitig den Startbefehl.
Danach müssen die Slave sich zurückmelden, was zeitversetzt und eher selten gleichzeitig passiert, was zeitlich auch nicht unbedingt relevant ist. Die Rückmeldung erfolgt unter anderen auch mal an einen Slave (deswegen Multimaster)
Distanzen habe ich nur wenige cm.
Was ich vielleicht noch nicht so richtig klar gestellt habe ist folgendes. Die „Slave“ sind zeitlich voll ausgelastet und dürfen während ihrer eigentlichen arbeit nicht durch irgendwelche Protokoll Tätigkeiten behindert werden. Erst nach ihrer arbeit dürfen sie wieder am BUS teilnehmen.
Ich glaube auch ehrlich nicht mehr das mit irgend einem seriellen Bus geht.
Gruß
Sven
voidpointer
01.03.2006, 13:33
der Master füttert die Slave nacheinander mit einer menge Daten und danach gibt er für alle slave gleichzeitig den Startbefehl.
Soweit sollte es funktionieren. Den Startbefehl an alle könnte man per General Call schicken. Dazu werden Daten an die reservierte Adresse 0x00 gesendet, auf die alle Slaves hören sollten.
Danach müssen die Slave sich zurückmelden, was zeitversetzt und eher selten gleichzeitig passiert
Das geht m.E. nicht, weil es bedeutet, dass die Slaves aktiv senden müssen und damit zum Master werden. Dann hättest Du ein Multi-Master-System, was Du ja vermeiden wolltest.
--> Die Slaves dürfen sich nicht aktiv zurückmelden, sondern müssen warten, bis sie gefragt werden. Der Master muss sie pollen, d.h., er muss die Slaves zyklisch abfragen, bis sie eine Antwort senden. Ist ein Slave noch beschäftigt, könnte er den TWI-Interrupt deaktivieren. Der Master würde dann wahrscheinlich ein Timeout bekommen - müsste man ausprobieren.
Soll kein Polling stattfinden, muss man sich einen anderen Weg ausdenken, wie die Slaves dem Master mitteilen können, dass sie fertig sind. Z.B über spezielle Interrupt-Leitungen...
Gruß, Achim.
svenulm31
01.03.2006, 15:08
@ Achim
Den TWI-Interrupt zeitweise zu deaktivieren ist die denkbar einfachste und beste Lösung.
Ist es möglich, dass ich alle µC zu Slave´s deklariere und Sie nur dann zum Master „um Programmiere“ wen Sie was zu sagen haben UND SCL kein Takt mehr hat? Das würde doch eine Buskollision zu 99% ausschließen weil einfach kein Bus mehr da ist oder?
Achso zum Multimaster,,, ich hab nichts dagegen aber bis jetzt keine brauchbaren Quellen gefunden wie er aufgebaut ist.
Gruß Sven
voidpointer
01.03.2006, 15:50
Ist es möglich, dass ich alle µC zu Slave´s deklariere und Sie nur dann zum Master „um Programmiere“ wen Sie was zu sagen haben UND SCL kein Takt mehr hat?
So kompliziert muss man es glaub ich nicht machen. Dann kann man auch gleich ein Multimastersystem aufbauen, zumal ja Buskollisionen voraussichtlich selten sind. Ich habe damit leider keine praktische Erfahrung. Aber mit den Informationen aus dem Datenblatt sollte es sich bauen lassen. Es müssen halt zusätzlich zu den "normalen" Fehlerzuständen auch noch die Kollisionen erkannt werden, um dann entsprechend zu reagieren. Vielleicht suchst Du mal bei mikrocontroller.net in der Codesammlung nach Beispielen.
Gruß, Achim.
svenulm31
01.03.2006, 20:56
Ok ich Danke Euch allen erst mal und werde den Spaß mal testen und Euch bei Erfolg ein paar Zeilen da lassen.
Gruß Sven
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.