クラス 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 バスを初期化します:
mode
はI2C.CONTROLLER
かI2C.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アドレスをスキャンし、応答するアドレスのリストを返します。コントローラモードの場合のみ有効です。