class I2C -- 2 線式シリアルプロトコル¶
I2C はデバイス間で通信するための 2 線式プロトコルです。物理レベルでは、SCL(クロック)と SDA(データ)の 2 本のラインで構成されます。OpenMV Cam はどちらのラインにもオンボードのプルアップを 提供しません -- バスを機能させるには、SCL と SDA の両方に外部プルアップが必要です。
I2C オブジェクトは特定のバスに割り当てられ、構築時に、または後で init() を介して初期化できます。
例:
from pyb import I2C
i2c = I2C(2) # create on bus 2 (uninitialised)
i2c = I2C(2, I2C.CONTROLLER) # create and init as a controller
i2c.init(I2C.CONTROLLER, baudrate=20000) # init as a controller
i2c.init(I2C.PERIPHERAL, addr=0x42) # init as a peripheral with the given address
i2c.deinit() # turn off the peripheral
I2C オブジェクトを print すると、その構成が表示されます。
基本的なメソッドは send() と recv() です:
i2c.send("abc") # send 3 bytes
i2c.send(0x42) # send a single byte, given by the number
data = i2c.recv(3) # receive 3 bytes
その場で受信するには、まず bytearray を作成します:
data = bytearray(3) # create a buffer
i2c.recv(data) # receive 3 bytes, writing them into data
タイムアウト(ミリ秒単位)を指定できます:
i2c.send(b"123", timeout=2000) # timeout after 2 seconds
コントローラは受信者のアドレスを指定する必要があります:
i2c.init(I2C.CONTROLLER)
i2c.send("123", 0x42) # send 3 bytes to peripheral with address 0x42
i2c.send(b"456", addr=0x42) # keyword for address
コントローラには次のメソッドもあります:
# Check if peripheral 0x42 is ready.
i2c.is_ready(0x42)
# Scan the bus and return a list of responding addresses.
i2c.scan()
# Read 3 bytes from peripheral 0x42 starting at memaddr 2.
i2c.mem_read(3, 0x42, 2)
# Write 3 bytes to peripheral 0x42 at memaddr 2.
i2c.mem_write("abc", 0x42, 2, timeout=1000)
コンストラクタ¶
- class pyb.I2C(bus: int | str, *args, **kwargs)¶
指定された
bus(整数のペリフェラルインデックス。たとえばI2C2の場合は2)上に I2C オブジェクトを構築します。追加のパラメータがない場合、オブジェクトは作成されますが初期化されません(以前のバス設定があればそれを保持します)。追加の引数が与えられた場合はバスが初期化されます。利用可能なパラメータについてはinit()を参照してください。I2C(2)は、pyb.I2Cを備えるすべての OpenMV Cam(M4 / M7 / H7 / H7 Plus / Pure Thermal)で同じヘッダーピンに配線されています。信号
ヘッダーピン
備考
SCLP4SDAP5I2C(4)は OpenMV Cam M7、H7、H7 Plus、Pure Thermal でさらに利用可能で、SCLはヘッダーピンP7、SDAはヘッダーピンP8に配線されています。OpenMV Cam N6 は
pyb.I2Cを公開しません。代わりにmachine.I2Cを使用してください。メソッド¶
- init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None¶
指定されたパラメータで I2C バスを初期化します。
modeはI2C.CONTROLLERまたはI2C.PERIPHERALのいずれかでなければなりません。addrは 7 ビットアドレスです(ペリフェラルの場合にのみ意味があります)。baudrateは SCL クロックレートです(コントローラの場合にのみ意味があります)。gencallはゼネラルコールモードをサポートするかどうかです。dmaは I2C 転送に DMA の使用を許可するかどうかです(DMA 転送はより正確なタイミングを持ちますが、現在のところバスエラーを適切に処理しないことに注意してください)。
実際のクロック周波数は、要求された周波数よりも低くなる場合があります。これはプラットフォームのハードウェアに依存します。実際のレートは I2C オブジェクトを print することで確認できます。
- mem_read(data: int | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) bytes¶
I2C デバイスのメモリから読み込みます。
dataには、整数(読み込むバイト数)または読み込み先のバッファを指定できますaddrは I2C デバイスのアドレスですmemaddrは I2C デバイス内のメモリ位置ですtimeoutは読み込みを待機するタイムアウト(ミリ秒単位)ですaddr_sizeは memaddr の幅を選択します: 8 ビットまたは 16 ビット
読み込んだデータを返します。これはコントローラモードでのみ有効です。
- mem_write(data: int | bytes | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) None¶
I2C デバイスのメモリに書き込みます。
dataには、整数または書き込み元のバッファを指定できます。addrは I2C デバイスのアドレスです。memaddrは I2C デバイス内のメモリ位置です。timeoutは書き込みを待機するタイムアウト(ミリ秒単位)です。addr_sizeはmemaddrの幅を選択します: 8 ビットまたは 16 ビット。
コントローラモードでのみ有効です。
- recv(recv: int | bytearray, addr: int = 0x00, *, timeout: int = 5000) bytes¶
バスでデータを受信します。
recvには、受信するバイト数である整数、または受信したバイトで満たされる可変バッファを指定できますaddrは受信元のアドレスです(コントローラモードでのみ必要)timeoutは受信を待機するタイムアウト(ミリ秒単位)です
戻り値:
recvが整数の場合は受信したバイトの新しいバッファ、そうでない場合はrecvに渡されたのと同じバッファです。
定数¶