class SPI – Serial Peripheral Interface -väyläprotokolla (ohjainpuoli)

SPI on synkroninen sarjaprotokolla, jota ohjain ajaa. Fyysisellä tasolla väylä koostuu kolmesta linjasta: SCK, MOSI, MISO. Useat laitteet voivat jakaa saman väylän. Jokaisella laitteella tulisi olla erillinen, neljäs signaali, CS (Chip Select), joka valitsee tietyn laitteen väylältä, jonka kanssa kommunikoidaan. CS-signaalin hallinnan tulisi tapahtua käyttäjän koodissa (machine.Pin-luokan kautta).

Sekä laitteisto- että ohjelmistopohjaisia SPI-toteutuksia on olemassa SPI - ja SoftSPI -luokkien kautta. Laitteisto-SPI käyttää järjestelmän taustalla olevaa laitteistotukea luku- ja kirjoitusoperaatioiden suorittamiseen ja on yleensä tehokas ja nopea, mutta voi rajoittaa, mitä nastoja voidaan käyttää. Ohjelmisto-SPI toteutetaan bit-banging-menetelmällä, ja sitä voidaan käyttää millä tahansa nastalla, mutta se ei ole yhtä tehokas. Näillä luokilla on samat metodit käytettävissä, ja ne eroavat toisistaan pääasiassa rakentamistavan osalta.

Esimerkkikäyttö:

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.

Rakentajat

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)

Rakentaa SPI-olion annetulle väylälle, id. id-arvot riippuvat tietystä portista ja sen laitteistosta. Arvoja 0, 1 jne. käytetään yleisesti valitsemaan laitteisto-SPI-lohko #0, #1 jne.

Ilman lisäparametreja SPI-olio luodaan, mutta sitä ei alusteta (sillä on asetukset väylän viimeisimmästä alustuksesta, jos sellaista on). Jos annetaan lisäargumentteja, väylä alustetaan. Katso init alustuksen parametreja varten.

Metodit

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

Alustaa SPI-väylän annetuilla parametreilla:

  • baudrate on SCK-kellotaajuus.

  • polarity voi olla 0 tai 1, ja se on taso, jolla joutilas kellolinja pysyy.

  • phase voi olla 0 tai 1, jolloin data näytteistetään ensimmäisellä tai toisella kelloreunalla.

  • bits on kunkin siirron leveys bitteinä. Vain arvon 8 taataan olevan kaiken laitteiston tukema.

  • firstbit voi olla SPI.MSB tai SPI.LSB.

  • sck, mosi, miso ovat nasta-olioita (machine.Pin), joita käytetään väyläsignaaleille. Useimmissa laitteisto-SPI-lohkoissa (jotka valitaan rakentajan id -parametrilla) nastat ovat kiinteät eikä niitä voi muuttaa. Joissakin tapauksissa laitteistolohkot sallivat 2-3 vaihtoehtoista nastajoukkoa laitteisto-SPI-lohkolle. Mielivaltaiset nastamääritykset ovat mahdollisia vain bitbanging-SPI-ajurille (id = -1).

Laitteisto-SPI:n tapauksessa todellinen kellotaajuus voi olla pyydettyä siirtonopeutta alhaisempi. Tämä riippuu alustan laitteistosta. Todellinen nopeus voidaan selvittää tulostamalla SPI-olio.

deinit() None

Sammuttaa SPI-väylän.

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

Lukee nbytes -arvon määräämän määrän tavuja kirjoittaen samalla jatkuvasti yhtä tavua, joka annetaan parametrilla write. Palauttaa bytes -olion luetulla datalla.

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

Lukee puskuriin, joka määritetään parametrilla buf, kirjoittaen samalla jatkuvasti yhtä tavua, joka annetaan parametrilla write. Palauttaa None.

write(buf: bytes) None

Kirjoittaa puskurin buf sisältämät tavut. Palauttaa None.

write_readinto(write_buf: bytes, read_buf: bytearray) None

Kirjoittaa tavut puskurista write_buf lukien samalla puskuriin read_buf. Puskurit voivat olla samat tai erilaiset, mutta molempien puskureiden on oltava saman pituiset. Palauttaa None.

Vakiot

MSB: int

Anna parametrille firstbit lähettääksesi/vastaanottaaksesi merkitsevin bitti ensin (yleisin järjestys).

LSB: int

Anna parametrille firstbit lähettääksesi/vastaanottaaksesi vähiten merkitsevä bitti ensin.

class SoftSPI – ohjelmistolla emuloitu SPI-väylä

SoftSPI -luokka toteuttaa SPI:n bit-banging-menetelmällä mielivaltaisilla GPIO-nastoilla. Se tarjoaa saman metodipinnan kuin SPI, joten laitteisto-SPI:tä käyttävä olemassa oleva koodi voi vaihtaa ohjelmistoon pelkällä rakentajan muutoksella. Käytä sitä, kun tarvitsemiasi nastoja ei ole johdotettu laitteisto-SPI-lohkoon, kun tarvitset useampia kuin käytettävissä olevia laitteistoväyliä, tai kun oheislaite vaatii epästandardin kellovaiheistuksen, jota laitteisto ei pysty tuottamaan.

Rakentajat

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)

Rakentaa ohjelmisto-SPI-olion. sck, mosi ja miso on annettava – implisiittistä nastan valintaa ei ole. Katso SPI.init() muiden parametrien merkityksen osalta. Oletus baudrate on alhaisempi kuin laitteisto-SPI:llä, koska bit-bang-silmukassa on enemmän yleisrasitusta.

Metodit

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

Alustaa ohjelmisto-SPI-väylän uudelleen annetuilla parametreilla. Vain annetut argumentit päivitetään; muut säilyttävät aiemmat arvonsa. Katso SPI.init() kunkin argumentin merkityksen osalta.

deinit() None

Vapauttaa bit-bang-ajurin varaamat GPIO-nastat ja lopettaa väylän ohjaamisen.

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

Lukee nbytes tavua kirjoittaen samalla jatkuvasti yhtä tavua write. Palauttaa bytes -olion, joka sisältää vastaanotetun datan.

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

Lukee puskuriin buf kirjoittaen samalla jatkuvasti yhtä tavua write. Palauttaa None.

write(buf: bytes) None

Kirjoittaa buf väylälle. Vastaanotetut tavut hylätään.

write_readinto(write_buf: bytes, read_buf: bytearray) None

Kirjoittaa samanaikaisesti write_buf ja lukee puskuriin read_buf. Molempien puskureiden on oltava saman pituiset; ne voivat viitata samaan muistialueeseen.

Vakiot

MSB: int

Anna parametrille firstbit lähettääksesi/vastaanottaaksesi merkitsevin bitti ensin.

LSB: int

Anna parametrille firstbit lähettääksesi/vastaanottaaksesi vähiten merkitsevä bitti ensin.