class SPI – protokol sabirnice Serial Peripheral Interface (strana kontrolera)

SPI je sinkroni serijski protokol kojim upravlja kontroler. Na fizičkoj razini sabirnica se sastoji od 3 linije: SCK, MOSI, MISO. Više uređaja može dijeliti istu sabirnicu. Svaki uređaj treba imati zaseban, 4. signal, CS (Chip Select), za odabir određenog uređaja na sabirnici s kojim se odvija komunikacija. Upravljanje CS signalom treba se odvijati u korisničkom kodu (putem klase machine.Pin).

Postoje i hardverska i softverska implementacija SPI-ja putem klasa SPI i SoftSPI. Hardverski SPI koristi temeljnu hardversku podršku sustava za izvođenje čitanja/pisanja i obično je učinkovit i brz, ali može imati ograničenja na to koji se pinovi mogu koristiti. Softverski SPI implementiran je bit-banging tehnikom i može se koristiti na bilo kojem pinu, ali nije toliko učinkovit. Ove klase imaju iste dostupne metode i razlikuju se prvenstveno u načinu na koji se konstruiraju.

Primjer upotrebe:

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.

Konstruktori

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)

Konstruira SPI objekt na zadanoj sabirnici, id. Vrijednosti id-a ovise o određenom portu i njegovom hardveru. Vrijednosti 0, 1 itd. obično se koriste za odabir hardverskog SPI bloka #0, #1 itd.

Bez dodatnih parametara, SPI objekt se stvara, ali ne inicijalizira (ima postavke od posljednje inicijalizacije sabirnice, ako ih je bilo). Ako su navedeni dodatni argumenti, sabirnica se inicijalizira. Pogledajte init za parametre inicijalizacije.

Metode

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

Inicijalizira SPI sabirnicu sa zadanim parametrima:

  • baudrate je brzina takta SCK-a.

  • polarity može biti 0 ili 1 i predstavlja razinu na kojoj se nalazi taktna linija u mirovanju.

  • phase može biti 0 ili 1 za uzorkovanje podataka na prvom odnosno drugom bridu takta.

  • bits je širina svakog prijenosa u bitovima. Samo je 8 zajamčeno podržano na svom hardveru.

  • firstbit može biti SPI.MSB ili SPI.LSB.

  • sck, mosi, miso su pin objekti (machine.Pin) koji se koriste za signale sabirnice. Za većinu hardverskih SPI blokova (koje odabire parametar id konstruktora) pinovi su fiksni i ne mogu se mijenjati. U nekim slučajevima hardverski blokovi dopuštaju 2-3 alternativna skupa pinova za hardverski SPI blok. Proizvoljna dodjela pinova moguća je samo za bitbanging SPI upravljački program (id = -1).

U slučaju hardverskog SPI-ja stvarna frekvencija takta može biti niža od zatražene brzine baud. To ovisi o hardveru platforme. Stvarna brzina može se utvrditi ispisom SPI objekta.

deinit() None

Isključuje SPI sabirnicu.

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

Čita broj bajtova zadan s nbytes uz neprekidno pisanje jednog bajta zadanog s write. Vraća objekt bytes s pročitanim podacima.

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

Čita u međuspremnik zadan s buf uz neprekidno pisanje jednog bajta zadanog s write. Vraća None.

write(buf: bytes) None

Piše bajtove sadržane u buf. Vraća None.

write_readinto(write_buf: bytes, read_buf: bytearray) None

Piše bajtove iz write_buf uz istovremeno čitanje u read_buf. Međuspremnici mogu biti isti ili različiti, ali oba moraju imati istu duljinu. Vraća None.

Konstante

MSB: int

Proslijedite parametru firstbit za odašiljanje/primanje najznačajnijeg bita prvog (najčešći poredak).

LSB: int

Proslijedite parametru firstbit za odašiljanje/primanje najmanje značajnog bita prvog.

class SoftSPI – softverski emulirana SPI sabirnica

Klasa SoftSPI implementira SPI bit-banging tehnikom na proizvoljnim GPIO pinovima. Izlaže isti skup metoda kao SPI pa postojeći kod koji cilja hardverski SPI može prijeći na softverski samo promjenom konstruktora. Koristite ju kada pinovi koji su vam potrebni nisu ožičeni na hardverski SPI blok, kada vam treba više od dostupnih hardverskih sabirnica ili kada periferija zahtijeva nestandardno faziranje takta koje hardver ne može proizvesti.

Konstruktori

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)

Konstruira softverski SPI objekt. sck, mosi i miso moraju biti navedeni – ne postoji implicitni odabir pinova. Pogledajte SPI.init() za značenje ostalih parametara. Zadani baudrate niži je nego za hardverski SPI jer bit-bang petlja ima više dodatnog troška.

Metode

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

Ponovno inicijalizira softversku SPI sabirnicu sa zadanim parametrima. Ažuriraju se samo navedeni argumenti; ostali zadržavaju svoje prethodne vrijednosti. Pogledajte SPI.init() za značenje svakog argumenta.

deinit() None

Otpušta GPIO pinove koje je zauzeo bit-bang upravljački program i prestaje upravljati sabirnicom.

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

Čita nbytes bajtova uz neprekidno pisanje jednog bajta write. Vraća objekt bytes koji sadrži primljene podatke.

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

Čita u buf uz neprekidno pisanje jednog bajta write. Vraća None.

write(buf: bytes) None

Piše buf na sabirnicu. Primljeni bajtovi se odbacuju.

write_readinto(write_buf: bytes, read_buf: bytearray) None

Istovremeno piše write_buf i čita u read_buf. Oba međuspremnika moraju biti iste duljine; mogu se preklapati.

Konstante

MSB: int

Proslijedite parametru firstbit za odašiljanje/primanje najznačajnijeg bita prvog.

LSB: int

Proslijedite parametru firstbit za odašiljanje/primanje najmanje značajnog bita prvog.