třída I2C – dvouvodičový sériový protokol

I2C je dvouvodičový protokol pro komunikaci mezi zařízeními. Na fyzické úrovni se skládá ze dvou linek, SCL (hodiny) a SDA (data). OpenMV Cam neposkytuje vestavěné pull-up rezistory na žádné z linek – pro funkci sběrnice jsou na obou linkách SCL a SDA vyžadovány externí pull-up rezistory.

Objekty I2C jsou připojeny ke konkrétní sběrnici a mohou být inicializovány při vytvoření nebo později pomocí init().

Příklad:

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

Výpis objektu I2C zobrazí jeho konfiguraci.

Základní metody jsou send() a 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

Pro příjem na místě nejprve vytvořte bytearray

data = bytearray(3)  # create a buffer
i2c.recv(data)       # receive 3 bytes, writing them into data

Můžete zadat timeout (v ms):

i2c.send(b"123", timeout=2000)   # timeout after 2 seconds

Řadič musí zadat adresu příjemce:

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

Řadič má také tyto metody:

# 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)

Konstruktory

class pyb.I2C(bus: int | str, *args, **kwargs)

Vytvoří objekt I2C na zadané sběrnici bus (celočíselný index periferie, např. 2 pro I2C2). Bez dalších parametrů se objekt vytvoří, ale neinicializuje (zachová si předchozí nastavení sběrnice, pokud nějaké bylo); pokud jsou zadány další argumenty, sběrnice se inicializuje. Dostupné parametry viz init().

I2C(2) je na každé OpenMV Cam, která poskytuje pyb.I2C (M4 / M7 / H7 / H7 Plus / Pure Thermal), zapojeno na stejné piny konektoru:

Signál

Pin na konektoru

Poznámky

SCL

P4

SDA

P5

I2C(4) je navíc k dispozici na OpenMV Cam M7, H7, H7 Plus a Pure Thermal se SCL na pinu konektoru P7 a SDA na pinu konektoru P8.

OpenMV Cam N6 neposkytuje pyb.I2C; použijte místo toho machine.I2C.

Metody

deinit() None

Vypne sběrnici I2C.

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

Inicializuje sběrnici I2C se zadanými parametry:

  • mode musí být buď I2C.CONTROLLER nebo I2C.PERIPHERAL.

  • addr je 7bitová adresa (smysluplné pouze pro periferii).

  • baudrate je hodinová frekvence SCL (smysluplné pouze pro řadič).

  • gencall určuje, zda podporovat režim general-call.

  • dma určuje, zda povolit použití DMA pro přenosy I2C (uvědomte si, že přenosy DMA mají přesnější časování, ale v současnosti nezpracovávají chyby sběrnice správně).

Skutečná hodinová frekvence může být nižší než požadovaná frekvence. To závisí na hardwaru platformy. Skutečnou frekvenci lze zjistit výpisem objektu I2C.

is_ready(addr: int) bool

Zkontroluje, zda zařízení I2C odpovídá na zadané adrese. Platné pouze v režimu řadiče.

mem_read(data: int | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) bytes

Čtení z paměti zařízení I2C:

  • data může být celé číslo (počet bytů ke čtení) nebo buffer, do kterého se má číst

  • addr je adresa zařízení I2C

  • memaddr je umístění v paměti zařízení I2C

  • timeout je timeout v milisekundách pro čekání na čtení

  • addr_size vybírá šířku memaddr: 8 nebo 16 bitů

Vrátí přečtená data. Platné pouze v režimu řadiče.

mem_write(data: int | bytes | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) None

Zápis do paměti zařízení I2C:

  • data může být celé číslo nebo buffer, ze kterého se má zapisovat.

  • addr je adresa zařízení I2C.

  • memaddr je umístění v paměti zařízení I2C.

  • timeout je timeout v milisekundách pro čekání na zápis.

  • addr_size vybírá šířku memaddr: 8 nebo 16 bitů.

Platné pouze v režimu řadiče.

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

Příjem dat na sběrnici:

  • recv může být celé číslo, což je počet bytů k přijetí, nebo měnitelný buffer, který bude naplněn přijatými byty

  • addr je adresa, ze které se má přijímat (vyžadováno pouze v režimu řadiče)

  • timeout je timeout v milisekundách pro čekání na příjem

Návratová hodnota: pokud je recv celé číslo, pak nový buffer s přijatými byty, jinak stejný buffer, který byl předán do recv.

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

Odeslání dat na sběrnici:

  • send jsou data k odeslání (celé číslo k odeslání nebo objekt buffer).

  • addr je adresa, na kterou se má odeslat (vyžadováno pouze v režimu řadiče).

  • timeout je timeout v milisekundách pro čekání na odeslání.

scan() List[int]

Prohledá všechny I2C adresy od 0x01 do 0x7f a vrátí seznam těch, které odpovídají. Platné pouze v režimu řadiče.

Konstanty

CONTROLLER: int

Inicializuje sběrnici jako master (řadič) – budí SCL a zahajuje transakce.

PERIPHERAL: int

Inicializuje sběrnici jako slave (periferii), která naslouchá na adrese addr nastavené v init() a odpovídá na transakce zahájené řadičem na téže sběrnici.