Wenn ich den Übertragungscode vom Slave entferne, funktioniert dies ordnungsgemäß, aber ich muss vom Slave senden.
Hier ist mein Mastercode
#include <Wire.h>
void setup() {
Wire.begin(3);
Wire.onReceive(receiveEvent);
}
byte x = 0;
void loop() {
Wire.beginTransmission(9);
Wire.write("s");
Wire.write(x);
Wire.endTransmission();
x++;
delay(500);
}
void receiveEvent(int howMany) {
if(Wire.available()){
int x = Wire.read();
Serial.println(x);
}
}
Hier ist mein Slave-Code:
#include <Wire.h>
void setup() {
Wire.begin(9); // join i2c bus with address #9
Wire.onReceive(receiveEvent); // register event
Serial.begin(9600); // start serial for output
}
void loop() {
delay(100);
}
void receiveEvent(int howMany) {
if(Wire.available()){
char c = Wire.read();
Serial.print(c);
if(c == 's'){
int x = Wire.read();
Serial.println(x);
//transmit to master
Wire.beginTransmission(3);
Wire.write(1);
Wire.endTransmission();
} else {
Wire.read();
}
}
}
Ist es möglich, Wire.onRequest (requestCallback) nicht zu verwenden? Daten an den Master senden? Freundlich helfen.
arduino-uno
arduino-mega
i2c
avr
Srinivas
quelle
quelle
Antworten:
Um als Master in den Bus einzusteigen, können Sie keine 7-Bit-Slave-Adresse angeben, sodass Ihr Code zwei Slaves enthält.
Unten finden Sie 2 Skizzen, die erfolgreich Daten an einen Slave senden. Ich würde vorschlagen, dass Sie sich das I2C-Protokoll ansehen und verstehen, dass es 4 Modi gibt:
Für jede Kommunikation, unabhängig davon, wie die Daten übertragen werden, ist ein Master erforderlich. Es ist der Master, der die Taktimpulse steuert. Deshalb ist es immer der Master, der die Kommunikation initiiert.
Die MasterReader / MasterWriter- Tutorials im Arduino-Forum sollten jetzt möglicherweise etwas sinnvoller sein, wenn Sie diese Modi verstehen.
Dieser Code zeigt, wie ein Master Daten an einen Slave sendet und wie er dann Daten vom Slave anfordert. Wenn wir diesen Code aus der Sicht des Masters betrachten, können Sie sehen, dass er im Wesentlichen besagt: Senden Sie dieses Byte an den Client (m-> t & s-> r) und fordern Sie dann Daten vom Slave an (m-> r, s-> t)
Hauptkennziffer
Slave-Code
quelle
if(Wire.available() != 0)
da diebytes
Variable die Anzahl der empfangenen Bytes hat. Wenn überhaupt, testen Sie, obbytes > 0
ich jedoch davon ausgehe, dass ein Empfangsereignis mindestens ein Byte haben würde.Ich habe dieses Problem kürzlich durchlaufen. Ihr Slave benötigt zwei Funktionen: eine zum Senden und eine zum Empfangen von Daten.
Hier ist ein Code, der beide Arten der i2c-Kommunikation in einem einzigen Code unterstützt
Senden und Empfangen verschiedener Datentypen über I2C in Arduino
quelle
Es gibt eine Reihe von Problemen mit Ihrem Slave-Code.
Besser wäre:
Sammeln Sie die Antwort und schreiben Sie einmal:
Referenz
Bei I2C - Two-Wire Peripheral Interface - für Arduino gibt es viele Beispiele
quelle