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()jaI2CTarget.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 jokintrigger:llä valituista tapahtumista laukeaa.triggeron bittimaskiIRQ_*-vakioita OR-yhdistettynä; oletus laukeaa jokaisen ohjaimen puoleisen luku- tai kirjoitustapahtuman lopussa.hard=Truerekisteröi kovan keskeytyksen käsittelijän (ei kekoallokointia takaisinkutsussa). Oletus on ajastettu takaisinkutsu. Annahandler=Nonepoistaaksesi keskeytyksen käytöstä.Muista
IRQ_ADDR_MATCH_READ,IRQ_ADDR_MATCH_WRITE,IRQ_READ_REQjaIRQ_WRITE_REQtäytyy käsitellä kovalla IRQ-takaisinkutsulla (hard=True), koska tapahtumat on kuitattava synkronisesti laitteiston kanssa.IRQ_END_READjaIRQ_END_WRITEvoidaan 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
memmääritettiin konstruktorissa).
Vakiot¶
Jokainen
IRQ_*-vakio on lippubitti. OR-yhdistä ne rakentaaksesitrigger-maskinirq()-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.