class I2C – iki telli bir seri protokol¶
I2C, aygıtlar arasında iletişim için iki telli bir protokoldür. Fiziksel düzeyde SCL (saat) ve SDA (veri) olmak üzere iki hattan oluşur. OpenMV Cam, her iki hat üzerinde de yerleşik çekme dirençleri sağlamaz – veri yolunun çalışması için hem SCL hem de SDA üzerinde harici çekme dirençleri gereklidir.
I2C nesneleri belirli bir veri yoluna bağlıdır ve yapım zamanında ya da daha sonra init() aracılığıyla başlatılabilir.
Örnek:
from pyb import I2C
i2c = I2C(2) # create on bus 2 (uninitialised)
i2c = I2C(2, I2C.CONTROLLER) # create and init as a controller
i2c.init(I2C.CONTROLLER, baudrate=20000) # init as a controller
i2c.init(I2C.PERIPHERAL, addr=0x42) # init as a peripheral with the given address
i2c.deinit() # turn off the peripheral
I2C nesnesini yazdırmak yapılandırmasını gösterir.
Temel yöntemler send() ve recv() yöntemleridir:
i2c.send("abc") # send 3 bytes
i2c.send(0x42) # send a single byte, given by the number
data = i2c.recv(3) # receive 3 bytes
Yerinde almak için önce bir bytearray oluşturun:
data = bytearray(3) # create a buffer
i2c.recv(data) # receive 3 bytes, writing them into data
Bir zaman aşımı (ms cinsinden) belirtebilirsiniz:
i2c.send(b"123", timeout=2000) # timeout after 2 seconds
Bir denetleyici, alıcının adresini belirtmelidir:
i2c.init(I2C.CONTROLLER)
i2c.send("123", 0x42) # send 3 bytes to peripheral with address 0x42
i2c.send(b"456", addr=0x42) # keyword for address
Bir denetleyicinin ayrıca şu yöntemleri vardır:
# Check if peripheral 0x42 is ready.
i2c.is_ready(0x42)
# Scan the bus and return a list of responding addresses.
i2c.scan()
# Read 3 bytes from peripheral 0x42 starting at memaddr 2.
i2c.mem_read(3, 0x42, 2)
# Write 3 bytes to peripheral 0x42 at memaddr 2.
i2c.mem_write("abc", 0x42, 2, timeout=1000)
Yapıcılar¶
- class pyb.I2C(bus: int | str, *args, **kwargs)¶
Verilen
bus(bir tam sayı çevre birimi indeksi, örneğinI2C2için2) üzerinde bir I2C nesnesi oluşturur. Ek parametre olmadan nesne oluşturulur ancak başlatılmaz (varsa önceki veri yolu ayarlarını korur); ek argümanlar verilirse veri yolu başlatılır. Kullanılabilir parametreler içininit()bölümüne bakın.I2C(2),pyb.I2Cözelliğini sunan her OpenMV Cam (M4 / M7 / H7 / H7 Plus / Pure Thermal) üzerinde aynı başlık pinlerine bağlıdır:Sinyal
Başlık pini
Notlar
SCLP4SDAP5I2C(4), ek olarak OpenMV Cam M7, H7, H7 Plus ve Pure Thermal üzerindeSCLbaşlık piniP7veSDAbaşlık piniP8ile kullanılabilir.OpenMV Cam N6
pyb.I2Cözelliğini sunmaz; bunun yerinemachine.I2Ckullanın.Yöntemler¶
- init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None¶
I2C veri yolunu verilen parametrelerle başlatır:
modeyaI2C.CONTROLLERya daI2C.PERIPHERALolmalıdır.addr7 bitlik adrestir (yalnızca bir çevre birimi için anlamlıdır).baudrateSCL saat hızıdır (yalnızca bir denetleyici için anlamlıdır).gencallgenel çağrı (general-call) modunun desteklenip desteklenmeyeceğidir.dmaI2C aktarımları için DMA kullanımına izin verilip verilmeyeceğidir (DMA aktarımlarının daha kesin zamanlamaya sahip olduğunu ancak şu anda veri yolu hatalarını düzgün şekilde ele almadığını unutmayın).
Gerçek saat frekansı, istenen frekanstan düşük olabilir. Bu, platform donanımına bağlıdır. Gerçek hız, I2C nesnesi yazdırılarak belirlenebilir.
- is_ready(addr: int) bool¶
Bir I2C aygıtının verilen adrese yanıt verip vermediğini denetler. Yalnızca denetleyici modundayken geçerlidir.
- mem_read(data: int | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) bytes¶
Bir I2C aygıtının belleğinden okur:
databir tam sayı (okunacak bayt sayısı) ya da içine okunacak bir arabellek olabiliraddrI2C aygıt adresidirmemaddrI2C aygıtı içindeki bellek konumudurtimeoutokuma için beklenecek milisaniye cinsinden zaman aşımıdıraddr_sizememaddr genişliğini seçer: 8 veya 16 bit
Okunan veriyi döndürür. Bu yalnızca denetleyici modunda geçerlidir.
- mem_write(data: int | bytes | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) None¶
Bir I2C aygıtının belleğine yazar:
databir tam sayı ya da içinden yazılacak bir arabellek olabilir.addrI2C aygıt adresidir.memaddrI2C aygıtı içindeki bellek konumudur.timeoutyazma için beklenecek milisaniye cinsinden zaman aşımıdır.addr_sizememaddrgenişliğini seçer: 8 veya 16 bit.
Yalnızca denetleyici modunda geçerlidir.
- recv(recv: int | bytearray, addr: int = 0x00, *, timeout: int = 5000) bytes¶
Veri yolunda veri alır:
recvalınacak bayt sayısı olan bir tam sayı ya da alınan baytlarla doldurulacak değiştirilebilir bir arabellek olabiliraddralınacak adrestir (yalnızca denetleyici modunda gereklidir)timeoutalmak için beklenecek milisaniye cinsinden zaman aşımıdır
Dönüş değeri:
recvbir tam sayıysa alınan baytların yeni bir arabelleği, aksi takdirderecviçine geçirilen aynı arabellektir.
- send(send: int | bytes | bytearray, addr: int = 0x00, *, timeout: int = 5000) None¶
Veri yolunda veri gönderir:
sendgönderilecek veridir (gönderilecek bir tam sayı ya da bir arabellek nesnesi).addrgönderilecek adrestir (yalnızca denetleyici modunda gereklidir).timeoutgöndermek için beklenecek milisaniye cinsinden zaman aşımıdır.
Sabitler¶