Ich teste die i2c-Kommunikation zwischen Pi und Arduino.
Der Arzt sagt:
write_i2c_block_data(addr,cmd,vals) Block Write transaction. int addr,char cmd,long[] None
Ich habe diesen Test:
Auf Pi:
import smbus
bus = smbus.SMBus(0)
bus.write_i2c_block_data(address, 48, [49, 50, 51] )
Auf Arduino:
void receiveData(int byteCount){
Serial.print("byte count=");
Serial.println(byteCount);
while(Wire.available()) {
number = Wire.read();
Serial.print((char)number);
}
}
Auf dem Arduino sehe ich diese Ausgabe:
byte count=4
0123
Meine Frage ist: Wozu dient der cmd
Parameter? Ich sehe keinen Unterschied auf dem Arduino, von welchem Byte was repräsentiert.
Ich schätze, ich kann es nach Belieben angehen. Vielleicht möchte ich die ersten 2 Bytes als Befehl verwenden.
Diese Seite enthält nicht viele Informationen zur Methode: http://wiki.erazor-zone.de/wiki:linux:python:smbus:doc
cmd
Parameter ist ... Ich musste einiges tun, um herauszufinden, was Sie meinten. Ich habe jedoch keine Antwort gefunden ... Es kann nur von bestimmten Chips wie einem GPIO-Expander oder etwas verwendet werden ...vals
, dasscmd
es zwingend ist.Antworten:
I²C
Protokoll ist sehr einfach. Es definiert nicht wirklich Datenstrukturen, die über die Leitung gesendet werden. Der Rahmen besteht aus einer Slave-Adresse (wobei das Richtungsbit angibt, ob der Master lesen oder schreiben möchte) und (beim Schreiben) einigen Datenbytes. Da es keinen Sinn macht, das Schreiben mit 0 Datenbytes zu starten, ist das erste Byte obligatorisch.Dieses erste Byte wird häufig als Slave-Registeradresse oder Befehlsnummer verwendet, muss aber nicht. Nach dem ersten Byte können zusätzliche Bytes vorhanden sein oder nicht. Das übergeordnete Protokoll, das definiert, was jedes Byte bedeutet, ist gerätespezifisch.
Dies erklärt möglicherweise, warum es zwei separate Argumente gibt - das erste (
cmd
) ist obligatorisch und das zweite (vals
) ist optional. Während Ihr Beispiel in derPython
Sprache vorliegt, ist die hier verwendete API eine sehr genaue Abbildung der ursprünglichenC
API, in der Sie optionale Argumente nicht einfach erstellen können.quelle
Wenn Sie einen Block ausgeben, schreiben / lesen Sie vom Pi mit:
oder
Zwei Dinge können auf dem Arduino passieren, abhängig von Lesen oder Schreiben.
Das Cmd-Byte ist das erste Byte, das vom Pi auf den I2C-Bus geschrieben wird. Es wird immer als "Write" -Anforderung gesendet. Dies bedeutet, dass, wenn der Pi ein ausgibt
oder
es schreibt zuerst
auf den I2C-Bus, bevor es liest .
Dies ist eine nützliche Funktion, da einige I2C-Hardwarekomponenten erst initialisiert werden müssen, bevor ein Lesevorgang durchgeführt werden kann.
Auf dem Arduino bedeutet dies, dass:
Zuerst die,
Funktion aufgerufen wird , da
cmd
wurde geschrieben von dem Pi auf den Bus.cmd
wird das erste Byte im Bus sein. Wenn der Pi eine Schreibanforderung gesendet hat, bleibt der Arduino im Wire.onReceive-Rückruf, bis die Funktion abgeschlossen ist. Wenn der Pi eine Leseanforderung gesendet hat, vervollständigt der Arduino die Wire.onReceive und ruft dann den Wire.onRequest-Rückruf auf.Sie müssen sicherstellen, dass der in cmd angegebene Wert kein unbeabsichtigtes Verhalten in Ihrem System verursacht, indem Sie seinen Wert entsprechend behandeln. Wenn zum Beispiel Ihr Wire.onReceive-Rückruf eine LED ausschaltet, wenn Wire.read = 0x30 ist. Dann , auch wenn Sie eine gesendete Leseanforderung, wäre es zunächst schalten Sie die LED durch das Schreiben 0x30 dann wäre es die angeforderten Bytes aus dem Bus zu lesen.
quelle
Ich schreibe auf ein I2C-LCD, das Newhaven NHD-0216K3Z-FL-GBW-V3. Das Datenblatt kann gegoogelt werden. Wenn das Befehlsbyte 0xfe ist, bedeutet dies, dass das folgende Byte ein Befehl ist - es gibt ungefähr 20 von ihnen. Löschen, Hintergrundbeleuchtung, Cursor blinken und so weiter. Wenn cmd nicht 0xfe ist, ist es nur ein Zeichen, das angezeigt werden soll.
quelle