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()veI2CTarget.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¶
triggerile seçilen olaylardan biri tetiklendiğinde çağrılan bir IRQhandlerkurar.trigger, OR’lanarak birleştirilenIRQ_*sabitlerinden oluşan bir bit maskesidir; varsayılan, her denetleyici tarafı okuma veya yazma işleminin sonunda tetiklenir.hard=Truebir 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çinhandler=Nonegeçirin.Not
IRQ_ADDR_MATCH_READ,IRQ_ADDR_MATCH_WRITE,IRQ_READ_REQveIRQ_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_READveIRQ_END_WRITEise 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
membelirtilmişse geçerlidir).
Sabitler¶
Her
IRQ_*sabiti bir bayrak bitidir.irq()için birtriggermaskesi oluşturmak üzere bunları OR’layın. İşleyici içinde, tetiklenen olay kümesi her sabitle AND’lenenself.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
1olarak 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
0olarak 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.