class I2CTarget – bir I2C hedef cihazı

I2C hedefi, bir I2C veri yoluna bağlanan ve bir I2C denetleyicisi tarafından kontrol edilen bir cihazdır. I2C hedefleri birçok biçimde olabilir. machine.I2CTarget sınıfı, bellek/yazmaç cihazı olarak veya (port tarafından destekleniyorsa) geri çağırmalar kullanılarak rastgele bir I2C cihazı olarak yapılandırılabilen bir I2C hedefi uygular.

OpenMV Cam M4 / M7 / H7 / H7 Plus / Pure Thermal / RT1062 / AE3 üzerinde mevcuttur.

Bir bellek cihazı durumu için örnek kullanım:

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

Bazı portların, bağlanılacak donanım I2C örneğini ve pinlerini seçmek için I2CTarget yapıcısına bir id ve belki de scl ve sda pinlerinin geçirilmesini gerektirdiğini unutmayın.

Bir bellek cihazı olarak yapılandırıldığında, olayları almak için kayıt olmak da mümkündür. Örneğin, bellek okunduğunda/yazıldığında bilgilendirilmek için:

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)

Daha karmaşık I2C cihazları, tüm olay kümesi kullanılarak uygulanabilir. Örneğin, ham olayları tetiklendikleri anda görmek için:

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)

Yapıcılar

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)

Aşağıdaki parametreleri kullanarak yeni bir I2CTarget nesnesi oluşturur ve döndürür:

  • id belirli bir I2C çevre birimini tanımlar. İzin verilen değerler belirli porta/karta bağlıdır. Bazı portların bir varsayılanı vardır ve bu durumda bu parametre atlanabilir.

  • addr, hedefin I2C adresidir.

  • addrsize, I2C hedef adresindeki bit sayısıdır. Geçerli değerler 7 ve 10’dur.

  • mem, yazılabilir olan ve buffer protokolüne sahip bir nesnedir. Belirtilmezse, destekleyen bir bellek yoktur ve veriler I2CTarget.readinto() ve I2CTarget.write() metotları kullanılarak okunmalı/yazılmalıdır.

  • mem_addrsize, bellek adresindeki bit sayısıdır. Geçerli değerler 0, 8, 16, 24 ve 32’dir.

  • scl, SCL için kullanılacak pini belirten bir pin nesnesidir.

  • sda, SDA için kullanılacak pini belirten bir pin nesnesidir.

Bazı portların/kartların bu yapıcıda değiştirilebilen varsayılan scl ve sda değerlerine sahip olacağını unutmayın. Diğerlerinin ise değiştirilemeyen sabit scl ve sda değerleri olacaktır.

Genel Metotlar

deinit() None

I2C hedefini sonlandırır. Bu metot çağrıldıktan sonra donanım artık I2C veri yolundaki isteklere yanıt vermez ve başka hiçbir metot çağrılamaz.

readinto(buf: bytearray) int

I2C denetleyicisi tarafından yazılan bekleyen baytları verilen arabelleğe okur. Okunan bayt sayısını döndürür.

write(buf: bytes) int

Verilen arabellekteki baytları, I2C denetleyicisi bir okuma isteği gönderdikten sonra ona geçirilmek üzere yazar. Yazılan bayt sayısını döndürür. Çoğu port bu metoda bir defada yalnızca bir bayt kabul eder.

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

trigger ile seçilen olaylardan biri tetiklendiğinde çağrılan bir IRQ handler kurar. trigger, OR’lanarak birleştirilen IRQ_* sabitlerinden oluşan bir bit maskesidir; varsayılan, her denetleyici tarafı okuma veya yazma işleminin sonunda tetiklenir.

hard=True bir donanım kesmesi işleyicisi kaydeder (geri çağırma içinde yığın ayırması yapılmaz). Varsayılan, zamanlanmış bir geri çağırmadır. Kesmeyi devre dışı bırakmak için handler=None geçirin.

Not

IRQ_ADDR_MATCH_READ, IRQ_ADDR_MATCH_WRITE, IRQ_READ_REQ ve IRQ_WRITE_REQ, olayların donanımla eşzamanlı olarak onaylanması gerektiğinden bir donanım IRQ geri çağırması (hard=True) tarafından işlenmelidir. IRQ_END_READ ve IRQ_END_WRITE ise yazılım veya donanım geri çağırmalarının her ikisi tarafından işlenebilir; tüm olaylar tek bir işleyiciyi paylaşır, dolayısıyla herhangi bir olay bir donanım geri çağırmasına ihtiyaç duyarsa hepsi duyar.

Yapıcıya bir bellek arabelleği sağlandığında, sürücü yalnızca bellek adresini yazan işlem için IRQ_END_WRITE‘ı bastırır. Bu, yazılım IRQ zamanlayıcısı geri çağırmayı ertelediğinde bile işlem sonu olaylarını anlamlı kılar.

memaddr

I2C denetleyicisi tarafından seçilen en son bellek adresinin tam sayı değeri (yalnızca yapıcıda mem belirtilmişse geçerlidir).

Sabitler

Her IRQ_* sabiti bir bayrak bitidir. irq() için bir trigger maskesi oluşturmak üzere bunları OR’layın. İşleyici içinde, tetiklenen olay kümesi her sabitle AND’lenen self.irq().flags() aracılığıyla geri elde edilebilir.

IRQ_ADDR_MATCH_READ: int

Bir denetleyici bu hedefi bir okuma işlemi için adreslediğinde tetiklenir (adres baytı, okuma/yazma biti 1 olarak ayarlanmış halde alınmıştır). Yalnızca donanım IRQ.

IRQ_ADDR_MATCH_WRITE: int

Bir denetleyici bu hedefi bir yazma işlemi için adreslediğinde tetiklenir (adres baytı, okuma/yazma biti 0 olarak ayarlanmış halde alınmıştır). Yalnızca donanım IRQ.

IRQ_READ_REQ: int

Denetleyici, hedeften bir bayt istediğinde tetiklenir. İşleyici, denetleyicinin saat döngüsü tamamlanmadan önce baytı sağlamak için write() çağırmalıdır. Yalnızca donanım IRQ.

IRQ_WRITE_REQ: int

Denetleyici, hedefe bir bayt aktardığında tetiklenir. İşleyici, denetleyici bir sonrakini göndermeden önce baytı almak için readinto() çağırmalıdır. Yalnızca donanım IRQ.

IRQ_END_READ: int

Denetleyici bir okuma işlemini tamamladığında (STOP / tekrarlanan START aldığında) tetiklenir. Donanım veya yazılım IRQ geri çağırmalarının her ikisi tarafından işlenebilir.

IRQ_END_WRITE: int

Denetleyici bir yazma işlemini tamamladığında (STOP / tekrarlanan START aldığında) tetiklenir. Donanım veya yazılım IRQ geri çağırmalarının her ikisi tarafından işlenebilir. Yapıcıya bir mem arabelleği sağlandığında, bellek adresini yazan işlem için bastırılır.