klass I2C – ett tvåtrådigt seriellt protokoll¶
I2C är ett tvåtrådigt protokoll för kommunikation mellan enheter. På den fysiska nivån består det av två linjer, SCL (klocka) och SDA (data). OpenMV Cam tillhandahåller inte inbyggda pull-up-motstånd på någon av linjerna – externa pull-up-motstånd krävs på både SCL och SDA för att bussen ska fungera.
I2C-objekt är anslutna till en specifik buss och kan initieras vid konstruktionstid eller senare via init().
Exempel:
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
Att skriva ut I2C-objektet visar dess konfiguration.
Grundmetoderna är send() och 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
För att ta emot på plats, skapa först en bytearray
data = bytearray(3) # create a buffer
i2c.recv(data) # receive 3 bytes, writing them into data
Du kan ange en timeout (i ms):
i2c.send(b"123", timeout=2000) # timeout after 2 seconds
En styrenhet måste ange mottagarens adress:
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
En styrenhet har också dessa metoder:
# 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)
Konstruktorer¶
- class pyb.I2C(bus: int | str, *args, **kwargs)¶
Skapa ett I2C-objekt på den angivna
bus(ett heltalsindex för kringutrustningen, t.ex.2förI2C2). Utan ytterligare parametrar skapas objektet men initieras inte (det behåller de tidigare bussinställningarna, om några); om extra argument anges initieras bussen. Seinit()för de tillgängliga parametrarna.I2C(2)är kopplad till samma stift på kontakten på varje OpenMV Cam som exponerarpyb.I2C(M4 / M7 / H7 / H7 Plus / Pure Thermal):Signal
Stift på kontakt
Anmärkningar
SCLP4SDAP5I2C(4)är dessutom tillgänglig på OpenMV Cam M7, H7, H7 Plus och Pure Thermal medSCLpå stiftP7ochSDApå stiftP8på kontakten.OpenMV Cam N6 exponerar inte
pyb.I2C; användmachine.I2Cistället.Metoder¶
- init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None¶
Initiera I2C-bussen med de angivna parametrarna:
modemåste vara antingenI2C.CONTROLLERellerI2C.PERIPHERAL.addrär den 7-bitars adressen (endast meningsfullt för en peripheral-enhet).baudrateär SCL-klockfrekvensen (endast meningsfullt för en styrenhet).gencallanger om general-call-läge ska stödjas.dmaanger om användning av DMA för I2C-överföringarna ska tillåtas (observera att DMA-överföringar har mer exakt timing men för närvarande inte hanterar bussfel korrekt).
Den faktiska klockfrekvensen kan vara lägre än den begärda frekvensen. Detta beror på plattformens hårdvara. Den faktiska frekvensen kan fastställas genom att skriva ut I2C-objektet.
- is_ready(addr: int) bool¶
Kontrollera om en I2C-enhet svarar på den angivna adressen. Endast giltigt i controller-läge.
- mem_read(data: int | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) bytes¶
Läs från minnet på en I2C-enhet:
datakan vara ett heltal (antal bytes att läsa) eller en buffert att läsa in iaddrär I2C-enhetens adressmemaddrär minnesplatsen inom I2C-enhetentimeoutär timeouten i millisekunder att vänta på läsningenaddr_sizeväljer bredden på memaddr: 8 eller 16 bitar
Returnerar den lästa datan. Detta är endast giltigt i controller-läge.
- mem_write(data: int | bytes | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) None¶
Skriv till minnet på en I2C-enhet:
datakan vara ett heltal eller en buffert att skriva från.addrär I2C-enhetens adress.memaddrär minnesplatsen inom I2C-enheten.timeoutär timeouten i millisekunder att vänta på skrivningen.addr_sizeväljer bredden påmemaddr: 8 eller 16 bitar.
Endast giltigt i controller-läge.
- recv(recv: int | bytearray, addr: int = 0x00, *, timeout: int = 5000) bytes¶
Ta emot data på bussen:
recvkan vara ett heltal, vilket är antalet bytes att ta emot, eller en muterbar buffert, som fylls med mottagna bytesaddrär adressen att ta emot från (krävs endast i controller-läge)timeoutär timeouten i millisekunder att vänta på mottagningen
Returvärde: om
recvär ett heltal returneras en ny buffert med de mottagna byten, annars samma buffert som skickades in tillrecv.
- send(send: int | bytes | bytearray, addr: int = 0x00, *, timeout: int = 5000) None¶
Skicka data på bussen:
sendär datan att skicka (ett heltal att skicka, eller ett buffertobjekt).addrär adressen att skicka till (krävs endast i controller-läge).timeoutär timeouten i millisekunder att vänta på sändningen.
Konstanter¶