klasa I2C – dvožični serijski protokol

I2C je dvožični protokol za komunikaciju između uređaja. Na fizičkoj razini sastoji se od dvije linije, SCL (takt) i SDA (podaci). OpenMV Cam ne pruža ugrađene pull-up otpornike ni na jednoj liniji – vanjski pull-up otpornici potrebni su na obje linije SCL i SDA da bi sabirnica funkcionirala.

I2C objekti vezani su za određenu sabirnicu i mogu se inicijalizirati pri konstrukciji ili kasnije putem init().

Primjer:

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

Ispis I2C objekta prikazuje njegovu konfiguraciju.

Osnovne metode su send() i 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

Za primanje na mjestu, prvo stvorite bytearray

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

Možete odrediti istek vremena (u ms):

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

Kontroler mora odrediti adresu primatelja:

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

Kontroler također ima ove metode:

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

Konstruktori

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

Stvara I2C objekt na zadanoj sabirnici bus (cjelobrojni indeks periferije, npr. 2 za I2C2). Bez dodatnih parametara objekt se stvara, ali se ne inicijalizira (zadržava prethodne postavke sabirnice, ako ih ima); ako se navedu dodatni argumenti, sabirnica se inicijalizira. Pogledajte init() za dostupne parametre.

I2C(2) je ožičen na iste pinove zaglavlja na svakoj OpenMV Cam kameri koja izlaže pyb.I2C (M4 / M7 / H7 / H7 Plus / Pure Thermal):

Signal

Pin zaglavlja

Napomene

SCL

P4

SDA

P5

I2C(4) je dodatno dostupan na OpenMV Cam M7, H7, H7 Plus i Pure Thermal sa SCL na pinu zaglavlja P7 i SDA na pinu zaglavlja P8.

OpenMV Cam N6 ne izlaže pyb.I2C; umjesto toga koristite machine.I2C.

Metode

deinit() None

Isključuje I2C sabirnicu.

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

Inicijalizira I2C sabirnicu sa zadanim parametrima:

  • mode mora biti I2C.CONTROLLER ili I2C.PERIPHERAL.

  • addr je 7-bitna adresa (smislena samo za periferiju).

  • baudrate je brzina SCL takta (smislena samo za kontroler).

  • gencall označava treba li podržati način općeg poziva (general-call).

  • dma označava treba li dopustiti upotrebu DMA za I2C prijenose (napomena: DMA prijenosi imaju precizniji tajming, ali trenutačno ne obrađuju pravilno pogreške sabirnice).

Stvarna frekvencija takta može biti niža od zatražene frekvencije. To ovisi o hardveru platforme. Stvarna brzina može se utvrditi ispisom I2C objekta.

is_ready(addr: int) bool

Provjerava odgovara li I2C uređaj na zadanu adresu. Valjano samo u načinu kontrolera.

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

Čita iz memorije I2C uređaja:

  • data može biti cijeli broj (broj bajtova za čitanje) ili međuspremnik u koji se čita

  • addr je adresa I2C uređaja

  • memaddr je memorijska lokacija unutar I2C uređaja

  • timeout je istek vremena u milisekundama za čekanje na čitanje

  • addr_size odabire širinu memaddr: 8 ili 16 bita

Vraća pročitane podatke. Ovo je valjano samo u načinu kontrolera.

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

Zapisuje u memoriju I2C uređaja:

  • data može biti cijeli broj ili međuspremnik iz kojeg se zapisuje.

  • addr je adresa I2C uređaja.

  • memaddr je memorijska lokacija unutar I2C uređaja.

  • timeout je istek vremena u milisekundama za čekanje na zapisivanje.

  • addr_size odabire širinu memaddr: 8 ili 16 bita.

Valjano samo u načinu kontrolera.

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

Prima podatke na sabirnici:

  • recv može biti cijeli broj, koji je broj bajtova za primanje, ili promjenjiv međuspremnik koji će se popuniti primljenim bajtovima

  • addr je adresa s koje se prima (potrebna samo u načinu kontrolera)

  • timeout je istek vremena u milisekundama za čekanje na primanje

Povratna vrijednost: ako je recv cijeli broj, tada novi međuspremnik s primljenim bajtovima, inače isti međuspremnik koji je proslijeđen u recv.

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

Šalje podatke na sabirnicu:

  • send su podaci za slanje (cijeli broj za slanje ili objekt međuspremnika).

  • addr je adresa na koju se šalje (potrebna samo u načinu kontrolera).

  • timeout je istek vremena u milisekundama za čekanje na slanje.

scan() List[int]

Skenira sve I2C adrese od 0x01 do 0x7f i vraća popis onih koje odgovaraju. Valjano samo u načinu kontrolera.

Konstante

CONTROLLER: int

Inicijalizira sabirnicu kao master (kontroler) – on pokreće SCL i započinje transakcije.

PERIPHERAL: int

Inicijalizira sabirnicu kao slave (periferiju) koja sluša na adresi addr postavljenoj u init() i odgovara na transakcije koje pokreće kontroler na istoj sabirnici.