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

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

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

サンプルコード:

from pyb import I2C

i2c = I2C(1)                             # バス 1 に作成
i2c = I2C(1, I2C.CONTROLLER)             # コントローラとして作成・初期化
i2c.init(I2C.CONTROLLER, baudrate=20000) # コントローラとして初期化
i2c.init(I2C.PERIPHERAL, addr=0x42)      # 指定したアドレスでペリフェラルとして初期化
i2c.deinit()                             # ペリフェラルをオフ

i2c オブジェクトを印字すると、その構成に関する情報が得られます。

基本的なメソッドは send と recv です:

i2c.send('abc')      # 3 バイト送信
i2c.send(0x42)       # 数値で指定の 1 バイトを送信
data = i2c.recv(3)   # 3 バイト受信

指定場所に受信するには、まず bytearray を作成します::"

data = bytearray(3)  # バッファを作成
i2c.recv(data)       # 3 バイト受信し、それを data に書き込む

タイムアウト時間を指定できます(ms 単位):

i2c.send(b'123', timeout=2000)   # 2秒後にタイムアウト

コントローラは受信側のアドレスを指定する必要があります:

i2c.init(I2C.CONTROLLER)
i2c.send('123', 0x42)        # ペリフェラルアドレス 0x42 に 3 バイト送信
i2c.send(b'456', addr=0x42)  # アドレスをキーワード引数で指定

コントローラには他にもメソッドがあります:

i2c.is_ready(0x42)           # ペリフェラル 0x42 の準備ができているか確認
i2c.scan()                   # バスのペリフェラルをスキャンし、
                             #   有効なアドレスのリストを戻す
i2c.mem_read(3, 0x42, 2)     # ペリフェラル 0x42 のメモリから、ペリフェラル上の
                             #   アドレス 2 で始まる 3 バイトを読み込む
i2c.mem_write('abc', 0x42, 2, timeout=1000) # 'abc' (3 バイト)をペリフェラル 0x42 のメモリの、
                             #   ペリフェラル上のアドレス 2 から書き込む。1 秒後にタイムアウト

コンストラクタ

class pyb.I2C(bus, ...)

指定したバスで I2C オブジェクトを構築します。 bus は 1 または 2、 'X' または 'Y' を指定できます。追加のパラメーター無しだと、I2C オブジェクトは作成されますが、初期化されません(以前にバスが初期化さえていれば、その設定を引継ぎます)。追加の引数を指定すると、バスが初期化されます。初期化のパラメータは init を参照してください。

Pyboards V1.0 および V1.1 の I2C バスの物理ピンは次のとおりです。

  • I2C(1) は X 位置にあります: (SCL, SDA) = (X9, X10) = (PB6, PB7)
  • I2C(2) は Y 位置にあります: (SCL, SDA) = (Y9, Y10) = (PB10, PB11)

Pyboard Lite の場合:

  • I2C(1) は X 位置にあります: (SCL, SDA) = (X9, X10) = (PB6, PB7)
  • I2C(3) は Y 位置にあります: (SCL, SDA) = (Y9, Y10) = (PA8, PB8)

'X' または 'Y' でコンストラクターを呼び出すと、Pyboard タイプ間の移植性が高まります

メソッド

I2C.deinit()

I2C バスをオフにします。

I2C.init(mode, *, addr=0x12, baudrate=400000, gencall=False, dma=False)

指定のパラメータで I2C バスを初期化します:

  • modeI2C.CONTROLLERI2C.PERIPHERAL のいずれかでなければなりません
  • addr は 7 ビットアドレスです(ペリフェラル時のみ有効)
  • baudrate は SCL クロックレートです(コントローラ時のみ有効)
  • gencall は汎用呼出しモードをサポートするかどうかを指定します
  • dma は I2C 転送に DMA の使用を許可するかどうかを指定します(DMA 転送のタイミングはより正確ですが、現在のところバスエラーを適切に処理しないことに注意してください)
I2C.is_ready(addr)

I2C デバイスが指定のアドレスに応答するかどうかを確認します。コントローラモードの場合のみ有効です。

I2C.mem_read(data, addr, memaddr, *, timeout=5000, addr_size=8)

I2C デバイスのメモリから読み取ります:

  • data には整数(読み取るバイト数)または読み込むバッファを指定します
  • addr は I2C デバイスアドレスです
  • memaddr は I2C デバイス中のメモリ位置です
  • timeout は読み取りを待つタイムアウト時間をミリ秒単位で指定します
  • addr_size は memaddr の幅であり、8 または 16 を指定します

読み取ったデータを返します。これはコントローラモードでのみ有効です。

I2C.mem_write(data, addr, memaddr, *, timeout=5000, addr_size=8)

I2C デバイスのメモリに書き込みます:

  • data には整数または書き込み元のバッファを指定します
  • addr は I2C デバイスアドレスです
  • memaddr は I2C デバイス中のメモリ位置です
  • timeout は書き込み待つタイムアウト時間をミリ秒単位で指定します
  • addr_size は memaddr の幅であり、8 または 16 を指定します

None を返します。これはコントローラモードでのみ有効です。

I2C.recv(recv, addr=0x00, *, timeout=5000)

Receive data on the bus:

  • recv には受信するバイト数を示す整数、または受信した bytes 型オブジェクトを格納する書き込み可能バッファを指定できます
  • addr は受信元のアドレスです(コントローラモードでのみ必要)
  • timeout は受信を待つタイムアウト時間をミリ秒単位で指定します

戻り値: パラメータ recv が整数であれば、受信したバイト数を格納した新しいバッファを返します。さもなければ recv に渡したのと同じバッファを返します。

I2C.send(send, addr=0x00, *, timeout=5000)

バスにデータを送信します:

  • send は送信するデータです(送信する整数値、またはバッファオブジェクト)
  • addr は送信先のアドレスです(コントローラモードでのみ必要)
  • timeout は送信を待つタイムアウト時間をミリ秒単位で指定します

Return value: None.

I2C.scan()

0x01 から 0x7f までのすべてのI2Cアドレスをスキャンし、応答するアドレスのリストを返します。コントローラモードの場合のみ有効です。

定数

I2C.CONTROLLER

バスをコントローラモードに初期化するためのもの

I2C.PERIPHERAL

バスをペリフェラルモードに初期化するためのもの