class I2C -- 2 線式シリアルプロトコル

I2C はデバイス間で通信するための 2 線式プロトコルです。物理レベルでは、SCL(クロック)と SDA(データ)の 2 本のラインで構成されます。OpenMV Cam はどちらのラインにもオンボードのプルアップを 提供しません -- バスを機能させるには、SCLSDA の両方に外部プルアップが必要です。

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)で同じヘッダーピンに配線されています。

信号

ヘッダーピン

備考

SCL

P4

SDA

P5

I2C(4) は OpenMV Cam M7、H7、H7 Plus、Pure Thermal でさらに利用可能で、SCL はヘッダーピン P7SDA はヘッダーピン P8 に配線されています。

OpenMV Cam N6 は pyb.I2C を公開しません。代わりに machine.I2C を使用してください。

メソッド

deinit() None

I2C バスをオフにします。

init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None

指定されたパラメータで I2C バスを初期化します。

  • modeI2C.CONTROLLER または I2C.PERIPHERAL のいずれかでなければなりません。

  • addr は 7 ビットアドレスです(ペリフェラルの場合にのみ意味があります)。

  • baudrate は SCL クロックレートです(コントローラの場合にのみ意味があります)。

  • gencall はゼネラルコールモードをサポートするかどうかです。

  • dma は I2C 転送に DMA の使用を許可するかどうかです(DMA 転送はより正確なタイミングを持ちますが、現在のところバスエラーを適切に処理しないことに注意してください)。

実際のクロック周波数は、要求された周波数よりも低くなる場合があります。これはプラットフォームのハードウェアに依存します。実際のレートは I2C オブジェクトを print することで確認できます。

is_ready(addr: int) bool

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

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_sizememaddr の幅を選択します: 8 ビットまたは 16 ビット。

コントローラモードでのみ有効です。

recv(recv: int | bytearray, addr: int = 0x00, *, timeout: int = 5000) bytes

バスでデータを受信します。

  • recv には、受信するバイト数である整数、または受信したバイトで満たされる可変バッファを指定できます

  • addr は受信元のアドレスです(コントローラモードでのみ必要)

  • timeout は受信を待機するタイムアウト(ミリ秒単位)です

戻り値: recv が整数の場合は受信したバイトの新しいバッファ、そうでない場合は recv に渡されたのと同じバッファです。

send(send: int | bytes | bytearray, addr: int = 0x00, *, timeout: int = 5000) None

バスでデータを送信します。

  • send は送信するデータです(送信する整数、またはバッファオブジェクト)。

  • addr は送信先のアドレスです(コントローラモードでのみ必要)。

  • timeout は送信を待機するタイムアウト(ミリ秒単位)です。

scan() List[int]

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

定数

CONTROLLER: int

バスをマスター(コントローラ)として初期化します -- SCL を駆動し、トランザクションを開始します。

PERIPHERAL: int

バスをスレーブ(ペリフェラル)として初期化します。init() で設定された addr で待ち受け、同じバス上のコントローラによって開始されたトランザクションに応答します。