klasa I2CTarget – I2C ciljni uređaj

I2C cilj je uređaj koji se spaja na I2C sabirnicu i kojim upravlja I2C upravljač. I2C ciljevi mogu imati mnoge oblike. Klasa machine.I2CTarget implementira I2C cilj koji se može konfigurirati kao memorijski/registarski uređaj, ili kao proizvoljni I2C uređaj korištenjem povratnih poziva (ako ih port podržava).

Dostupno na OpenMV Cam M4 / M7 / H7 / H7 Plus / Pure Thermal / RT1062 / AE3.

Primjer upotrebe za slučaj memorijskog uređaja:

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()

Imajte na umu da neki portovi zahtijevaju da se id, a možda i scl i sda pinovi, proslijede konstruktoru I2CTarget, kako bi se odabrala hardverska I2C instanca i pinovi na koje se spaja.

Kada je konfiguriran kao memorijski uređaj, također je moguće registrirati se za primanje događaja. Na primjer za obavještavanje kada se iz memorije čita/u nju piše:

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)

Složeniji I2C uređaji mogu se implementirati korištenjem cijelog skupa događaja. Na primjer, za prikaz sirovih događaja kako se okidaju:

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)

Konstruktori

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)

Konstruira i vraća novi I2CTarget objekt koristeći sljedeće parametre:

  • id identificira određenu I2C periferiju. Dopuštene vrijednosti ovise o pojedinom portu/ploči. Neki portovi imaju zadanu vrijednost u kojem slučaju se ovaj parametar može izostaviti.

  • addr je I2C adresa cilja.

  • addrsize je broj bitova u I2C adresi cilja. Valjane vrijednosti su 7 i 10.

  • mem je objekt s buffer protokolom koji je upisiv. Ako nije naveden tada nema pozadinske memorije i podaci se moraju čitati/pisati pomoću metoda I2CTarget.readinto() i I2CTarget.write().

  • mem_addrsize je broj bitova u memorijskoj adresi. Valjane vrijednosti su 0, 8, 16, 24 i 32.

  • scl je pin objekt koji određuje pin koji će se koristiti za SCL.

  • sda je pin objekt koji određuje pin koji će se koristiti za SDA.

Imajte na umu da neki portovi/ploče imaju zadane vrijednosti za scl i sda koje se mogu promijeniti u ovom konstruktoru. Drugi imaju fiksne vrijednosti za scl i sda koje se ne mogu mijenjati.

Opće metode

deinit() None

Deinicijalizira I2C cilj. Nakon poziva ove metode hardver više neće odgovarati na zahtjeve na I2C sabirnici i nijedna druga metoda ne može se pozvati.

readinto(buf: bytearray) int

Čita u dani međuspremnik sve neobrađene bajtove koje je zapisao I2C upravljač. Vraća broj pročitanih bajtova.

write(buf: bytes) int

Zapisuje bajtove iz danog međuspremnika, koji se prosljeđuju I2C upravljaču nakon što on pošalje zahtjev za čitanje. Vraća broj zapisanih bajtova. Većina portova prihvaća samo jedan bajt odjednom za ovu metodu.

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

Instalira IRQ handler koji se poziva kada se okine jedan od događaja odabranih s trigger. trigger je bitmaska IRQ_* konstanti spojenih operacijom OR; zadano se okida na kraju svakog čitanja ili pisanja na strani upravljača.

hard=True registrira rukovatelj tvrdog prekida (bez alokacije na hrpi u povratnom pozivu). Zadano je raspoređeni povratni poziv. Proslijedite handler=None za onemogućavanje prekida.

Napomena

IRQ_ADDR_MATCH_READ, IRQ_ADDR_MATCH_WRITE, IRQ_READ_REQ i IRQ_WRITE_REQ moraju se obraditi tvrdim IRQ povratnim pozivom (hard=True) jer se događaji moraju potvrditi sinkrono s hardverom. IRQ_END_READ i IRQ_END_WRITE mogu se obraditi mekim ili tvrdim povratnim pozivima; svi događaji dijele jedan rukovatelj, pa ako bilo koji događaj treba tvrdi povratni poziv onda ga svi trebaju.

Kada se konstruktoru dostavi memorijski međuspremnik, upravljački program potiskuje IRQ_END_WRITE za transakciju koja samo zapisuje memorijsku adresu. Time događaji kraja transakcije ostaju smisleni čak i kada raspoređivač mekih IRQ-ova odgodi povratni poziv.

memaddr

Cjelobrojna vrijednost najnovije memorijske adrese koju je odabrao I2C upravljač (valjana samo ako je mem naveden u konstruktoru).

Konstante

Svaka IRQ_* konstanta je zastavica bita. Spojite ih operacijom OR za izradu trigger maske za irq(). Unutar rukovatelja skup okinutih događaja može se dobiti pomoću self.irq().flags() spojenog operacijom AND sa svakom konstantom.

IRQ_ADDR_MATCH_READ: int

Okida se kada upravljač adresira ovaj cilj za transakciju čitanja (adresni bajt je primljen s bitom čitanja/pisanja postavljenim na 1). Samo tvrdi IRQ.

IRQ_ADDR_MATCH_WRITE: int

Okida se kada upravljač adresira ovaj cilj za transakciju pisanja (adresni bajt je primljen s bitom čitanja/pisanja postavljenim na 0). Samo tvrdi IRQ.

IRQ_READ_REQ: int

Okida se kada upravljač zahtijeva bajt od cilja. Rukovatelj mora pozvati write() za dostavu bajta prije nego što ciklus takta upravljača završi. Samo tvrdi IRQ.

IRQ_WRITE_REQ: int

Okida se kada je upravljač uveo bajt u cilj. Rukovatelj mora pozvati readinto() za dohvaćanje bajta prije nego što upravljač pošalje sljedeći. Samo tvrdi IRQ.

IRQ_END_READ: int

Okida se kada je upravljač završio transakciju čitanja (primljen STOP / ponovljeni START). Može se obraditi tvrdim ili mekim IRQ povratnim pozivom.

IRQ_END_WRITE: int

Okida se kada je upravljač završio transakciju pisanja (primljen STOP / ponovljeni START). Može se obraditi tvrdim ili mekim IRQ povratnim pozivom. Potisnuto za transakciju koja zapisuje memorijsku adresu kada je konstruktoru dostavljen mem međuspremnik.