I2C osztály – kétvezetékes soros protokoll¶
Az I2C egy kétvezetékes protokoll az eszközök közötti kommunikációhoz. Fizikai szinten két vonalból áll: SCL (órajel) és SDA (adat). Az OpenMV Cam nem biztosít beépített felhúzóellenállásokat egyik vonalon sem – a busz működéséhez külső felhúzóellenállásokra van szükség mind az SCL, mind az SDA vonalon.
Az I2C objektumok egy adott buszhoz kapcsolódnak, és inicializálhatók a létrehozáskor vagy később az init() segítségével.
Példa:
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
Az I2C objektum kiírása megmutatja annak konfigurációját.
Az alapvető metódusok a send() és 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
A helyben történő fogadáshoz először hozzon létre egy bytearray-t:
data = bytearray(3) # create a buffer
i2c.recv(data) # receive 3 bytes, writing them into data
Megadhat időtúllépést is (ms-ban):
i2c.send(b"123", timeout=2000) # timeout after 2 seconds
A vezérlőnek meg kell adnia a címzett címét:
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
A vezérlő ezekkel a metódusokkal is rendelkezik:
# 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)
Konstruktorok¶
- class pyb.I2C(bus: int | str, *args, **kwargs)¶
I2C objektum létrehozása az adott
bus-on (egy egész szám perifériaindex, pl.2azI2C2esetén). További paraméterek nélkül az objektum létrejön, de nem inicializálódik (megtartja a korábbi buszbeállításokat, ha voltak ilyenek); ha további argumentumokat ad meg, a busz inicializálódik. Az elérhető paramétereket lásd azinit()metódusnál.Az
I2C(2)minden olyan OpenMV Cam esetében ugyanazokra a tűsoros lábakra van bekötve, amely elérhetővé teszi apyb.I2Cosztályt (M4 / M7 / H7 / H7 Plus / Pure Thermal):Jel
Tűsoros láb
Megjegyzések
SCLP4SDAP5Az
I2C(4)ezenfelül elérhető az OpenMV Cam M7, H7, H7 Plus és Pure Thermal kamerán, ahol azSCLaP7tűsoros lábon, azSDApedig aP8tűsoros lábon található.Az OpenMV Cam N6 nem teszi elérhetővé a
pyb.I2Cosztályt; helyette használja amachine.I2Cosztályt.Metódusok¶
- init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None¶
Az I2C busz inicializálása a megadott paraméterekkel:
A
modeértéke vagyI2C.CONTROLLERvagyI2C.PERIPHERALkell legyen.Az
addra 7 bites cím (csak perifériánál van értelme).A
baudrateaz SCL órajel-sebessége (csak vezérlőnél van értelme).A
gencallazt jelzi, hogy támogatva legyen-e az általános hívás (general-call) mód.A
dmaazt jelzi, hogy engedélyezve legyen-e a DMA használata az I2C átvitelekhez (vegye figyelembe, hogy a DMA-átvitelek időzítése pontosabb, de jelenleg nem kezelik megfelelően a busz hibáit).
A tényleges órajel-frekvencia alacsonyabb lehet a kérthez képest. Ez a platform hardverétől függ. A tényleges sebesség az I2C objektum kiírásával állapítható meg.
- is_ready(addr: int) bool¶
Ellenőrzi, hogy egy I2C eszköz válaszol-e a megadott címre. Csak vezérlő módban érvényes.
- mem_read(data: int | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) bytes¶
Olvasás egy I2C eszköz memóriájából:
A
datalehet egy egész szám (az olvasandó bájtok száma) vagy egy puffer, amelybe az olvasás történikAz
addraz I2C eszköz címeA
memaddra memóriahely az I2C eszközön belülA
timeoutaz ezredmásodpercben megadott időtúllépés, ameddig az olvasásra várni kellAz
addr_sizea memaddr szélességét választja ki: 8 vagy 16 bit
Visszaadja a beolvasott adatokat. Ez csak vezérlő módban érvényes.
- mem_write(data: int | bytes | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) None¶
Írás egy I2C eszköz memóriájába:
A
datalehet egy egész szám vagy egy puffer, amelyből az írás történik.Az
addraz I2C eszköz címe.A
memaddra memóriahely az I2C eszközön belül.A
timeoutaz ezredmásodpercben megadott időtúllépés, ameddig az írásra várni kell.Az
addr_sizeamemaddrszélességét választja ki: 8 vagy 16 bit.
Csak vezérlő módban érvényes.
- recv(recv: int | bytearray, addr: int = 0x00, *, timeout: int = 5000) bytes¶
Adatok fogadása a buszon:
A
recvlehet egy egész szám, amely a fogadandó bájtok száma, vagy egy módosítható puffer, amely a fogadott bájtokkal lesz feltöltveAz
addraz a cím, amelyről fogadni kell (csak vezérlő módban szükséges)A
timeoutaz ezredmásodpercben megadott időtúllépés, ameddig a fogadásra várni kell
Visszatérési érték: ha a
recvegész szám, akkor egy új puffer a fogadott bájtokkal, ellenkező esetben ugyanaz a puffer, amelyet arecvparaméternek átadtak.
- send(send: int | bytes | bytearray, addr: int = 0x00, *, timeout: int = 5000) None¶
Adatok küldése a buszon:
A
senda küldendő adat (egy küldendő egész szám vagy egy pufferobjektum).Az
addraz a cím, amelyre küldeni kell (csak vezérlő módban szükséges).A
timeoutaz ezredmásodpercben megadott időtúllépés, ameddig a küldésre várni kell.
Konstansok¶