kelas I2CTarget -- perangkat target I2C

Target I2C adalah perangkat yang terhubung ke bus I2C dan dikendalikan oleh controller I2C. Target I2C dapat berupa berbagai bentuk. Kelas machine.I2CTarget mengimplementasikan target I2C yang dapat dikonfigurasi sebagai perangkat memori/register, atau sebagai perangkat I2C sembarang menggunakan callback (jika didukung oleh port).

Tersedia pada OpenMV Cam M4 / M7 / H7 / H7 Plus / Pure Thermal / RT1062 / AE3.

Contoh penggunaan untuk kasus perangkat memori:

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

Perhatikan bahwa beberapa port memerlukan id, dan mungkin pin scl dan sda, untuk diteruskan ke konstruktor I2CTarget, untuk memilih instans I2C hardware dan pin yang terhubung dengannya.

Saat dikonfigurasi sebagai perangkat memori, dimungkinkan juga untuk mendaftar dan menerima event. Misalnya untuk mendapat notifikasi saat memori dibaca/ditulis:

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)

Perangkat I2C yang lebih kompleks dapat diimplementasikan menggunakan set lengkap event. Misalnya, untuk melihat event mentah saat dipicu:

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)

Konstruktor

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)

Membangun dan mengembalikan objek I2CTarget baru menggunakan parameter berikut:

  • id mengidentifikasi periferal I2C tertentu. Nilai yang diizinkan bergantung pada port/board tertentu. Beberapa port memiliki nilai default sehingga parameter ini dapat dihilangkan.

  • addr adalah alamat I2C dari target.

  • addrsize adalah jumlah bit dalam alamat target I2C. Nilai yang valid adalah 7 dan 10.

  • mem adalah objek dengan protokol buffer yang dapat ditulis. Jika tidak ditentukan maka tidak ada memori pendukung dan data harus dibaca/ditulis menggunakan metode I2CTarget.readinto() dan I2CTarget.write().

  • mem_addrsize adalah jumlah bit dalam alamat memori. Nilai yang valid adalah 0, 8, 16, 24, dan 32.

  • scl adalah objek pin yang menentukan pin yang digunakan untuk SCL.

  • sda adalah objek pin yang menentukan pin yang digunakan untuk SDA.

Perhatikan bahwa beberapa port/board akan memiliki nilai default scl dan sda yang dapat diubah dalam konstruktor ini. Yang lain akan memiliki nilai tetap scl dan sda yang tidak dapat diubah.

Metode Umum

deinit() None

Deinisialisasi target I2C. Setelah metode ini dipanggil, hardware tidak akan lagi merespons permintaan di bus I2C, dan tidak ada metode lain yang dapat dipanggil.

readinto(buf: bytearray) int

Membaca ke dalam buffer yang diberikan semua byte tertunda yang ditulis oleh controller I2C. Mengembalikan jumlah byte yang dibaca.

write(buf: bytes) int

Menulis byte dari buffer yang diberikan, untuk diteruskan ke controller I2C setelah controller mengirimkan permintaan baca. Mengembalikan jumlah byte yang ditulis. Sebagian besar port hanya menerima satu byte sekaligus untuk metode ini.

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

Memasang handler IRQ yang dipanggil saat salah satu event yang dipilih oleh trigger terpicu. trigger adalah bitmask dari konstanta IRQ_* yang di-OR bersama; defaultnya terpicu di akhir setiap baca atau tulis dari sisi controller.

hard=True mendaftarkan handler hard-interrupt (tanpa alokasi heap dalam callback). Defaultnya adalah callback terjadwal. Berikan handler=None untuk menonaktifkan interupsi.

Catatan

IRQ_ADDR_MATCH_READ, IRQ_ADDR_MATCH_WRITE, IRQ_READ_REQ, dan IRQ_WRITE_REQ harus ditangani oleh callback hard IRQ (hard=True) karena event-event tersebut harus diakui secara sinkron dengan hardware. IRQ_END_READ dan IRQ_END_WRITE dapat ditangani oleh callback soft maupun hard; semua event berbagi satu handler, sehingga jika ada event yang membutuhkan hard callback maka semuanya harus menggunakan hard callback.

Ketika buffer memori disediakan ke konstruktor, driver menekan IRQ_END_WRITE untuk transaksi yang hanya menulis alamat memori. Hal ini membuat event akhir-transaksi tetap bermakna bahkan ketika penjadwal soft-IRQ menunda callback.

memaddr

Nilai integer dari alamat memori terbaru yang dipilih oleh controller I2C (hanya valid jika mem ditentukan dalam konstruktor).

Konstanta

Setiap konstanta IRQ_* adalah bit flag. OR-kan bersama untuk membangun mask trigger untuk irq(). Di dalam handler, kumpulan event yang terpicu dapat diperoleh melalui self.irq().flags() yang di-AND dengan setiap konstanta.

IRQ_ADDR_MATCH_READ: int

Terpicu saat controller mengalamatkan target ini untuk transaksi baca (byte alamat telah diterima dengan bit baca/tulis diset ke 1). Hanya Hard-IRQ.

IRQ_ADDR_MATCH_WRITE: int

Terpicu saat controller mengalamatkan target ini untuk transaksi tulis (byte alamat telah diterima dengan bit baca/tulis diset ke 0). Hanya Hard-IRQ.

IRQ_READ_REQ: int

Terpicu saat controller meminta byte dari target. Handler harus memanggil write() untuk menyediakan byte sebelum siklus clock controller selesai. Hanya Hard-IRQ.

IRQ_WRITE_REQ: int

Terpicu saat controller telah mendetak masuk sebuah byte ke target. Handler harus memanggil readinto() untuk mengambil byte sebelum controller mengirim yang berikutnya. Hanya Hard-IRQ.

IRQ_END_READ: int

Terpicu saat controller telah menyelesaikan transaksi baca (menerima STOP / repeated START). Dapat ditangani oleh callback hard atau soft IRQ.

IRQ_END_WRITE: int

Terpicu saat controller telah menyelesaikan transaksi tulis (menerima STOP / repeated START). Dapat ditangani oleh callback hard atau soft IRQ. Ditekan untuk transaksi yang menulis alamat memori ketika buffer mem disediakan ke konstruktor.