class I2CTarget – en I2C-målenhet¶
Ett I2C-mål är en enhet som ansluter till en I2C-buss och styrs av en I2C-styrenhet. I2C-mål kan ta många former. Klassen machine.I2CTarget implementerar ett I2C-mål som kan konfigureras som en minnes-/registerenhet, eller som en godtycklig I2C-enhet genom att använda återanrop (om porten stöder det).
Tillgänglig på OpenMV Cam M4 / M7 / H7 / H7 Plus / Pure Thermal / RT1062 / AE3.
Exempel på användning för fallet med en minnesenhet:
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()
Observera att vissa portar kräver att ett id, och kanske scl- och sda-stift, skickas till I2CTarget-konstruktorn för att välja den hårdvaru-I2C-instans och de stift som den ansluter till.
När den är konfigurerad som en minnesenhet är det också möjligt att registrera sig för att ta emot händelser. Till exempel för att bli meddelad när minnet läses/skrivs:
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)
Mer komplicerade I2C-enheter kan implementeras med hjälp av den fullständiga uppsättningen händelser. Till exempel för att se de råa händelserna när de utlöses:
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)
Konstruktorer¶
- 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)¶
Konstruera och returnera ett nytt I2CTarget-objekt med följande parametrar:
id identifierar en viss I2C-kringutrustning. Tillåtna värden beror på den specifika porten/kortet. Vissa portar har ett standardvärde, i vilket fall denna parameter kan utelämnas.
addr är målets I2C-adress.
addrsize är antalet bitar i I2C-måladressen. Giltiga värden är 7 och 10.
mem är ett objekt med buffertprotokollet som är skrivbart. Om det inte anges finns det inget bakomliggande minne och data måste läsas/skrivas med metoderna
I2CTarget.readinto()ochI2CTarget.write().mem_addrsize är antalet bitar i minnesadressen. Giltiga värden är 0, 8, 16, 24 och 32.
scl är ett stiftobjekt som anger vilket stift som ska användas för SCL.
sda är ett stiftobjekt som anger vilket stift som ska användas för SDA.
Observera att vissa portar/kort har standardvärden för scl och sda som kan ändras i denna konstruktor. Andra har fasta värden för scl och sda som inte kan ändras.
Allmänna metoder¶
- deinit() None¶
Avinitialisera I2C-målet. Efter att denna metod har anropats svarar hårdvaran inte längre på förfrågningar på I2C-bussen, och inga andra metoder kan anropas.
- readinto(buf: bytearray) int¶
Läs in i den angivna bufferten eventuella väntande byte som skrivits av I2C-styrenheten. Returnerar antalet lästa byte.
- write(buf: bytes) int¶
Skriv ut byten från den angivna bufferten, som ska skickas till I2C-styrenheten efter att den skickat en läsförfrågan. Returnerar antalet skrivna byte. De flesta portar accepterar bara en byte i taget till denna metod.
- irq(handler: Callable[[I2CTarget], None] | None = None, trigger: int = IRQ_END_READ | IRQ_END_WRITE, hard: bool = False) None¶
Installera en IRQ-
handlersom anropas när någon av händelserna som väljs avtriggerutlöses.triggerär en bitmask avIRQ_*-konstanter OR-ade tillsammans; standardvärdet utlöses vid slutet av varje styrenhetssidig läsning eller skrivning.hard=Trueregistrerar en hård-avbrottshanterare (ingen heap-allokering i återanropet). Standardvärdet är ett schemalagt återanrop. Skickahandler=Noneför att inaktivera avbrottet.Anteckning
IRQ_ADDR_MATCH_READ,IRQ_ADDR_MATCH_WRITE,IRQ_READ_REQochIRQ_WRITE_REQmåste hanteras av ett hårt IRQ-återanrop (hard=True) eftersom händelserna måste kvitteras synkront med hårdvaran.IRQ_END_READochIRQ_END_WRITEkan hanteras av antingen mjuka eller hårda återanrop; alla händelser delar en enda hanterare, så om någon händelse behöver ett hårt återanrop behöver alla det.När en minnesbuffert tillhandahålls till konstruktorn undertrycker drivrutinen
IRQ_END_WRITEför den transaktion som endast skriver minnesadressen. Detta håller transaktionsslutshändelserna meningsfulla även när mjuk-IRQ-schemaläggaren skjuter upp återanropet.
- memaddr¶
Heltalsvärdet för den senaste minnesadressen som valdes av I2C-styrenheten (endast giltigt om
memangavs i konstruktorn).
Konstanter¶
Varje
IRQ_*-konstant är en flaggbit. OR:a dem tillsammans för att bygga entrigger-mask förirq(). Inuti hanteraren kan uppsättningen utlösta händelser återställas viaself.irq().flags()AND-ad med varje konstant.- IRQ_ADDR_MATCH_READ: int¶
Utlöses när en styrenhet adresserar detta mål för en lästransaktion (adressbyten har tagits emot med läs/skriv-biten satt till
1). Endast hård-IRQ.
- IRQ_ADDR_MATCH_WRITE: int¶
Utlöses när en styrenhet adresserar detta mål för en skrivtransaktion (adressbyten har tagits emot med läs/skriv-biten satt till
0). Endast hård-IRQ.
- IRQ_READ_REQ: int¶
Utlöses när styrenheten begär en byte från målet. Hanteraren måste anropa
write()för att tillhandahålla byten innan styrenhetens klockcykel slutförs. Endast hård-IRQ.
- IRQ_WRITE_REQ: int¶
Utlöses när styrenheten har klockat in en byte till målet. Hanteraren måste anropa
readinto()för att hämta byten innan styrenheten skickar nästa. Endast hård-IRQ.