class I2CTarget – I2C-kohdelaite

I2C-kohde (target) on laite, joka liittyy I2C-väylään ja jota I2C-ohjain ohjaa. I2C-kohteita on monia eri muotoja. machine.I2CTarget-luokka toteuttaa I2C-kohteen, joka voidaan määrittää muisti-/rekisterilaitteeksi tai mielivaltaiseksi I2C-laitteeksi takaisinkutsuja käyttäen (jos portti tukee tätä).

Saatavilla malleissa OpenMV Cam M4 / M7 / H7 / H7 Plus / Pure Thermal / RT1062 / AE3.

Esimerkki käytöstä muistilaitteen tapauksessa:

from machine import I2CTarget

# Create the backing memory for the I2C target.
mem = bytearray(8)

# Create an I2C target.  Depending on the port, extra parameters
# may be required to select the peripheral and/or pins to use.
i2c = I2CTarget(addr=67, mem=mem)

# At this point an I2C controller can read and write `mem`.
...

# Deinitialise the I2C target.
i2c.deinit()

Huomaa, että jotkin portit vaativat, että I2CTarget-konstruktorille välitetään id ja mahdollisesti scl- ja sda-nastat, jotta voidaan valita laitteiston I2C-instanssi ja nastat, joihin se kytkeytyy.

Kun se on määritetty muistilaitteeksi, on myös mahdollista rekisteröityä vastaanottamaan tapahtumia. Esimerkiksi saadaksesi ilmoituksen, kun muistia luetaan/kirjoitetaan:

from machine import I2CTarget

# Define an IRQ handler, for I2C events.
def irq_handler(i2c_target):
    flags = i2c_target.irq().flags()
    if flags & I2CTarget.IRQ_END_READ:
        print("controller read target at addr", i2c_target.memaddr)
    if flags & I2CTarget.IRQ_END_WRITE:
        print("controller wrote target at addr", i2c_target.memaddr)

# Create the I2C target and register to receive default events.
mem = bytearray(8)
i2c = I2CTarget(addr=67, mem=mem)
i2c.irq(irq_handler)

Monimutkaisempia I2C-laitteita voidaan toteuttaa käyttämällä koko tapahtumajoukkoa. Esimerkiksi nähdäksesi raa’at tapahtumat sellaisina kuin ne laukeavat:

from machine import I2CTarget

# Define an IRQ handler that prints the event id and responds to reads/writes.
def irq_handler(i2c_target, buf=bytearray(1)):
    flags = i2c_target.irq().flags()
    print(flags)
    if flags & I2CTarget.IRQ_READ_REQ:
        i2c_target.write(buf)
    if flags & I2CTarget.IRQ_WRITE_REQ:
        i2c_target.readinto(buf)

# Create the I2C target and register to receive all events.
i2c = I2CTarget(addr=67)
all_triggers = (
    I2CTarget.IRQ_ADDR_MATCH_READ
    | I2CTarget.IRQ_ADDR_MATCH_WRITE
    | I2CTarget.IRQ_READ_REQ
    | I2CTarget.IRQ_WRITE_REQ
    | I2CTarget.IRQ_END_READ
    | I2CTarget.IRQ_END_WRITE
)
i2c.irq(irq_handler, trigger=all_triggers, hard=True)

Konstruktorit

class machine.I2CTarget(id: int, addr: int, *, addrsize: int = 7, mem: bytearray | None = None, mem_addrsize: int = 8, scl: Pin | None = None, sda: Pin | None = None)

Luo ja palauta uusi I2CTarget-objekti käyttäen seuraavia parametreja:

  • id yksilöi tietyn I2C-oheislaitteen. Sallitut arvot riippuvat tietystä portista/kortista. Joillakin porteilla on oletusarvo, jolloin tämä parametri voidaan jättää pois.

  • addr on kohteen I2C-osoite.

  • addrsize on I2C-kohdeosoitteen bittien määrä. Kelvolliset arvot ovat 7 ja 10.

  • mem on objekti, joka tukee puskuriprotokollaa ja johon voidaan kirjoittaa. Jos sitä ei määritetä, taustamuistia ei ole ja data täytyy lukea/kirjoittaa metodeilla I2CTarget.readinto() ja I2CTarget.write().

  • mem_addrsize on muistiosoitteen bittien määrä. Kelvolliset arvot ovat 0, 8, 16, 24 ja 32.

  • scl on pin-objekti, joka määrittää SCL-linjalle käytettävän nastan.

  • sda on pin-objekti, joka määrittää SDA-linjalle käytettävän nastan.

Huomaa, että joillakin porteilla/korteilla on oletusarvot scl:lle ja sda:lle, jotka voidaan muuttaa tässä konstruktorissa. Toisilla on kiinteät scl- ja sda-arvot, joita ei voi muuttaa.

Yleiset metodit

deinit() None

Pura I2C-kohteen alustus. Tämän metodin kutsumisen jälkeen laitteisto ei enää vastaa I2C-väylän pyyntöihin, eikä muita metodeja voida kutsua.

readinto(buf: bytearray) int

Lue annettuun puskuriin kaikki odottavat tavut, jotka I2C-ohjain on kirjoittanut. Palauttaa luettujen tavujen määrän.

write(buf: bytes) int

Kirjoita ulos annetun puskurin tavut, jotka välitetään I2C-ohjaimelle sen lähetettyä lukupyynnön. Palauttaa kirjoitettujen tavujen määrän. Useimmat portit hyväksyvät tähän metodiin vain yhden tavun kerrallaan.

irq(handler: Callable[[I2CTarget], None] | None = None, trigger: int = IRQ_END_READ | IRQ_END_WRITE, hard: bool = False) None

Asenna IRQ-käsittelijä handler, joka kutsutaan, kun jokin trigger:llä valituista tapahtumista laukeaa. trigger on bittimaski IRQ_*-vakioita OR-yhdistettynä; oletus laukeaa jokaisen ohjaimen puoleisen luku- tai kirjoitustapahtuman lopussa.

hard=True rekisteröi kovan keskeytyksen käsittelijän (ei kekoallokointia takaisinkutsussa). Oletus on ajastettu takaisinkutsu. Anna handler=None poistaaksesi keskeytyksen käytöstä.

Muista

IRQ_ADDR_MATCH_READ, IRQ_ADDR_MATCH_WRITE, IRQ_READ_REQ ja IRQ_WRITE_REQ täytyy käsitellä kovalla IRQ-takaisinkutsulla (hard=True), koska tapahtumat on kuitattava synkronisesti laitteiston kanssa. IRQ_END_READ ja IRQ_END_WRITE voidaan käsitellä joko pehmeillä tai kovilla takaisinkutsuilla; kaikki tapahtumat jakavat yhden käsittelijän, joten jos jokin tapahtuma tarvitsee kovan takaisinkutsun, ne kaikki tarvitsevat.

Kun konstruktorille annetaan muistipuskuri, ajuri vaimentaa IRQ_END_WRITE-tapahtuman sen tapahtuman osalta, joka kirjoittaa vain muistiosoitteen. Tämä pitää tapahtuman päättymistapahtumat merkityksellisinä silloinkin, kun pehmeän IRQ:n ajastin viivästyttää takaisinkutsua.

memaddr

Viimeisimmän I2C-ohjaimen valitseman muistiosoitteen kokonaislukuarvo (kelvollinen vain, jos mem määritettiin konstruktorissa).

Vakiot

Jokainen IRQ_*-vakio on lippubitti. OR-yhdistä ne rakentaaksesi trigger-maskin irq()-metodille. Käsittelijän sisällä lauenneiden tapahtumien joukko voidaan selvittää AND-yhdistämällä self.irq().flags() kunkin vakion kanssa.

IRQ_ADDR_MATCH_READ: int

Laukeaa, kun ohjain osoittaa tämän kohteen lukutapahtumaa varten (osoitetavu on vastaanotettu luku-/kirjoitusbitin ollessa asetettuna arvoon 1). Vain kova IRQ.

IRQ_ADDR_MATCH_WRITE: int

Laukeaa, kun ohjain osoittaa tämän kohteen kirjoitustapahtumaa varten (osoitetavu on vastaanotettu luku-/kirjoitusbitin ollessa asetettuna arvoon 0). Vain kova IRQ.

IRQ_READ_REQ: int

Laukeaa, kun ohjain pyytää tavua kohteelta. Käsittelijän täytyy kutsua write() antaakseen tavun ennen kuin ohjaimen kellojakso päättyy. Vain kova IRQ.

IRQ_WRITE_REQ: int

Laukeaa, kun ohjain on kellottanut tavun kohteeseen. Käsittelijän täytyy kutsua readinto() noutaakseen tavun ennen kuin ohjain lähettää seuraavan. Vain kova IRQ.

IRQ_END_READ: int

Laukeaa, kun ohjain on saanut lukutapahtuman valmiiksi (vastaanottanut STOP / toistetun START:n). Voidaan käsitellä joko kovalla tai pehmeällä IRQ-takaisinkutsulla.

IRQ_END_WRITE: int

Laukeaa, kun ohjain on saanut kirjoitustapahtuman valmiiksi (vastaanottanut STOP / toistetun START:n). Voidaan käsitellä joko kovalla tai pehmeällä IRQ-takaisinkutsulla. Vaimennetaan sen tapahtuman osalta, joka kirjoittaa muistiosoitteen, kun konstruktorille annettiin mem-puskuri.