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()iI2CTarget.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
handlerkoji se poziva kada se okine jedan od događaja odabranih strigger.triggerje bitmaskaIRQ_*konstanti spojenih operacijom OR; zadano se okida na kraju svakog čitanja ili pisanja na strani upravljača.hard=Trueregistrira rukovatelj tvrdog prekida (bez alokacije na hrpi u povratnom pozivu). Zadano je raspoređeni povratni poziv. Proslijeditehandler=Noneza onemogućavanje prekida.Napomena
IRQ_ADDR_MATCH_READ,IRQ_ADDR_MATCH_WRITE,IRQ_READ_REQiIRQ_WRITE_REQmoraju se obraditi tvrdim IRQ povratnim pozivom (hard=True) jer se događaji moraju potvrditi sinkrono s hardverom.IRQ_END_READiIRQ_END_WRITEmogu 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_WRITEza 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
memnaveden u konstruktoru).
Konstante¶
Svaka
IRQ_*konstanta je zastavica bita. Spojite ih operacijom OR za izradutriggermaske zairq(). Unutar rukovatelja skup okinutih događaja može se dobiti pomoćuself.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.