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. 2 für SPI2). 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. Siehe init() 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ätzlich SPI(4) bereit:

Bus

NSS

SCK

MISO

MOSI

SPI(2) (alle STM32 OpenMV Cams)

P3

P2

P1

P0

SPI(4) (nur OpenMV Cam N6)

P15

P16

P17

P18

NSS wird auf keinem der beiden Busse vom SPI-Peripheriegerät getrieben; es kann frei als normaler GPIO-Chip-Select verwendet werden.

Methoden

deinit() None

Schaltet den SPI-Bus aus.

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:

  • mode muss entweder SPI.CONTROLLER oder SPI.PERIPHERAL sein.

  • baudrate ist die SCK-Taktrate (nur für einen Controller sinnvoll).

  • prescaler ist der Vorteiler, der zum Ableiten von SCK aus der APB-Busfrequenz verwendet wird; die Verwendung von prescaler überschreibt baudrate.

  • polarity kann 0 oder 1 sein und ist der Pegel, auf dem die im Ruhezustand befindliche Taktleitung liegt.

  • phase kann 0 oder 1 sein, um Daten an der ersten bzw. zweiten Taktflanke abzutasten.

  • bits kann 8 oder 16 sein und ist die Anzahl der Bits in jedem übertragenen Wort.

  • firstbit kann SPI.MSB oder SPI.LSB sein.

  • ti True zeigt Signalkonventionen von Texas Instruments an, im Gegensatz zu denen von Motorola.

  • crc kann 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, 128 oder 256); der Treiber wählt den höchsten Wert, der die angeforderte baudrate nicht überschreitet. SPI(2) liegt an APB1. Für eine präzise Kontrolle über den Takt setzen Sie prescaler direkt statt baudrate.

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:

  • recv kann eine Ganzzahl sein, die die Anzahl der zu empfangenden Bytes angibt, oder ein veränderbarer Puffer, der mit empfangenen Bytes gefüllt wird.

  • timeout ist das Zeitlimit in Millisekunden, das auf den Empfang gewartet wird.

Rückgabewert: Wenn recv eine Ganzzahl ist, ein neuer Puffer mit den empfangenen Bytes, andernfalls derselbe Puffer, der an recv übergeben wurde.

send(send: int | bytes | bytearray, *, timeout: int = 5000) None

Sendet Daten auf dem Bus:

  • send sind die zu sendenden Daten (eine zu sendende Ganzzahl oder ein Pufferobjekt).

  • timeout ist 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:

  • send sind die zu sendenden Daten (eine zu sendende Ganzzahl oder ein Pufferobjekt).

  • recv ist ein veränderbarer Puffer, der mit empfangenen Bytes gefüllt wird. Er kann mit send identisch sein oder weggelassen werden. Wenn er weggelassen wird, wird ein neuer Puffer erstellt.

  • timeout ist 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 SCK und MOSI und 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.

MSB: int

An firstbit übergeben, um das höchstwertige Bit zuerst zu senden/empfangen (die häufigste Reihenfolge).

LSB: int

An firstbit übergeben, um das niederwertigste Bit zuerst zu senden/empfangen.