class SPI – ein controllergesteuertes serielles Protokoll¶
SPI ist ein synchrones serielles Protokoll, das von einem Controller gesteuert wird. Auf physischer Ebene verwendet es drei Leitungen (SCK, MOSI, MISO) plus eine Chip-Select-Leitung pro Peripheriegerät.
Die Verwendung ähnelt I2C; der Hauptunterschied liegt in den Parametern, die beim Initialisieren des Busses übergeben werden:
from pyb import SPI
spi = SPI(2, SPI.CONTROLLER, baudrate=600000, polarity=1, phase=0, crc=0x7)
Der einzige erforderliche Parameter ist mode (SPI.CONTROLLER oder SPI.PERIPHERAL). polarity ist der Ruhepegel von SCK (0 oder 1). phase wählt aus, ob Daten an der ersten (0) oder zweiten (1) Taktflanke abgetastet werden. crc ist entweder None (kein CRC) oder ein CRC-Polynom.
Datenübertragung:
data = spi.send_recv(b"1234") # send 4 bytes and receive 4 bytes
buf = bytearray(4)
spi.send_recv(b"1234", buf) # send 4 bytes and receive 4 into buf
spi.send_recv(buf, buf) # send/receive 4 bytes through buf
Konstruktoren¶
- class pyb.SPI(bus: int | str, *args, **kwargs)¶
Konstruiert ein SPI-Objekt auf dem angegebenen
bus(ein ganzzahliger SPI-Peripherieindex, z. B.2fürSPI2). Ohne zusätzliche Parameter wird das Objekt erzeugt, aber nicht initialisiert (es behält die vorherigen Buseinstellungen bei, falls vorhanden); werden zusätzliche Argumente angegeben, wird der Bus mit ihnen initialisiert. Sieheinit()für die verfügbaren Parameter.SPI(2)ist auf jeder STM32 OpenMV Cam mit denselben Header-Pins verdrahtet; die OpenMV Cam N6 stellt zusätzlichSPI(4)bereit:Bus
NSS
SCK
MISO
MOSI
SPI(2)(alle STM32 OpenMV Cams)P3P2P1P0SPI(4)(nur OpenMV Cam N6)P15P16P17P18NSSwird auf keinem der beiden Busse vom SPI-Peripheriegerät getrieben; es kann frei als normaler GPIO-Chip-Select verwendet werden.Methoden¶
- init(mode: int, baudrate: int = 328125, *, prescaler: int = -1, polarity: int = 1, phase: int = 0, bits: int = 8, firstbit: int = SPI.MSB, ti: bool = False, crc: int | None = None) None¶
Initialisiert den SPI-Bus mit den angegebenen Parametern:
modemuss entwederSPI.CONTROLLERoderSPI.PERIPHERALsein.baudrateist die SCK-Taktrate (nur für einen Controller sinnvoll).prescalerist der Vorteiler, der zum Ableiten von SCK aus der APB-Busfrequenz verwendet wird; die Verwendung vonprescalerüberschreibtbaudrate.polaritykann 0 oder 1 sein und ist der Pegel, auf dem die im Ruhezustand befindliche Taktleitung liegt.phasekann 0 oder 1 sein, um Daten an der ersten bzw. zweiten Taktflanke abzutasten.bitskann 8 oder 16 sein und ist die Anzahl der Bits in jedem übertragenen Wort.firstbitkannSPI.MSBoderSPI.LSBsein.tiTrue zeigt Signalkonventionen von Texas Instruments an, im Gegensatz zu denen von Motorola.crckann None für kein CRC oder ein Polynom-Spezifizierer sein.
Die SPI-Taktfrequenz stimmt möglicherweise nicht exakt mit
baudrateüberein. Die Hardware unterstützt nur Takte, die der übergeordneten APB-Busfrequenz geteilt durch einen Vorteiler mit Zweierpotenz entsprechen (2, 4, 8, 16, 32, 64, 128oder256); der Treiber wählt den höchsten Wert, der die angefordertebaudratenicht überschreitet.SPI(2)liegt an APB1. Für eine präzise Kontrolle über den Takt setzen Sieprescalerdirekt stattbaudrate.Beim Ausgeben des SPI-Objekts werden die berechnete Baudrate und der gewählte Vorteiler angezeigt.
- recv(recv: int | bytearray, *, timeout: int = 5000) bytes¶
Empfängt Daten auf dem Bus:
recvkann eine Ganzzahl sein, die die Anzahl der zu empfangenden Bytes angibt, oder ein veränderbarer Puffer, der mit empfangenen Bytes gefüllt wird.timeoutist das Zeitlimit in Millisekunden, das auf den Empfang gewartet wird.
Rückgabewert: Wenn
recveine Ganzzahl ist, ein neuer Puffer mit den empfangenen Bytes, andernfalls derselbe Puffer, der anrecvübergeben wurde.
- send(send: int | bytes | bytearray, *, timeout: int = 5000) None¶
Sendet Daten auf dem Bus:
sendsind die zu sendenden Daten (eine zu sendende Ganzzahl oder ein Pufferobjekt).timeoutist das Zeitlimit in Millisekunden, das auf das Senden gewartet wird.
- send_recv(send: int | bytes | bytearray, recv: bytearray | None = None, *, timeout: int = 5000) bytes¶
Sendet und empfängt gleichzeitig Daten auf dem Bus:
sendsind die zu sendenden Daten (eine zu sendende Ganzzahl oder ein Pufferobjekt).recvist ein veränderbarer Puffer, der mit empfangenen Bytes gefüllt wird. Er kann mitsendidentisch sein oder weggelassen werden. Wenn er weggelassen wird, wird ein neuer Puffer erstellt.timeoutist das Zeitlimit in Millisekunden, das auf den Empfang gewartet wird.
Rückgabewert: der Puffer mit den empfangenen Bytes.
Konstanten¶
- CONTROLLER: int¶
Initialisiert den SPI-Bus als Master (Controller) – die OpenMV Cam treibt
SCKundMOSIund steuert die Transaktion.
- PERIPHERAL: int¶
Initialisiert den SPI-Bus als Slave (Peripheriegerät) – die OpenMV Cam reagiert auf Taktimpulse, die von einem entfernten Controller getrieben werden.