SPI osztály – Serial Peripheral Interface buszprotokoll (vezérlő oldal)

Az SPI egy szinkron soros protokoll, amelyet egy vezérlő hajt meg. Fizikai szinten a busz 3 vonalból áll: SCK, MOSI, MISO. Több eszköz is megoszthatja ugyanazt a buszt. Minden eszköznek külön, 4. jellel, a CS (Chip Select) jellel kell rendelkeznie, hogy kiválasszon egy adott eszközt a buszon, amellyel a kommunikáció zajlik. A CS jel kezelésének a felhasználói kódban kell megtörténnie (a machine.Pin osztályon keresztül).

Mind hardveres, mind szoftveres SPI megvalósítás létezik a SPI és a SoftSPI osztályokon keresztül. A hardveres SPI a rendszer mögöttes hardvertámogatását használja az olvasások/írások végrehajtásához, és általában hatékony és gyors, de korlátozhatja, hogy mely lábak használhatók. A szoftveres SPI bit-banging módszerrel valósul meg, és bármely lábon használható, de nem olyan hatékony. Ezek az osztályok ugyanazokat a metódusokat teszik elérhetővé, és elsősorban a létrehozásuk módjában különböznek.

Példa használat:

from machine import SPI, Pin

spi = SPI(0, baudrate=400000)           # Create SPI peripheral 0 at frequency of 400kHz.
                                        # Depending on the use case, extra parameters may be required
                                        # to select the bus characteristics and/or pins to use.
cs = Pin(4, mode=Pin.OUT, value=1)      # Create chip-select on pin 4.

try:
    cs(0)                               # Select peripheral.
    spi.write(b"12345678")              # Write 8 bytes, and don't care about received data.
finally:
    cs(1)                               # Deselect peripheral.

try:
    cs(0)                               # Select peripheral.
    rxdata = spi.read(8, 0x42)          # Read 8 bytes while writing 0x42 for each byte.
finally:
    cs(1)                               # Deselect peripheral.

rxdata = bytearray(8)
try:
    cs(0)                               # Select peripheral.
    spi.readinto(rxdata, 0x42)          # Read 8 bytes inplace while writing 0x42 for each byte.
finally:
    cs(1)                               # Deselect peripheral.

txdata = b"12345678"
rxdata = bytearray(len(txdata))
try:
    cs(0)                               # Select peripheral.
    spi.write_readinto(txdata, rxdata)  # Simultaneously write and read bytes.
finally:
    cs(1)                               # Deselect peripheral.

Konstruktorok

class machine.SPI(id: int, baudrate: int = 1000000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None)

Létrehoz egy SPI objektumot a megadott id buszon. Az id értékei az adott porttól és annak hardverétől függenek. A 0, 1 stb. értékeket általában a #0, #1 stb. hardveres SPI blokk kiválasztására használják.

További paraméterek nélkül az SPI objektum létrejön, de nem inicializálódik (a busz legutóbbi inicializálásának beállításaival rendelkezik, ha volt ilyen). Ha további argumentumokat adsz meg, a busz inicializálódik. Az inicializálás paramétereihez lásd az init metódust.

Metódusok

init(baudrate: int = 1000000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = SPI.MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None) None

Inicializálja az SPI buszt a megadott paraméterekkel:

  • A baudrate az SCK órajel sebessége.

  • A polarity 0 vagy 1 lehet, és az a szint, amelyen a tétlen órajel vonal nyugszik.

  • A phase 0 vagy 1 lehet, az adatok rendre az első vagy a második órajelél során történő mintavételezéséhez.

  • A bits az egyes átvitelek szélessége bitekben. Csak a 8 bit támogatása garantált minden hardveren.

  • A firstbit SPI.MSB vagy SPI.LSB lehet.

  • Az sck, mosi, miso a buszjelekhez használandó láb (machine.Pin) objektumok. A legtöbb hardveres SPI blokk esetén (amelyet a konstruktor id paramétere választ ki) a lábak rögzítettek és nem módosíthatók. Bizonyos esetekben a hardveres blokkok 2-3 alternatív lábkészletet engednek meg egy hardveres SPI blokkhoz. Tetszőleges lábkiosztás csak bitbanging SPI meghajtó esetén lehetséges (id = -1).

Hardveres SPI esetén a tényleges órajel-frekvencia alacsonyabb lehet a kért átviteli sebességnél. Ez a platform hardverétől függ. A tényleges sebesség az SPI objektum kinyomtatásával állapítható meg.

deinit() None

Kikapcsolja az SPI buszt.

read(nbytes: int, write: int = 0x00) bytes

Beolvas annyi bájtot, amennyit a nbytes megad, miközben folyamatosan kiírja a write által megadott egyetlen bájtot. Visszaad egy bytes objektumot a beolvasott adatokkal.

readinto(buf: bytearray, write: int = 0x00) None

Beolvas a buf által megadott pufferbe, miközben folyamatosan kiírja a write által megadott egyetlen bájtot. None értéket ad vissza.

write(buf: bytes) None

Kiírja a buf pufferben található bájtokat. None értéket ad vissza.

write_readinto(write_buf: bytes, read_buf: bytearray) None

Kiírja a write_buf pufferből származó bájtokat, miközben a read_buf pufferbe olvas. A pufferek lehetnek azonosak vagy különbözőek, de mindkét puffernek azonos hosszúságúnak kell lennie. None értéket ad vissza.

Konstansok

MSB: int

Add át a firstbit paraméternek a legjelentősebb bit elsőként történő átviteléhez/fogadásához (a leggyakoribb sorrend).

LSB: int

Add át a firstbit paraméternek a legkevésbé jelentős bit elsőként történő átviteléhez/fogadásához.

SoftSPI osztály – szoftveresen emulált SPI busz

A SoftSPI osztály úgy valósítja meg az SPI-t, hogy tetszőleges GPIO lábakat vezérel bit-banging módszerrel. Ugyanazt a metóduskészletet teszi elérhetővé, mint a SPI, így a hardveres SPI-t célzó meglévő kód mindössze egy konstruktor-módosítással átállhat szoftveresre. Akkor használd, ha a szükséges lábak nincsenek hardveres SPI blokkhoz kötve, ha több buszra van szükséged, mint amennyi hardveres elérhető, vagy ha egy periféria olyan nem szabványos órajel-fázist igényel, amelyet a hardver nem tud előállítani.

Konstruktorok

class machine.SoftSPI(baudrate: int = 500000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None)

Létrehoz egy szoftveres SPI objektumot. Az sck, mosi és miso lábakat meg kell adni – nincs implicit lábkiválasztás. A többi paraméter jelentéséhez lásd a SPI.init() metódust. Az alapértelmezett baudrate alacsonyabb, mint a hardveres SPI esetén, mert a bit-bang ciklusnak nagyobb a többletterhelése.

Metódusok

init(baudrate: int = 500000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = SoftSPI.MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None) None

Újrainicializálja a szoftveres SPI buszt a megadott paraméterekkel. Csak a megadott argumentumok frissülnek; a többi megtartja korábbi értékét. Az egyes argumentumok jelentéséhez lásd a SPI.init() metódust.

deinit() None

Felszabadítja a bit-bang meghajtó által lefoglalt GPIO lábakat, és leállítja a busz vezérlését.

read(nbytes: int, write: int = 0x00) bytes

Beolvas nbytes bájtot, miközben folyamatosan kiírja a write egyetlen bájtot. Visszaad egy bytes objektumot a fogadott adatokkal.

readinto(buf: bytearray, write: int = 0x00) None

Beolvas a buf pufferbe, miközben folyamatosan kiírja a write egyetlen bájtot. None értéket ad vissza.

write(buf: bytes) None

Kiírja a buf puffert a buszra. A fogadott bájtok eldobásra kerülnek.

write_readinto(write_buf: bytes, read_buf: bytearray) None

Egyidejűleg kiírja a write_buf puffert és beolvas a read_buf pufferbe. Mindkét puffernek azonos hosszúságúnak kell lennie; átfedhetik egymást.

Konstansok

MSB: int

Add át a firstbit paraméternek a legjelentősebb bit elsőként történő átviteléhez/fogadásához.

LSB: int

Add át a firstbit paraméternek a legkevésbé jelentős bit elsőként történő átviteléhez/fogadásához.