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ř.2proI2C2). 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 vizinit().I2C(2)je na každé OpenMV Cam, která poskytujepyb.I2C(M4 / M7 / H7 / H7 Plus / Pure Thermal), zapojeno na stejné piny konektoru:Signál
Pin na konektoru
Poznámky
SCLP4SDAP5I2C(4)je navíc k dispozici na OpenMV Cam M7, H7, H7 Plus a Pure Thermal seSCLna pinu konektoruP7aSDAna pinu konektoruP8.OpenMV Cam N6 neposkytuje
pyb.I2C; použijte místo tohomachine.I2C.Metody¶
- init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None¶
Inicializuje sběrnici I2C se zadanými parametry:
modemusí být buďI2C.CONTROLLERneboI2C.PERIPHERAL.addrje 7bitová adresa (smysluplné pouze pro periferii).baudrateje hodinová frekvence SCL (smysluplné pouze pro řadič).gencallurčuje, zda podporovat režim general-call.dmaurč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:
datamůže být celé číslo (počet bytů ke čtení) nebo buffer, do kterého se má čístaddrje adresa zařízení I2Cmemaddrje umístění v paměti zařízení I2Ctimeoutje timeout v milisekundách pro čekání na čteníaddr_sizevybí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:
datamůže být celé číslo nebo buffer, ze kterého se má zapisovat.addrje adresa zařízení I2C.memaddrje umístění v paměti zařízení I2C.timeoutje timeout v milisekundách pro čekání na zápis.addr_sizevybírá šířkumemaddr: 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:
recvmůže být celé číslo, což je počet bytů k přijetí, nebo měnitelný buffer, který bude naplněn přijatými bytyaddrje adresa, ze které se má přijímat (vyžadováno pouze v režimu řadiče)timeoutje timeout v milisekundách pro čekání na příjem
Návratová hodnota: pokud je
recvcelé číslo, pak nový buffer s přijatými byty, jinak stejný buffer, který byl předán dorecv.
- send(send: int | bytes | bytearray, addr: int = 0x00, *, timeout: int = 5000) None¶
Odeslání dat na sběrnici:
sendjsou data k odeslání (celé číslo k odeslání nebo objekt buffer).addrje adresa, na kterou se má odeslat (vyžadováno pouze v režimu řadiče).timeoutje timeout v milisekundách pro čekání na odeslání.
Konstanty¶