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()danI2CTarget.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
handlerIRQ yang dipanggil saat salah satu event yang dipilih olehtriggerterpicu.triggeradalah bitmask dari konstantaIRQ_*yang di-OR bersama; defaultnya terpicu di akhir setiap baca atau tulis dari sisi controller.hard=Truemendaftarkan handler hard-interrupt (tanpa alokasi heap dalam callback). Defaultnya adalah callback terjadwal. Berikanhandler=Noneuntuk menonaktifkan interupsi.Catatan
IRQ_ADDR_MATCH_READ,IRQ_ADDR_MATCH_WRITE,IRQ_READ_REQ, danIRQ_WRITE_REQharus ditangani oleh callback hard IRQ (hard=True) karena event-event tersebut harus diakui secara sinkron dengan hardware.IRQ_END_READdanIRQ_END_WRITEdapat 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_WRITEuntuk 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
memditentukan dalam konstruktor).
Konstanta¶
Setiap konstanta
IRQ_*adalah bit flag. OR-kan bersama untuk membangun masktriggeruntukirq(). Di dalam handler, kumpulan event yang terpicu dapat diperoleh melaluiself.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.