klasa SPI – protokół szeregowy sterowany przez kontroler

SPI to synchroniczny protokół szeregowy sterowany przez kontroler. Na poziomie fizycznym używa trzech linii (SCK, MOSI, MISO) oraz osobnej dla każdego urządzenia peryferyjnego linii wyboru układu (chip-select).

Użycie jest podobne do I2C; główna różnica polega na parametrach przekazywanych podczas inicjalizacji magistrali:

from pyb import SPI
spi = SPI(2, SPI.CONTROLLER, baudrate=600000, polarity=1, phase=0, crc=0x7)

Jedynym wymaganym parametrem jest mode (SPI.CONTROLLER lub SPI.PERIPHERAL). polarity to poziom spoczynkowy SCK (0 lub 1). phase wybiera, czy dane są próbkowane na pierwszym (0) czy drugim (1) zboczu zegara. crc to None (brak CRC) lub wielomian CRC.

Przesyłanie danych:

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

Konstruktory

class pyb.SPI(bus: int | str, *args, **kwargs)

Tworzy obiekt SPI na podanej bus (całkowity indeks urządzenia peryferyjnego SPI, np. 2 dla SPI2). Bez dodatkowych parametrów obiekt jest tworzony, ale nie inicjalizowany (zachowuje poprzednie ustawienia magistrali, jeśli istniały); jeśli podano dodatkowe argumenty, magistrala jest nimi inicjalizowana. Dostępne parametry opisano w init().

SPI(2) jest podłączone do tych samych pinów złącza na każdej kamerze STM32 OpenMV Cam; OpenMV Cam N6 dodatkowo udostępnia SPI(4):

Magistrala

NSS

SCK

MISO

MOSI

SPI(2) (wszystkie kamery STM32 OpenMV Cam)

P3

P2

P1

P0

SPI(4) (tylko OpenMV Cam N6)

P15

P16

P17

P18

NSS nie jest sterowane przez urządzenie peryferyjne SPI na żadnej z magistral; można je swobodnie wykorzystać jako zwykłe GPIO wyboru układu (chip-select).

Metody

deinit() None

Wyłącza magistralę SPI.

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

Inicjalizuje magistralę SPI z podanymi parametrami:

  • mode musi być SPI.CONTROLLER lub SPI.PERIPHERAL.

  • baudrate to częstotliwość zegara SCK (sensowne tylko dla kontrolera).

  • prescaler to preskaler używany do uzyskania SCK z częstotliwości magistrali APB; użycie prescaler zastępuje baudrate.

  • polarity może wynosić 0 lub 1 i jest poziomem, na którym znajduje się spoczynkowa linia zegara.

  • phase może wynosić 0 lub 1, aby próbkować dane odpowiednio na pierwszym lub drugim zboczu zegara.

  • bits może wynosić 8 lub 16 i jest liczbą bitów w każdym przesyłanym słowie.

  • firstbit może być SPI.MSB lub SPI.LSB.

  • ti True wskazuje na konwencje sygnałowe Texas Instruments, w przeciwieństwie do Motoroli.

  • crc może być None dla braku CRC lub specyfikatorem wielomianu.

Częstotliwość zegara SPI może nie odpowiadać dokładnie baudrate. Sprzęt obsługuje tylko zegary będące częstotliwością nadrzędnej magistrali APB podzieloną przez preskaler będący potęgą dwójki (2, 4, 8, 16, 32, 64, 128 lub 256); sterownik wybiera najwyższy, który nie przekracza żądanej baudrate. SPI(2) znajduje się na APB1. Aby uzyskać precyzyjną kontrolę nad zegarem, ustaw bezpośrednio prescaler zamiast baudrate.

Wypisanie obiektu SPI pokazuje obliczoną szybkość transmisji (baud) i wybrany preskaler.

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

Odbiera dane z magistrali:

  • recv może być liczbą całkowitą, która jest liczbą bajtów do odebrania, lub zmiennym buforem, który zostanie wypełniony odebranymi bajtami.

  • timeout to limit czasu w milisekundach oczekiwania na odbiór.

Wartość zwracana: jeśli recv jest liczbą całkowitą, to nowy bufor z odebranymi bajtami, w przeciwnym razie ten sam bufor, który przekazano do recv.

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

Wysyła dane na magistralę:

  • send to dane do wysłania (liczba całkowita do wysłania lub obiekt bufora).

  • timeout to limit czasu w milisekundach oczekiwania na wysłanie.

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

Wysyła i odbiera dane na magistrali jednocześnie:

  • send to dane do wysłania (liczba całkowita do wysłania lub obiekt bufora).

  • recv to zmienny bufor, który zostanie wypełniony odebranymi bajtami. Może być taki sam jak send lub pominięty. Jeśli pominięty, zostanie utworzony nowy bufor.

  • timeout to limit czasu w milisekundach oczekiwania na odbiór.

Wartość zwracana: bufor z odebranymi bajtami.

Stałe

CONTROLLER: int

Inicjalizuje magistralę SPI jako master (kontroler) – OpenMV Cam steruje SCK i MOSI oraz zarządza transakcją.

PERIPHERAL: int

Inicjalizuje magistralę SPI jako slave (urządzenie peryferyjne) – OpenMV Cam odpowiada na impulsy zegarowe sterowane przez zdalny kontroler.

MSB: int

Przekaż do firstbit, aby nadawać/odbierać najpierw bit najbardziej znaczący (najczęstsza kolejność).

LSB: int

Przekaż do firstbit, aby nadawać/odbierać najpierw bit najmniej znaczący.