třída SPI – protokol sběrnice Serial Peripheral Interface (strana řadiče)

SPI je synchronní sériový protokol řízený řadičem. Na fyzické úrovni se sběrnice skládá ze 3 linek: SCK, MOSI, MISO. Stejnou sběrnici může sdílet více zařízení. Každé zařízení by mělo mít samostatný, 4. signál CS (Chip Select) pro výběr konkrétního zařízení na sběrnici, se kterým komunikace probíhá. Správa signálu CS by měla probíhat v uživatelském kódu (přes třídu machine.Pin).

Existují jak hardwarové, tak softwarové implementace SPI prostřednictvím tříd SPI a SoftSPI. Hardwarové SPI využívá pro provádění čtení/zápisu základní hardwarovou podporu systému a je obvykle efektivní a rychlé, ale může mít omezení na to, které piny lze použít. Softwarové SPI je implementováno bit-bangingem a lze jej použít na libovolném pinu, ale není tak efektivní. Tyto třídy mají k dispozici stejné metody a liší se především způsobem konstrukce.

Příklad použití:

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.

Konstruktory

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)

Vytvoří objekt SPI na dané sběrnici, id. Hodnoty id závisí na konkrétním portu a jeho hardwaru. Hodnoty 0, 1 atd. se běžně používají pro výběr hardwarového SPI bloku #0, #1 atd.

Bez dalších parametrů je objekt SPI vytvořen, ale není inicializován (má nastavení z poslední inicializace sběrnice, pokud nějaká proběhla). Pokud jsou zadány další argumenty, sběrnice se inicializuje. Parametry inicializace viz init.

Metody

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

Inicializuje sběrnici SPI s danými parametry:

  • baudrate je hodinová frekvence SCK.

  • polarity může být 0 nebo 1 a je to úroveň, na které leží nečinná hodinová linka.

  • phase může být 0 nebo 1 pro vzorkování dat na první, resp. druhé hodinové hraně.

  • bits je šířka každého přenosu v bitech. Veškerým hardwarem je zaručeně podporována pouze hodnota 8.

  • firstbit může být SPI.MSB nebo SPI.LSB.

  • sck, mosi, miso jsou objekty pinů (machine.Pin) použité pro signály sběrnice. Pro většinu hardwarových SPI bloků (vybíraných parametrem id konstruktoru) jsou piny pevné a nelze je měnit. V některých případech hardwarové bloky umožňují 2-3 alternativní sady pinů pro hardwarový SPI blok. Libovolné přiřazení pinů je možné pouze pro bit-bangingový ovladač SPI (id = -1).

V případě hardwarového SPI může být skutečná hodinová frekvence nižší než požadovaná přenosová rychlost. To závisí na hardwaru platformy. Skutečnou rychlost lze zjistit vytištěním objektu SPI.

deinit() None

Vypne sběrnici SPI.

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

Přečte počet bajtů zadaný pomocí nbytes a přitom průběžně zapisuje jediný bajt zadaný pomocí write. Vrátí objekt bytes s přečtenými daty.

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

Čte do bufferu zadaného pomocí buf a přitom průběžně zapisuje jediný bajt zadaný pomocí write. Vrátí None.

write(buf: bytes) None

Zapíše bajty obsažené v buf. Vrátí None.

write_readinto(write_buf: bytes, read_buf: bytearray) None

Zapíše bajty z write_buf a přitom čte do read_buf. Buffery mohou být stejné nebo různé, ale oba musí mít stejnou délku. Vrátí None.

Konstanty

MSB: int

Předejte do firstbit pro přenos/příjem nejvýznamnějšího bitu jako prvního (nejběžnější pořadí).

LSB: int

Předejte do firstbit pro přenos/příjem nejméně významného bitu jako prvního.

třída SoftSPI – softwarově emulovaná sběrnice SPI

Třída SoftSPI implementuje SPI bit-bangingem libovolných GPIO pinů. Vystavuje stejnou sadu metod jako SPI, takže existující kód cílící na hardwarové SPI lze přepnout na softwarové pouze změnou konstruktoru. Použijte ji, když piny, které potřebujete, nejsou zapojeny k hardwarovému SPI bloku, když potřebujete více než dostupné hardwarové sběrnice, nebo když periferie vyžaduje nestandardní fázování hodin, které hardware neumí vytvořit.

Konstruktory

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)

Vytvoří softwarový objekt SPI. sck, mosi a miso musí být dodány – neexistuje žádný implicitní výběr pinů. Význam ostatních parametrů viz SPI.init(). Výchozí baudrate je nižší než pro hardwarové SPI, protože bit-bangingová smyčka má větší režii.

Metody

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

Znovu inicializuje softwarovou sběrnici SPI s danými parametry. Aktualizují se pouze dodané argumenty; ostatní si ponechávají své předchozí hodnoty. Význam každého argumentu viz SPI.init().

deinit() None

Uvolní GPIO piny nárokované bit-bangingovým ovladačem a přestane řídit sběrnici.

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

Přečte nbytes bajtů a přitom průběžně zapisuje jediný bajt write. Vrátí objekt bytes obsahující přijatá data.

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

Čte do buf a přitom průběžně zapisuje jediný bajt write. Vrátí None.

write(buf: bytes) None

Zapíše buf na sběrnici. Přijaté bajty jsou zahozeny.

write_readinto(write_buf: bytes, read_buf: bytearray) None

Současně zapíše write_buf a čte do read_buf. Oba buffery musí mít stejnou délku; mohou se překrývat.

Konstanty

MSB: int

Předejte do firstbit pro přenos/příjem nejvýznamnějšího bitu jako prvního.

LSB: int

Předejte do firstbit pro přenos/příjem nejméně významného bitu jako prvního.