クラス I2C -- 2線式シリアルプロトコル¶
I2C は、デバイス間通信のための2線式プロトコルです。物理レベルでは、クロックラインである SCL とデータラインである SDA の2本のワイヤで構成されています。
I2C オブジェクトは特定のバスに接続して作成されます。作成時に初期化することも、後で初期化することもできます。
サンプルコード:
from pyb import I2C
i2c = I2C(1) # バス 1 に作成
i2c = I2C(1, I2C.MASTER) # マスターとして作成・初期化
i2c.init(I2C.MASTER, baudrate=20000) # マスターとして初期化
i2c.init(I2C.SLAVE, 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.MASTER)
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.MASTERかI2C.SLAVEのいずれかでなければなりません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には受信するバイト数を示す整数、または受信したバイト列を格納する書き込み可能バッファを指定できますaddrは受信元のアドレスです(マスターモードでのみ必要)timeoutは受信を待つタイムアウト時間をミリ秒単位で指定します
戻り値: パラメータ
recvが整数であれば、受信したバイト数を格納した新しいバッファを返します。さもなければrecvに渡したのと同じバッファを返します。
-
I2C.send(send, addr=0x00, *, timeout=5000)¶ バスにデータを送信します:
sendは送信するデータです(送信する整数値、またはバッファオブジェクト)addrは送信先のアドレスです(マスターモードでのみ必要)timeoutは送信を待つタイムアウト時間をミリ秒単位で指定します
戻り値:
None。
-
I2C.scan()¶ 0x01 から 0x7f までのすべてのI2Cアドレスをスキャンし、応答するアドレスのリストを返します。マスターモードの場合のみ有効です。