クラス I2C -- 2線式シリアルプロトコル

I2C は、デバイス間通信のための2線式プロトコルです。物理レベルでは、クロックラインである SCL とデータラインである SDA の2本のワイヤで構成されています。

I2C オブジェクトは特定のバスに接続して作成されます。作成時に初期化することも、後で初期化することもできます。

I2Cオブジェクトを print() で表示すると、その設定に関する情報が得られます。

使用例:

from machine import I2C

i2c = I2C(freq=400000)          # ポートに依存して 400kHz の周波数でI2Cペリフェラルを
                                # 作成します。使用するペリフェラルやピンを選択するために
                                # 追加のパラメータが必要になる場合があります

i2c.scan()                      # スレーブをスキャンし、7ビットアドレスのリストを返します

i2c.writeto(42, b'123')         # 7ビットアドレス 42 のスレーブに3バイトを書き込みます
i2c.readfrom(42, 4)             # 7ビットアドレス 42 のスレーブから4バイトを読み込みます

i2c.readfrom_mem(42, 8, 3)      # スレーブ 42 のメモリから、スレーブのメモリアドレス 8 で
                                #   始まる3バイトを読み込みます
i2c.writeto_mem(42, 2, b'\x10') # スレーブ 42 のメモリの、スレーブのメモリアドレス 2 で
                                #   始まるところに2バイトを書き込みます

コンストラクタ

class machine.I2C(id=-1, *, scl, sda, freq=400000)

以下のパラメータを使用して、新しい I2C オブジェクトを構築して返します。

  • id は特定の I2C ペリフェラルを識別します。デフォルト値の -1 は I2C のソフトウェア実装を選択し、(ほとんどの場合) SCL と SDA の任意のピンで動作できます。 id が -1 の場合は sclsda を指定する必要があります。 id に許可されているその他の値は特定のポート/ボードによって異なります。この場合、 sclsda の指定は必須ではなく、許可もされていないこともあります。
  • scl は SCL に使用するピンを指定するピンオブジェクトでなければなりません。
  • sda は SDA に使用するピンを指定するピンオブジェクトです。
  • freq は SCL の最大周波数を設定する整数です。

一般的なメソッド

I2C.init(scl, sda, *, freq=400000)

与えた引数で I2C バスを初期化します。

  • scl は SCL ラインのピンオブジェクトです
  • sda は SDA ラインのピンオブジェクトです
  • freq は SCL のクロックレートです
I2C.deinit()

I2C バスをオフにします。

可用性: WiPy

I2C.scan()

0x08 から 0x77 までのすべてのI2Cアドレスをスキャンし、応答したもののリストを返します。デバイスは、アドレス(書き込みビットを含む)がバスに送信された後に SDA ラインをローに引き下げると応答します。

プリミティブ I2C 操作

以下のメソッドは、プリミティブな I2C マスターのバス操作を実装しており、任意の I2C トランザクションを作成するために組み合わせることができます。標準的なメソッド(下記参照)では足りない制御する必要があるなら、これらのメソッドを使います。

これらのメソッドはソフトウェア I2C でのみ利用できます。

I2C.start()

バス上で START 条件を生成します(SCL がハイの間に SDA がローに遷移します)。

I2C.stop()

バス上で STOP 条件を生成します(SCL がハイの間に SDA がハイに遷移します)。

I2C.readinto(buf, nack=True)

バスからバイト列を読み込んで buf に格納します。読み取るバイト数は buf の長さ分です。ACK は最後のバイトを除くすべてを受信した後にバス上に送信されます。最後のバイトが受信した後、 nack が true の場合は NACK が送信され、それ以外の場合は ACK が送信されます(この場合、スレーブは後の呼び出しでさらにバイトが読み取られると想定します)。

I2C.write(buf)

buf からバスにバイト列を書き込みます。各バイトの後に ACK が受信されたことを確認し、NACK が受信された場合は残りのバイト列の送信を停止します。この関数は受信した ACK の数を返します。

標準バスオペレーション

以下のメソッドは、特定のスレーブデバイスをターゲットとする標準の I2C マスター読取り/書込み操作を実装しています。

I2C.readfrom(addr, nbytes, stop=True)

addr で指定されたスレーブから nbytes 分を読み取ります。 stop が True の場合、転送終了時に STOP 条件が生成されます。読み込んだデータを持つ bytes オブジェクトを返します。

I2C.readfrom_into(addr, buf, stop=True)

addr で指定されたスレーブから buf に読み込みます。読み取られるバイト数は buf の長さ分になります。 stop が True の場合、転送終了時にSTOP条件が生成されます。

このメソッドは None を返します。

I2C.writeto(addr, buf, stop=True)

buf から addr で指定されたスレーブにバイト列を書き込みます。 buf からのバイト列の書き込みに続いて NACK を受信した場合、残りのバイトは送信されません。もし stop が True であれば、たとえ NACK が受信されたとしても、転送の終わりに STOP 条件が生成されます。この関数は受信した ACK の数を返します。

I2C.writevto(addr, vector, stop=True)

vector に指定したバイト列を addr に指定したスレーブに書き込みます。vector はバッファプロトコルを持つオブジェクトのタプルかリストであるべきです。addr が1回送信され、その後 vector 内の各オブジェクトからのバイトを順次書き込みます。vector 内のオブジェクトは長さが0バイトであるかもしれませんが、その場合には出力しません。

vector 内のオブジェクトの1つから、あるバイトの書き込みの後に NACK が受信された場合、残りのバイトおよび残りのオブジェクトは送信されません。 stop が真の場合、たとえ NACK が受信されても、転送の終わりに STOP 条件が生成されます。この関数は受信した ACK の数を返します。

メモリ操作

一部の I2C デバイスは、読み書き可能なメモリデバイス(またはレジスタセット)として機能します。この場合、I2C トランザクションに関連付けられた2つのアドレスがあります。スレーブアドレスとメモリアドレスです。以下のメソッドは、そのようなデバイスと通信するための便利な機能です。

I2C.readfrom_mem(addr, memaddr, nbytes, *, addrsize=8)

addr で指定したスレーブより、 memaddr で指定したメモリアドレスから nbytes 分を読み込みます。引数 addrsize はアドレスサイズをビット数で指定します。この関数は読み込んだデータを持つバイト列オブジェクトを返します。

I2C.readfrom_mem_into(addr, memaddr, buf, *, addrsize=8)

addr で指定したスレーブより、 memaddr で指定したメモリアドレスから buf に読み込みます。読み取られるバイト数は buf の長さです。引数 addrsize はアドレスサイズをビット数で指定します(ESP8266ではこの引数は認識されず、アドレスサイズは常に8ビットです)。

このメソッドは None を返します。

I2C.writeto_mem(addr, memaddr, buf, *, addrsize=8)

addr で指定したスレーブに、 memaddr で指定したメモリアドレスへ buf を書き込みます。引数 addrsize はアドレスサイズをビット数で指定します(ESP8266ではこの引数は認識されず、アドレスサイズは常に8ビットです)。

このメソッドは None を返します。