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 2 vezetékből áll: SCL és SDA, azaz az órajel- és az adatvezetékből.
Az I2C objektumok egy adott buszhoz kapcsolódva jönnek létre. Inicializálhatók a létrehozáskor, vagy később is.
Az I2C objektum kiírása a konfigurációjával kapcsolatos információkat ad.
Hardveres és szoftveres I2C megvalósítás egyaránt létezik az I2C és a SoftI2C osztályokon keresztül. A hardveres I2C a rendszer mögöttes hardvertámogatását használja az olvasások/írások végrehajtásához, ami általában hatékony és gyors, de korlátozhatja, hogy mely lábak használhatók. A szoftveres I2C bit-banging technikával valósul meg, bármely lábon használható, de nem olyan hatékony. Ezeknek az osztályoknak ugyanazok a metódusaik érhetők el, és elsősorban a felépítésük módjában különböznek.
Megjegyzés
Az I2C busz a működéséhez felhúzó áramkört igényel mind az SDA, mind az SCL vonalon. Ezek általában 1 - 10 kOhm tartományba eső ellenállások, amelyek az egyes SDA/SCL vonalakat a Vcc-hez kötik. Ezek nélkül a viselkedés nem meghatározott, és a blokkolástól kezdve a váratlan watchdog-újraindításon át egészen az egyszerűen hibás értékekig terjedhet. Gyakran ez a felhúzó áramkör már beépítve megtalálható az MCU-kártyán vagy az érzékelő bővítőkártyáin, de erre nincs szabály. Ezért probléma esetén kérjük, ellenőrizze. Lásd még az Adafruit kiváló tanulási útmutatóját az I2C huzalozásról.
Példa a használatra:
from machine import I2C
i2c = I2C(freq=400000) # create I2C peripheral at frequency of 400kHz
# depending on the port, extra parameters may be required
# to select the peripheral and/or pins to use
i2c.scan() # scan for peripherals, returning a list of 7-bit addresses
i2c.writeto(42, b'123') # write 3 bytes to peripheral with 7-bit address 42
i2c.readfrom(42, 4) # read 4 bytes from peripheral with 7-bit address 42
i2c.readfrom_mem(42, 8, 3) # read 3 bytes from memory of peripheral 42,
# starting at memory-address 8 in the peripheral
i2c.writeto_mem(42, 2, b'\x10') # write 1 byte to memory of peripheral 42
# starting at address 2 in the peripheral
Konstruktorok#
- class machine.I2C(id: int, *, scl: Pin | None = None, sda: Pin | None = None, freq: int = 400000, timeout: int = 50000)#
Hozzon létre és adjon vissza egy új I2C objektumot a következő paraméterekkel:
Az id egy adott I2C perifériát azonosít. Az engedélyezett értékek az adott porttól/kártyától függenek
Az scl egy láb objektum legyen, amely megadja az SCL-hez használandó lábat.
Az sda egy láb objektum legyen, amely megadja az SDA-hoz használandó lábat.
A freq egy egész szám legyen, amely beállítja az SCL maximális frekvenciáját.
A timeout az I2C tranzakciókhoz engedélyezett maximális idő mikroszekundumban. Ez a paraméter egyes portokon nem engedélyezett.
Vegye figyelembe, hogy egyes portoknál/kártyáknál az scl és sda alapértelmezett értékei ebben a konstruktorban módosíthatók. Másoknál az scl és sda rögzített értékűek, amelyek nem módosíthatók.
Általános metódusok#
- init(scl: Pin, sda: Pin, *, freq: int = 400000) None#
Inicializálja az I2C buszt a megadott argumentumokkal:
Az scl egy láb objektum az SCL vonalhoz
Az sda egy láb objektum az SDA vonalhoz
A freq az SCL órajel sebessége
Hardveres I2C esetén a tényleges órajel-frekvencia alacsonyabb lehet a kértnél. Ez a platform hardverétől függ. A tényleges sebesség az I2C objektum kiíratásával állapítható meg.
Elemi I2C műveletek#
A következő metódusok az elemi I2C vezérlőbusz-műveleteket valósítják meg, és kombinálhatók bármely I2C tranzakció létrehozásához. Akkor hasznosak, ha nagyobb kontrollra van szükséged a busz felett, egyébként a szabványos metódusok (lásd alább) használhatók.
Ezek a metódusok csak a
SoftI2Cosztályon érhetők el.- readinto(buf: bytearray, nack: bool = True, /) None#
Bájtokat olvas a buszról, és a buf pufferbe tárolja őket. Az olvasott bájtok száma a buf hossza. Egy ACK kerül a buszra az utolsó kivételével minden bájt fogadása után. Az utolsó bájt fogadása után, ha a nack igaz, akkor NACK kerül kiküldésre, egyébként ACK küldődik (ebben az esetben a periféria azt feltételezi, hogy egy későbbi hívásban további bájtokat fognak olvasni).
Szabványos buszműveletek#
A következő metódusok a szabványos I2C vezérlő olvasási és írási műveleteket valósítják meg, amelyek egy adott perifériaeszközt céloznak meg.
- readfrom(addr: int, nbytes: int, stop: bool = True, /) bytes#
nbytes bájtot olvas az addr által megadott perifériáról. Ha a stop igaz, akkor az átvitel végén STOP feltétel generálódik. Egy
bytesobjektumot ad vissza az olvasott adattal.
- readfrom_into(addr: int, buf: bytearray, stop: bool = True, /) None#
Az addr által megadott perifériáról a buf pufferbe olvas. Az olvasott bájtok száma a buf hossza. Ha a stop igaz, akkor az átvitel végén STOP feltétel generálódik.
A metódus a
Noneértéket adja vissza.
- writeto(addr: int, buf: bytes, stop: bool = True, /) int#
A buf bájtjait írja az addr által megadott perifériára. Ha egy buf-ból származó bájt írása után NACK érkezik, akkor a fennmaradó bájtok nem kerülnek elküldésre. Ha a stop igaz, akkor az átvitel végén STOP feltétel generálódik, még akkor is, ha NACK érkezik. A függvény visszaadja a fogadott ACK-k számát.
- writevto(addr: int, vector: tuple | list, stop: bool = True, /) int#
A vector-ban található bájtokat írja az addr által megadott perifériára. A vector objektumok puffer protokollt megvalósító elemeinek tuple-je vagy listája legyen. Az addr egyszer kerül elküldésre, majd a vector egyes objektumaiból származó bájtok egymás után íródnak ki. A vector objektumai nulla bájt hosszúak is lehetnek, ebben az esetben nem járulnak hozzá a kimenethez.
Ha a vector egyik objektumából származó bájt írása után NACK érkezik, akkor a fennmaradó bájtok és a fennmaradó objektumok nem kerülnek elküldésre. Ha a stop igaz, akkor az átvitel végén STOP feltétel generálódik, még akkor is, ha NACK érkezik. A függvény visszaadja a fogadott ACK-k számát.
Memóriaműveletek#
Egyes I2C eszközök memóriaeszközként (vagy regiszterek halmazaként) viselkednek, amelyekből olvasni és amelyekbe írni lehet. Ebben az esetben két cím tartozik egy I2C tranzakcióhoz: a periféria címe és a memóriacím. A következő metódusok kényelmi függvények az ilyen eszközökkel való kommunikációhoz.
- readfrom_mem(addr: int, memaddr: int, nbytes: int, *, addrsize: int = 8) bytes#
nbytes bájtot olvas az addr által megadott perifériáról a memaddr által megadott memóriacímtől kezdve. Az addrsize argumentum a cím méretét adja meg bitekben. Egy
bytesobjektumot ad vissza az olvasott adattal.
- readfrom_mem_into(addr: int, memaddr: int, buf: bytearray, *, addrsize: int = 8) None#
Az addr által megadott perifériáról a buf pufferbe olvas a memaddr által megadott memóriacímtől kezdve. Az olvasott bájtok száma a buf hossza. Az addrsize argumentum a cím méretét adja meg bitekben.
A metódus a
Noneértéket adja vissza.
SoftI2C osztály – szoftveresen emulált I2C busz#
A SoftI2C osztály az I2C-t tetszőleges GPIO lábak bit-banging technikájával valósítja meg. Ugyanazt a metóduskészletet teszi elérhetővé, mint az I2C, plusz az alacsony szintű elemi buszműveleteket (start(), stop(), readinto(), write()) azon hívók számára, akiknek nem szabványos tranzakciókat kell összeállítaniuk. Akkor használd, ha a szükséges lábak nincsenek hardveres I2C blokkhoz huzalozva, ha több buszra van szükséged, mint amennyit a hardver biztosít, vagy ha olyan eszközökkel akarsz kommunikálni, amelyek szokatlan szekvenciákat igényelnek (extra órajelek, írás utáni ismételt startok stb.).
Konstruktorok#
- class machine.SoftI2C(scl: Pin, sda: Pin, *, freq: int = 400000, timeout: int = 50000)#
Egy
scl/sdaáltal vezérelt szoftveres I2C buszt hoz létre.A
freqa cél SCL órajel sebessége Hz-ben (a tényleges sebesség jellemzően alacsonyabb a bit-bang ciklus terhelése miatt).A
timeoutaz órajel-nyújtás (clock stretching, amikor egy másik eszköz alacsonyan tartja az SCL vonalat a buszon) megvárásának maximális ideje mikroszekundumban; lejártakor egyOSError(ETIMEDOUT)kivétel keletkezik.Általános metódusok#
Elemi I2C műveletek#
A következő metódusok az elemi I2C vezérlőbusz-műveleteket valósítják meg, és kombinálhatók bármely I2C tranzakció létrehozásához. Ezek csak a SoftI2C esetén érhetők el – a hardveres
I2Cosztály nem teszi elérhetővé őket.- readinto(buf: bytearray, nack: bool = True, /) None#
Bájtokat olvas a buszról a
bufpufferbe.len(buf)bájt kerül beolvasásra; minden bájt után ACK küldődik, kivéve az utolsót. Az utolsó bájt után anack=True(az alapértelmezés) NACK-ot küld az átvitel lezárásához; anack=FalseACK-ot küld, így az eszköz kiválasztva marad egy következőreadinto()művelethez.
Szabványos buszműveletek#
A következő metódusok a szabványos I2C vezérlő olvasási és írási műveleteket valósítják meg, amelyek egy adott perifériaeszközt céloznak meg.
- readfrom(addr: int, nbytes: int, stop: bool = True, /) bytes#
nbytesbájtot olvas a 7 bitesaddrcímen lévő eszközről. Ha astopigaz, az átvitel végén STOP feltétel generálódik.
- readfrom_into(addr: int, buf: bytearray, stop: bool = True, /) None#
len(buf)bájtot olvas azaddrcímen lévő eszközről abufpufferbe. Ha astopigaz, az átvitel végén STOP feltétel generálódik.
- writeto(addr: int, buf: bytes, stop: bool = True, /) int#
A
buf-ot írja azaddrcímen lévő eszközre. Az átvitel az első NACK-nál leáll. Ha astopigaz, az átvitel végén mindig STOP feltétel generálódik (még korai NACK esetén is). Visszaadja a fogadott ACK-k számát.
- writevto(addr: int, vector: tuple | list, stop: bool = True, /) int#
A
vector-ban lévő pufferek összefűzését írja azaddrcímen lévő eszközre egyetlen tranzakcióként. Az üres pufferek figyelmen kívül maradnak. Astopszemantikája és a visszatérési értéke tekintetében úgy viselkedik, mint awriteto().
Memóriaműveletek#
Egyes I2C eszközök memóriaeszközként (vagy regiszterek halmazaként) viselkednek, amelyekből olvasni és amelyekbe írni lehet. Ebben az esetben két cím tartozik egy I2C tranzakcióhoz: a periféria címe és a memóriacím. A következő metódusok kényelmi segédfüggvények az ilyen eszközökkel való kommunikációhoz.
- readfrom_mem(addr: int, memaddr: int, nbytes: int, *, addrsize: int = 8) bytes#
nbytesbájtot olvas azaddrcímen lévő eszközről amemaddrregisztertől kezdve. Azaddrsizea regisztercím szélessége bitekben (jellemzően8vagy16).