class I2C -- protokol serial dua kawat

I2C adalah protokol dua kawat untuk komunikasi antar perangkat. Pada level fisik terdiri dari dua jalur, SCL (clock) dan SDA (data). OpenMV Cam tidak menyediakan pull-up on-board pada salah satu jalur -- pull-up eksternal diperlukan pada SCL dan SDA agar bus dapat berfungsi.

Objek I2C terpasang ke bus tertentu dan dapat diinisialisasi pada saat pembuatan atau nanti melalui init().

Contoh:

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

Mencetak objek I2C menampilkan konfigurasinya.

Metode dasar adalah send() dan recv()

i2c.send("abc")      # send 3 bytes
i2c.send(0x42)       # send a single byte, given by the number
data = i2c.recv(3)   # receive 3 bytes

Untuk menerima data secara in-place, pertama buat bytearray

data = bytearray(3)  # create a buffer
i2c.recv(data)       # receive 3 bytes, writing them into data

Anda dapat menentukan timeout (dalam ms):

i2c.send(b"123", timeout=2000)   # timeout after 2 seconds

Controller harus menentukan alamat penerima:

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

Controller juga memiliki metode-metode ini:

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

Konstruktor

class pyb.I2C(bus: int | str, *args, **kwargs)

Buat objek I2C pada bus yang diberikan (indeks periferal bilangan bulat, misalnya 2 untuk I2C2). Tanpa parameter tambahan objek dibuat tetapi tidak diinisialisasi (mempertahankan pengaturan bus sebelumnya, jika ada); jika argumen tambahan diberikan maka bus diinisialisasi. Lihat init() untuk parameter yang tersedia.

I2C(2) terhubung ke pin header yang sama pada setiap OpenMV Cam yang mengekspos pyb.I2C (M4 / M7 / H7 / H7 Plus / Pure Thermal):

Sinyal

Pin header

Catatan

SCL

P4

SDA

P5

I2C(4) juga tersedia pada OpenMV Cam M7, H7, H7 Plus dan Pure Thermal dengan SCL pada pin header P7 dan SDA pada pin header P8.

OpenMV Cam N6 tidak mengekspos pyb.I2C; gunakan machine.I2C sebagai gantinya.

Metode

deinit() None

Matikan bus I2C.

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

Inisialisasi bus I2C dengan parameter yang diberikan:

  • mode harus berupa I2C.CONTROLLER atau I2C.PERIPHERAL.

  • addr adalah alamat 7-bit (hanya bermakna untuk periferal).

  • baudrate adalah kecepatan clock SCL (hanya bermakna untuk controller).

  • gencall menentukan apakah mendukung mode general-call.

  • dma menentukan apakah mengizinkan penggunaan DMA untuk transfer I2C (perhatikan bahwa transfer DMA memiliki timing yang lebih presisi tetapi saat ini tidak menangani kesalahan bus dengan benar).

Frekuensi clock aktual mungkin lebih rendah dari frekuensi yang diminta. Hal ini bergantung pada hardware platform. Kecepatan aktual dapat ditentukan dengan mencetak objek I2C.

is_ready(addr: int) bool

Periksa apakah perangkat I2C merespons alamat yang diberikan. Hanya valid dalam mode controller.

mem_read(data: int | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) bytes

Baca dari memori perangkat I2C:

  • data dapat berupa bilangan bulat (jumlah byte yang dibaca) atau buffer untuk dibaca

  • addr adalah alamat perangkat I2C

  • memaddr adalah lokasi memori dalam perangkat I2C

  • timeout adalah timeout dalam milidetik untuk menunggu pembacaan

  • addr_size memilih lebar memaddr: 8 atau 16 bit

Mengembalikan data yang dibaca. Ini hanya valid dalam mode controller.

mem_write(data: int | bytes | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) None

Tulis ke memori perangkat I2C:

  • data dapat berupa bilangan bulat atau buffer untuk ditulis.

  • addr adalah alamat perangkat I2C.

  • memaddr adalah lokasi memori dalam perangkat I2C.

  • timeout adalah timeout dalam milidetik untuk menunggu penulisan.

  • addr_size memilih lebar memaddr: 8 atau 16 bit.

Hanya valid dalam mode controller.

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

Terima data di bus:

  • recv dapat berupa bilangan bulat, yaitu jumlah byte yang diterima, atau buffer yang dapat diubah, yang akan diisi dengan byte yang diterima

  • addr adalah alamat untuk menerima dari (hanya diperlukan dalam mode controller)

  • timeout adalah timeout dalam milidetik untuk menunggu penerimaan

Nilai kembalian: jika recv adalah bilangan bulat maka buffer baru dari byte yang diterima, jika tidak maka buffer yang sama yang dilewatkan ke recv.

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

Kirim data di bus:

  • send adalah data yang akan dikirim (bilangan bulat untuk dikirim, atau objek buffer).

  • addr adalah alamat tujuan pengiriman (hanya diperlukan dalam mode controller).

  • timeout adalah timeout dalam milidetik untuk menunggu pengiriman.

scan() List[int]

Pindai semua alamat I2C dari 0x01 hingga 0x7f dan kembalikan daftar yang merespons. Hanya valid dalam mode controller.

Konstanta

CONTROLLER: int

Menginisialisasi bus sebagai master (controller) -- menggerakkan SCL dan memulai transaksi.

PERIPHERAL: int

Menginisialisasi bus sebagai slave (periferal) yang mendengarkan pada addr yang diatur dalam init() dan merespons transaksi yang dimulai oleh controller pada bus yang sama.