class SPI – ett bussprotokoll för Serial Peripheral Interface (styrenhetssidan)¶
SPI är ett synkront seriellt protokoll som drivs av en styrenhet. På fysisk nivå består en buss av 3 ledningar: SCK, MOSI, MISO. Flera enheter kan dela samma buss. Varje enhet bör ha en separat, fjärde signal, CS (Chip Select), för att välja en viss enhet på en buss som kommunikationen sker med. Hanteringen av en CS-signal bör ske i användarkod (via klassen machine.Pin).
Det finns både hårdvaru- och mjukvaruimplementeringar av SPI via klasserna SPI och SoftSPI. Hårdvaru-SPI använder systemets underliggande hårdvarustöd för att utföra läsningar/skrivningar och är vanligtvis effektivt och snabbt men kan ha begränsningar i fråga om vilka stift som kan användas. Mjukvaru-SPI implementeras genom bit-banging och kan användas på vilket stift som helst men är inte lika effektivt. Dessa klasser har samma metoder tillgängliga och skiljer sig huvudsakligen i hur de konstrueras.
Exempel på användning:
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.
Konstruktorer¶
- 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)¶
Konstruera ett SPI-objekt på den angivna bussen, id. Värdena på id beror på en viss port och dess hårdvara. Värdena 0, 1 osv. används vanligtvis för att välja hårdvaru-SPI-block nr 0, nr 1 osv.
Utan ytterligare parametrar skapas SPI-objektet men initieras inte (det har inställningarna från den senaste initieringen av bussen, om någon). Om extra argument anges initieras bussen. Se
initför initieringsparametrar.Metoder¶
- 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¶
Initiera SPI-bussen med de angivna parametrarna:
baudrateär klockfrekvensen för SCK.polaritykan vara 0 eller 1, och är den nivå som den inaktiva klockledningen ligger på.phasekan vara 0 eller 1 för att sampla data på respektive första eller andra klockflanken.bitsär bredden i bitar för varje överföring. Endast 8 garanteras stödjas av all hårdvara.firstbitkan varaSPI.MSBellerSPI.LSB.sck,mosi,misoär stift (machine.Pin-objekt) som ska användas för bussignaler. För de flesta hårdvaru-SPI-block (som väljs med parameternidtill konstruktorn) är stiften fasta och kan inte ändras. I vissa fall tillåter hårdvarublock 2-3 alternativa stiftuppsättningar för ett hårdvaru-SPI-block. Godtyckliga stifttilldelningar är möjliga endast för en bit-banging-SPI-drivrutin (id= -1).
I fallet med hårdvaru-SPI kan den faktiska klockfrekvensen vara lägre än den begärda baudhastigheten. Detta beror på plattformens hårdvara. Den faktiska frekvensen kan fastställas genom att skriva ut SPI-objektet.
- read(nbytes: int, write: int = 0x00) bytes¶
Läs ett antal byte som anges av
nbytesmedan den enskilda byte som anges avwriteskrivs kontinuerligt. Returnerar ettbytes-objekt med de data som lästes.
Konstanter¶
class SoftSPI – mjukvaruemulerad SPI-buss¶
Klassen SoftSPI implementerar SPI genom bit-banging av godtyckliga GPIO-stift. Den exponerar samma metoduppsättning som SPI så att befintlig kod som riktar sig mot hårdvaru-SPI kan byta till mjukvara med endast en konstruktorändring. Använd den när de stift du behöver inte är kopplade till ett hårdvaru-SPI-block, när du behöver fler än de tillgängliga hårdvarubussarna, eller när en kringutrustning kräver en icke-standardiserad klockfasning som hårdvaran inte kan producera.
Konstruktorer¶
- 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)¶
Konstruera ett mjukvaru-SPI-objekt.
sck,mosiochmisomåste anges – det finns inget implicit stiftval. SeSPI.init()för betydelsen av de övriga parametrarna. Standardvärdet förbaudrateär lägre än för hårdvaru-SPIeftersom bit-bang-loopen har mer omkostnad.Metoder¶
- 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¶
Återinitiera mjukvaru-SPI-bussen med de angivna parametrarna. Endast de argument som anges uppdateras; de övriga behåller sina tidigare värden. Se
SPI.init()för betydelsen av varje argument.
- deinit() None¶
Frigör de GPIO-stift som bit-bang-drivrutinen gjort anspråk på och sluta driva bussen.
- read(nbytes: int, write: int = 0x00) bytes¶
Läs
nbytesbyte medan den enskilda bytewriteskrivs kontinuerligt. Returnerar ettbytes-objekt som innehåller de mottagna data.
Konstanter¶