class I2C – kaksijohtiminen sarjaprotokolla

I2C on kaksijohtiminen protokolla laitteiden väliseen tiedonsiirtoon. Fyysisellä tasolla se koostuu kahdesta linjasta, SCL (kello) ja SDA (data). OpenMV Cam ei tarjoa laudalla olevia ylösvetoja kummallekaan linjalle – ulkoiset ylösvedot vaaditaan sekä linjalle SCL että SDA, jotta väylä toimii.

I2C-objektit on liitetty tiettyyn väylään, ja ne voidaan alustaa konstruoinnin yhteydessä tai myöhemmin metodilla init().

Esimerkki:

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

I2C-objektin tulostaminen näyttää sen määrityksen.

Perusmetodit ovat send() ja 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

Vastaanottaaksesi paikan päällä luo ensin bytearray

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

Voit määrittää aikakatkaisun (ms):

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

Ohjaimen on määritettävä vastaanottajan osoite:

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

Ohjaimella on myös nämä metodit:

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

Konstruktorit

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

Luo I2C-objekti annetulle väylälle bus (kokonaislukuna ilmaistava oheislaitteen indeksi, esim. 2 väylälle I2C2). Ilman lisäparametreja objekti luodaan mutta ei alusteta (se säilyttää aiemmat väyläasetukset, jos sellaisia on); jos lisäargumentteja annetaan, väylä alustetaan. Katso käytettävissä olevat parametrit kohdasta init().

I2C(2) on kytketty samoihin liitinnastoihin jokaisessa OpenMV Cam -kamerassa, joka tarjoaa pyb.I2C-luokan (M4 / M7 / H7 / H7 Plus / Pure Thermal):

Signaali

Liitinnasta

Huomautukset

SCL

P4

SDA

P5

I2C(4) on lisäksi käytettävissä OpenMV Cam M7-, H7-, H7 Plus- ja Pure Thermal -kameroissa, joissa SCL on liitinnastassa P7 ja SDA liitinnastassa P8.

OpenMV Cam N6 ei tarjoa pyb.I2C-luokkaa; käytä sen sijaan machine.I2C-luokkaa.

Metodit

deinit() None

Sammuta I2C-väylä.

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

Alusta I2C-väylä annetuilla parametreilla:

  • mode on oltava joko I2C.CONTROLLER tai I2C.PERIPHERAL.

  • addr on 7-bittinen osoite (järkevä vain oheislaitteelle).

  • baudrate on SCL-kellotaajuus (järkevä vain ohjaimelle).

  • gencall määrittää, tuetaanko yleiskutsutilaa (general call).

  • dma määrittää, sallitaanko DMA:n käyttö I2C-siirroissa (huomaa, että DMA-siirroilla on tarkempi ajoitus, mutta ne eivät tällä hetkellä käsittele väylävirheitä oikein).

Todellinen kellotaajuus voi olla pyydettyä taajuutta pienempi. Tämä riippuu alustan laitteistosta. Todellinen taajuus voidaan selvittää tulostamalla I2C-objekti.

is_ready(addr: int) bool

Tarkista, vastaako I2C-laite annettuun osoitteeseen. Pätee vain ohjaintilassa.

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

Lue I2C-laitteen muistista:

  • data voi olla kokonaisluku (luettavien tavujen määrä) tai puskuri, johon luetaan

  • addr on I2C-laitteen osoite

  • memaddr on muistipaikka I2C-laitteen sisällä

  • timeout on aikakatkaisu millisekunteina lukua odotettaessa

  • addr_size valitsee memaddr-arvon leveyden: 8 tai 16 bittiä

Palauttaa luetun datan. Tämä pätee vain ohjaintilassa.

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

Kirjoita I2C-laitteen muistiin:

  • data voi olla kokonaisluku tai puskuri, josta kirjoitetaan.

  • addr on I2C-laitteen osoite.

  • memaddr on muistipaikka I2C-laitteen sisällä.

  • timeout on aikakatkaisu millisekunteina kirjoitusta odotettaessa.

  • addr_size valitsee memaddr-arvon leveyden: 8 tai 16 bittiä.

Pätee vain ohjaintilassa.

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

Vastaanota dataa väylältä:

  • recv voi olla kokonaisluku, joka on vastaanotettavien tavujen määrä, tai muokattava puskuri, joka täytetään vastaanotetuilla tavuilla

  • addr on osoite, josta vastaanotetaan (vaaditaan vain ohjaintilassa)

  • timeout on aikakatkaisu millisekunteina vastaanottoa odotettaessa

Paluuarvo: jos recv on kokonaisluku, palautetaan uusi puskuri vastaanotetuista tavuista, muutoin sama puskuri, joka annettiin parametrille recv.

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

Lähetä dataa väylälle:

  • send on lähetettävä data (lähetettävä kokonaisluku tai puskuriobjekti).

  • addr on osoite, johon lähetetään (vaaditaan vain ohjaintilassa).

  • timeout on aikakatkaisu millisekunteina lähetystä odotettaessa.

scan() List[int]

Skannaa kaikki I2C-osoitteet välillä 0x01 ja 0x7f ja palauta luettelo niistä, jotka vastaavat. Pätee vain ohjaintilassa.

Vakiot

CONTROLLER: int

Alustaa väylän isäntänä (ohjaimena) – se ohjaa SCL-linjaa ja käynnistää siirtotapahtumat.

PERIPHERAL: int

Alustaa väylän orjana (oheislaitteena), joka kuuntelee metodilla init() asetettua osoitetta addr ja vastaa saman väylän ohjaimen käynnistämiin siirtotapahtumiin.