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:
baudrateje hodinová frekvence SCK.polaritymůže být 0 nebo 1 a je to úroveň, na které leží nečinná hodinová linka.phasemůže být 0 nebo 1 pro vzorkování dat na první, resp. druhé hodinové hraně.bitsje šířka každého přenosu v bitech. Veškerým hardwarem je zaručeně podporována pouze hodnota 8.firstbitmůže býtSPI.MSBneboSPI.LSB.sck,mosi,misojsou objekty pinů (machine.Pin) použité pro signály sběrnice. Pro většinu hardwarových SPI bloků (vybíraných parametremidkonstruktoru) 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.
- read(nbytes: int, write: int = 0x00) bytes¶
Přečte počet bajtů zadaný pomocí
nbytesa přitom průběžně zapisuje jediný bajt zadaný pomocíwrite. Vrátí objektbytess přečtenými daty.
Konstanty¶
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,mosiamisomusí být dodány – neexistuje žádný implicitní výběr pinů. Význam ostatních parametrů vizSPI.init(). Výchozíbaudrateje 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().
- read(nbytes: int, write: int = 0x00) bytes¶
Přečte
nbytesbajtů a přitom průběžně zapisuje jediný bajtwrite. Vrátí objektbytesobsahující přijatá data.
Konstanty¶