write_i2c_block_dataのcmdパラメーターの意味


12

PiとArduinoの間のi2c通信をテストしています。

文書によると:

write_i2c_block_data(addr,cmd,vals)  Block Write transaction.    int addr,char cmd,long[]    None

私はこのテストを持っています:

Piで:

import smbus
bus = smbus.SMBus(0)
bus.write_i2c_block_data(address, 48, [49, 50, 51] )

Arduinoの場合:

void receiveData(int byteCount){
    Serial.print("byte count=");
    Serial.println(byteCount);

    while(Wire.available()) {
        number = Wire.read();
        Serial.print((char)number);
     }
}

Arduinoには次の出力が表示されます。

byte count=4
0123

私の質問は、cmdパラメーターの使用は何ですか?どのバイトが何を表しているのか、Arduinoで区別されません。
私はそれを適切に扱うことができると思います。最初の2バイトをコマンドとして使用したいのかもしれません。

このページには、メソッドに関する多くの情報がありません:http : //wiki.erazor-zone.de/wiki : linux : python : smbus : doc


cmdパラメータが何であるかを定義したい場合があります。答えが見つかりませんでした... GPIOエクスパンダーなどの特定のチップでのみ使用できます
...-バター

OK、ドキュメントへのリンクを追加しました(それほどではありません)
ガススミス

6
今すぐ完全な回答をする時間はありませんが(誰かがそうすることを望みます)、要するに-これがI²Cの仕組みです。マスターは(適切なアドレスを送信した後)数バイトのデータを送信するだけでよく、それらのバイトが実際に何であるかについての仕様はありません(その意味はデバイスごとに定義されます)。最初のバイトがコマンド(またはレジスタ)番号であることがよくあります。また、少なくとも1バイトを送信する必要があるため、valscmdは異なり、必須です。
クシシュトフアダムスキー

1
@KrzysztofAdamskiそれは私にとってかなり完全な答えのように聞こえます。
バター

回答:


8

I²Cプロトコルは非常に簡単です。実際には、ネットワークを介して送信されるデータ構造は定義されていません。フレームは、スレーブアドレス(マスターが読み取りまたは書き込みを希望するかどうかを示す方向ビット付き)および(書き込みの場合)データのバイトで構成されます。0バイトのデータで書き込みを開始しても意味がないため、最初のバイトは必須です。

この最初のバイトは、多くの場合、スレーブレジスタアドレスまたはコマンド番号として使用されますが、必須ではありません。最初のバイトの後に追加のバイトがある場合とない場合があります。各バイトの意味を定義する上位レベルのプロトコルはデバイス固有です。

これは、2つの別個の引数がある理由を説明するかもしれません-最初の引数(cmd)は必須で、2番目の引数(vals)はオプションです。あなたの例はPython言語ですが、ここで使用されているCAPIは、オプションの引数を簡単に作成できない元のAPIに実際に非常に近いマッピングです。


これは、質問の下のコメントで私が書いたことのもう少し長い説明です。
クシシュトフアダムスキー

あなたがしたことがうれしいです!この種のシンプルでありながら、「あは!」説明は、今日のように本当に役立つことがあります:-)
uhoh

3

Piからブロックの書き込み/読み取りを発行する場合:

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

または

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

読み取りまたは書き込みに応じて、Arduinoで2つのことが起こります(できます)。

cmdバイトは、PiからI2Cバスに書き込まれる最初のバイトであり、常に「書き込み」要求として送信されます。これは、Piが

bus.read_i2c_block_data

または

bus.write_i2c_block_data

最初に書く

cmd

読み取るにI2Cバス

一部のI2Cハードウェアは、読み取りを行う前に初期化を必要とするため、これは便利な機能です。

Arduinoでは、次のことを意味します。

まず、

Wire.onReceive(yourCallback)

Piによってバスcmd書き込まれたため、関数が呼び出さます。 cmdバスで利用可能な最初のバイトになります。Piが書き込み要求を送信した場合、Arduinoは関数が完了するまでWire.onReceiveコールバックに留まります。Piが読み取り要求を送信した場合、ArduinoはWire.onReceiveを完了してからWire.onRequestコールバックを呼び出します。

値を適切に処理することにより、cmdに配置された値がシステムで意図しない動作を引き起こさないようにする必要があります。たとえば、Wire.read = 0x30のときにWire.onReceiveコールバックがLEDをオフにする場合。次に、読み取り要求を送信した場合でも、最初に0x30を書き込むことでLEDをオフにしてから、要求されたバイトをバスから読み取ります。


1

I2C LCD、Newhaven NHD‐0216K3Z‐FL‐GBW‐V3に書き込みます。そのスペックシートはグーグルで検索できます。その場合、コマンドバイトが0xfeの場合、次のバイトがコマンドであることを意味します-約20個あります。クリア、バックライト、カーソルの点滅など。cmdが0xfeでない場合、表示するのは単なる文字です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.