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ğin I2C2 için 2) ü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çin init() 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

SCL

P4

SDA

P5

I2C(4), ek olarak OpenMV Cam M7, H7, H7 Plus ve Pure Thermal üzerinde SCL başlık pini P7 ve SDA başlık pini P8 ile kullanılabilir.

OpenMV Cam N6 pyb.I2C özelliğini sunmaz; bunun yerine machine.I2C kullanın.

Yöntemler

deinit() None

I2C veri yolunu kapatır.

init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None

I2C veri yolunu verilen parametrelerle başlatır:

  • mode ya I2C.CONTROLLER ya da I2C.PERIPHERAL olmalıdır.

  • addr 7 bitlik adrestir (yalnızca bir çevre birimi için anlamlıdır).

  • baudrate SCL saat hızıdır (yalnızca bir denetleyici için anlamlıdır).

  • gencall genel çağrı (general-call) modunun desteklenip desteklenmeyeceğidir.

  • dma I2C 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:

  • data bir tam sayı (okunacak bayt sayısı) ya da içine okunacak bir arabellek olabilir

  • addr I2C aygıt adresidir

  • memaddr I2C aygıtı içindeki bellek konumudur

  • timeout okuma için beklenecek milisaniye cinsinden zaman aşımıdır

  • addr_size memaddr 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:

  • data bir tam sayı ya da içinden yazılacak bir arabellek olabilir.

  • addr I2C aygıt adresidir.

  • memaddr I2C aygıtı içindeki bellek konumudur.

  • timeout yazma için beklenecek milisaniye cinsinden zaman aşımıdır.

  • addr_size memaddr geniş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:

  • recv alınacak bayt sayısı olan bir tam sayı ya da alınan baytlarla doldurulacak değiştirilebilir bir arabellek olabilir

  • addr alınacak adrestir (yalnızca denetleyici modunda gereklidir)

  • timeout almak için beklenecek milisaniye cinsinden zaman aşımıdır

Dönüş değeri: recv bir tam sayıysa alınan baytların yeni bir arabelleği, aksi takdirde recv içine geçirilen aynı arabellektir.

send(send: int | bytes | bytearray, addr: int = 0x00, *, timeout: int = 5000) None

Veri yolunda veri gönderir:

  • send gönderilecek veridir (gönderilecek bir tam sayı ya da bir arabellek nesnesi).

  • addr gönderilecek adrestir (yalnızca denetleyici modunda gereklidir).

  • timeout göndermek için beklenecek milisaniye cinsinden zaman aşımıdır.

scan() List[int]

0x01’den 0x7f’ye kadar tüm I2C adreslerini tarar ve yanıt verenlerin bir listesini döndürür. Yalnızca denetleyici modundayken geçerlidir.

Sabitler

CONTROLLER: int

Veri yolunu ana cihaz (denetleyici) olarak başlatır – SCL‘yi sürer ve işlemleri başlatır.

PERIPHERAL: int

Veri yolunu, init() içinde ayarlanan addr üzerinde dinleyen ve aynı veri yolundaki bir denetleyici tarafından başlatılan işlemlere yanıt veren bir bağımlı (çevre birimi) olarak başlatır.