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
busyang diberikan (indeks periferal bilangan bulat, misalnya2untukI2C2). Tanpa parameter tambahan objek dibuat tetapi tidak diinisialisasi (mempertahankan pengaturan bus sebelumnya, jika ada); jika argumen tambahan diberikan maka bus diinisialisasi. Lihatinit()untuk parameter yang tersedia.I2C(2)terhubung ke pin header yang sama pada setiap OpenMV Cam yang mengekspospyb.I2C(M4 / M7 / H7 / H7 Plus / Pure Thermal):Sinyal
Pin header
Catatan
SCLP4SDAP5I2C(4)juga tersedia pada OpenMV Cam M7, H7, H7 Plus dan Pure Thermal denganSCLpada pin headerP7danSDApada pin headerP8.OpenMV Cam N6 tidak mengekspos
pyb.I2C; gunakanmachine.I2Csebagai gantinya.Metode¶
- init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None¶
Inisialisasi bus I2C dengan parameter yang diberikan:
modeharus berupaI2C.CONTROLLERatauI2C.PERIPHERAL.addradalah alamat 7-bit (hanya bermakna untuk periferal).baudrateadalah kecepatan clock SCL (hanya bermakna untuk controller).gencallmenentukan apakah mendukung mode general-call.dmamenentukan 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:
datadapat berupa bilangan bulat (jumlah byte yang dibaca) atau buffer untuk dibacaaddradalah alamat perangkat I2Cmemaddradalah lokasi memori dalam perangkat I2Ctimeoutadalah timeout dalam milidetik untuk menunggu pembacaanaddr_sizememilih 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:
datadapat berupa bilangan bulat atau buffer untuk ditulis.addradalah alamat perangkat I2C.memaddradalah lokasi memori dalam perangkat I2C.timeoutadalah timeout dalam milidetik untuk menunggu penulisan.addr_sizememilih lebarmemaddr: 8 atau 16 bit.
Hanya valid dalam mode controller.
- recv(recv: int | bytearray, addr: int = 0x00, *, timeout: int = 5000) bytes¶
Terima data di bus:
recvdapat berupa bilangan bulat, yaitu jumlah byte yang diterima, atau buffer yang dapat diubah, yang akan diisi dengan byte yang diterimaaddradalah alamat untuk menerima dari (hanya diperlukan dalam mode controller)timeoutadalah timeout dalam milidetik untuk menunggu penerimaan
Nilai kembalian: jika
recvadalah bilangan bulat maka buffer baru dari byte yang diterima, jika tidak maka buffer yang sama yang dilewatkan kerecv.
- send(send: int | bytes | bytearray, addr: int = 0x00, *, timeout: int = 5000) None¶
Kirim data di bus:
sendadalah data yang akan dikirim (bilangan bulat untuk dikirim, atau objek buffer).addradalah alamat tujuan pengiriman (hanya diperlukan dalam mode controller).timeoutadalah timeout dalam milidetik untuk menunggu pengiriman.
Konstanta¶