i2c repeated start-Frage

Hallo Community,

ich hab schon gegoogelt und hier im Forum gesucht. Ich komm einfach nicht auf den grünen Zweig.

Ich habe 2 Arduinos per i2c verbunden. Ich möchte das Arduino A zum Arduino B einen Befehl sendet. Arduino B antwortet darauf mit einer Antwort.

Damit dem Dialog nicht zwischen gefunkt wird, darf die Kommunikation, nach dem Arduino A gesendet hat, nicht geschlossen werden. Das hab ich schon rausgekriegt. Mein Code sieht in etwa so aus:
Arduino A:

Wire.beginTransmission(address);
Wire.write(command); 
Wire.endTransmission(false); //es wird kein stop gesendet
Wire.requestFrom(address,1);
result = Wire.read();

Meine Frage lautet: Wie muss ich nun den Arduino-Code für die Gegenstelle (also in meinem Fall Arduino B) gestalten?

Dort habe ich im setup() eingerichtet:
Arduino B:

Wire.begin(ID);
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);

Eine Überprüfung mittels Serial.println() zeigt, dass nur in das receiveEvent() auslöst.
Das requestEvent() löst nicht aus. Was natürlich blöd ist, denn Arduino A würde ja gerne etwas lesen, bekommt aber nix.

Was mache ich falsch? Wieso löst der Request nicht aus?

Falls ich es zu rudimentär erklärt habe, sagt mir bitte bescheid.

Grüße!

Was du hier hast ist das hier (zumindest für den Lese Teil):

Aber keine Ahnung wieso der Event nicht auslöst. Probier vielleicht mal testweise den Code von dort.

Was auffällt ist das:

Wire.endTransmission(false);

Ist das das unterbinden der Stop Condition wirklich nötig? Normalerweise hat man die. Vielleicht kommt er dadurch bei der nachfolgenden Anforderung durcheinander.

Der Test von dort verwendet keinen repeated start. Wäre also nicht relevant für mein Problem.

Den Code im Test habe ich probiert, als ich meine ersten Schritte mit der Wire-Bibliothek gemacht habe. Der Code von dort funktioniert :wink:

Das Unterbinden der Stop Condition ist in sofern nötig, damit der Kanal geöffnet bleibt, und kein anderes i2c-Device dazwischen plappern kann.

Laut der Dokumentation ist das nur um dazwischen-plappern von einem anderen Master zu verhindern.

Andere Slaves sind ja schon protokoll-bedingt ruhig, da die nicht adressiert werden. Selbst wenn du an deinem Master noch andere Slaves hast sollte sich da nichts stören.

es ist ein multimaster setup :slight_smile: andere master könnten daher stören.

Was vll. noch wichtig wäre: Ich habe einen Arduino Duemilanove und 2 Arduino nanos im i2c-netz.