Bedeutung von cmd-Parameter in write_i2c_block_data


12

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 cmdParameter? 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


Vielleicht möchten Sie definieren, was der cmdParameter 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 ...
Butters

Ok, ich habe den Link zur Dokumentation hinzugefügt (was nicht viel ist)
Gus Smith

6
Ich habe momentan keine Zeit, eine vollständige Antwort zu geben (ich hoffe, jemand wird es tun), aber kurz gesagt - so funktioniert I²C. Der Master kann ihm nur einige Datenbytes senden (nachdem er die richtige Adresse gesendet hat) und es gibt keine Angabe darüber, was diese Bytes tatsächlich sind (ihre Bedeutung wird pro Gerät definiert). Es kommt einfach so vor, dass das erste Byte häufig eine Befehlsnummer (oder Registernummer) ist. Auch muss man immer mindestens ein Byte so anders senden vals, dass cmdes zwingend ist.
Krzysztof Adamski

1
@KrzysztofAdamski Das klingt nach einer ziemlich vollständigen Antwort für mich.
Butters

Antworten:


8

I²CProtokoll 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 der PythonSprache vorliegt, ist die hier verwendete API eine sehr genaue Abbildung der ursprünglichen CAPI, in der Sie optionale Argumente nicht einfach erstellen können.


Dies ist eine etwas längere Erklärung dessen, was ich in dem Kommentar unter der Frage geschrieben habe.
Krzysztof Adamski

Ich bin froh, dass du es getan hast! Diese Arten von einfachen, aber "aha!" erklärungen sind manchmal sehr hilfreich, wie heute :-)
uhoh

3

Wenn Sie einen Block ausgeben, schreiben / lesen Sie vom Pi mit:

bus.write_i2c_block_data(address, 48, [49, 50, 51] )

oder

bus.read_i2c_block_data(address, 48, [49, 50, 51] )

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

bus.read_i2c_block_data

oder

bus.write_i2c_block_data

es schreibt zuerst

cmd

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,

Wire.onReceive(yourCallback)

Funktion aufgerufen wird , da cmdwurde geschrieben von dem Pi auf den Bus. cmdwird 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.


1

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.