Mehrere i2c Geräte an einem Master

Hallo,

ich versuche gerade mehrere Slaves an einem Master zu verarbeiten. Eine Slave-Adresse mit 8 kann ich an dem Master abrufen.

Wenn ich jetzt aber drei Slave Adressen habe (8,9,10) und will diese am Master nach und nach Abfragen, wie kann ich das machen?

Ich kann im Master lediglich nur ein Wire.begin() angeben..

Jetzt ist die Frage, wie kann ich dies lösen? Brauche irgendwie ein Codebeispiel mit MultiMaster i2c. Gibt es sowas?

Ich kann im Master lediglich nur ein Wire.begin() angeben..

Was hat ein Wire.begin() am Master mit der Slave Adresse zu tun? Nichts!

Am Master kannst du Wire.begin() ohne Adresse verweden. Der Master hat keine Adresse. Nur Slaves haben eine Adresse.

Wenn ich jetzt aber drei Slave Adressen habe (8,9,10) und will diese am Master nach und nach Abfragen, wie kann ich das machen?

In dem du sie nacheinander abfragst! Wie sonst.

Eine Slave-Adresse mit 8 kann ich an dem Master abrufen.

Mit 9 und 10 machst du das genau so! Was hält dich davon ab?

Du könntest dein Master und dein Slave Programm zeigen.......

Ok, jetzt bin ich bisschen verwirrt. Also ich habe die Beispielcodes Master_Writer und Slave_receiver verwendet.

Ok ich sehe schon, habe die falschen Codes verwendet. Ich teste das mal mit Master_reader und Slave_sender.

H75FK: Ok, jetzt bin ich bisschen verwirrt.

Das sehe ich!

H75FK: Also ich habe die Beispielcodes Master_Writer und Slave_receiver verwendet.

Kein Problem. Das kann man durchaus auch auf mehrere Slaves übertragen! Muss dann halt mehrere Adressen verwenden.

H75FK: Ok ich sehe schon, habe die falschen Codes verwendet.

Wieso? Sehe ich nicht unbedingt so! Habe aber auch KA, was du wirklich erreichen willst.

H75FK: Ich teste das mal mit Master_reader und Slave_sender.

Kein Problem. Das kann man durchaus auch auf mehrere Slaves übertragen! Muss dann halt mehrere Adressen verwenden.

Grundsätzlich:

Wenn du Daten an einen Slave senden willst, verwendest du: Master_Writer und Slave_receiver

Wenn du Daten von einem Slave holen willst, dann verwendest du: Master_reader und Slave_sender

Entscheide dich, oder kombiniere beides.

Brauche irgendwie ein Codebeispiel mit MultiMaster i2c.

Mehrere Master in einem I2C Bus... Auch ein Multimaster Betrieb ist möglich, dann können alle ungehindert miteinander quatschen. (dann bitte Vorkehrungen gegen Deadlocks treffen)

Codebeispiele gibts da so nicht.... Warum? Weil da nix besonderes daran ist! Einzig, dass man den WDT aktivieren sollte, ist da ein guter Tipp. Alternativ zum WDT, eine eigene I2C Abhandlung bauen, mit Timeout.

Ok, habe jetzt Master_reader und Slave_sender benutzt. Das einzige Problem ist, der Slave sendet nicht immer eine konstante Anzahl von Bytes. Je nachdem welches Messwert vorliegt, ändert sich auch der Anzahl von demn Bytes. Sprich ich bekomme am Master "56xxxx". Wie bekomme ich nun diese xxxx da weg? Oder kann ich beim Request auch flexible Werte angeben?

Code für Master

Wire.requestFrom(9,6);
while(Wire.avaiblable()){
String+=char(Wire.read());
}

Du kannst im Master auch Felxible Werte angeben also

Wire.requestFrom(9,2); // von Adresse 9 bekomme 2 Bytes
Wire.requestFrom(8,4); // von Adresse 8 bekomme ich 4 Bytes
Wire.requestFrom(7,6); // von Adresse 7 bekomme ich 6 bytes

Du kannst auch in beide Felder Varibalen einbringen

byte Adresse=7;
byte Laenge=2;

Wire.requestFrom(Adresse,Laenge);

Die kannst du dann in deinem Code ändern und hast nur noch eine Abfrage und nicht mehrere. Dies wäre auch der sauberste weg. Gruß DerDani

Soviel ich weiß hat der Master die Adresse 0. Diese braucht beim wire.begin() aber nicht angegeben werden. Grüße Uwe

Soviel ich weiß hat der Master die Adresse 0.

Adresse 0 ist der General Call. Darauf dürfen alle hören, aber keiner antworten.

Alternative: sende die Antwort nichts als String, sondern als Binärwert. Dann ist sie wahrscheinlich konstant breit

Dabei nur beachten dass du im Request Event Handler nur ein einziges mal write() machen kannst! Man kann also entweder ein Byte oder ein Array senden. Multi-Byte Werte kann man einfach mit einer Union aus dem Wert und einem Array senden. Oder man setzt im Event Handler nur ein Flag und sendet den Wert außerhalb des Interrupts.

combie: Adresse 0 ist der General Call. Darauf dürfen alle hören, aber keiner antworten.

Auch was gelernt. Danke Uwe