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.2dlaSPI2). 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 winit().SPI(2)jest podłączone do tych samych pinów złącza na każdej kamerze STM32 OpenMV Cam; OpenMV Cam N6 dodatkowo udostępniaSPI(4):Magistrala
NSS
SCK
MISO
MOSI
SPI(2)(wszystkie kamery STM32 OpenMV Cam)P3P2P1P0SPI(4)(tylko OpenMV Cam N6)P15P16P17P18NSSnie 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¶
- 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:
modemusi byćSPI.CONTROLLERlubSPI.PERIPHERAL.baudrateto częstotliwość zegara SCK (sensowne tylko dla kontrolera).prescalerto preskaler używany do uzyskania SCK z częstotliwości magistrali APB; użycieprescalerzastępujebaudrate.polaritymoże wynosić 0 lub 1 i jest poziomem, na którym znajduje się spoczynkowa linia zegara.phasemoże wynosić 0 lub 1, aby próbkować dane odpowiednio na pierwszym lub drugim zboczu zegara.bitsmoże wynosić 8 lub 16 i jest liczbą bitów w każdym przesyłanym słowie.firstbitmoże byćSPI.MSBlubSPI.LSB.tiTrue wskazuje na konwencje sygnałowe Texas Instruments, w przeciwieństwie do Motoroli.crcmoż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, 128lub256); sterownik wybiera najwyższy, który nie przekracza żądanejbaudrate.SPI(2)znajduje się na APB1. Aby uzyskać precyzyjną kontrolę nad zegarem, ustaw bezpośrednioprescalerzamiastbaudrate.Wypisanie obiektu SPI pokazuje obliczoną szybkość transmisji (baud) i wybrany preskaler.
- recv(recv: int | bytearray, *, timeout: int = 5000) bytes¶
Odbiera dane z magistrali:
recvmoże być liczbą całkowitą, która jest liczbą bajtów do odebrania, lub zmiennym buforem, który zostanie wypełniony odebranymi bajtami.timeoutto limit czasu w milisekundach oczekiwania na odbiór.
Wartość zwracana: jeśli
recvjest liczbą całkowitą, to nowy bufor z odebranymi bajtami, w przeciwnym razie ten sam bufor, który przekazano dorecv.
- send(send: int | bytes | bytearray, *, timeout: int = 5000) None¶
Wysyła dane na magistralę:
sendto dane do wysłania (liczba całkowita do wysłania lub obiekt bufora).timeoutto 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:
sendto dane do wysłania (liczba całkowita do wysłania lub obiekt bufora).recvto zmienny bufor, który zostanie wypełniony odebranymi bajtami. Może być taki sam jaksendlub pominięty. Jeśli pominięty, zostanie utworzony nowy bufor.timeoutto 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
SCKiMOSIoraz zarządza transakcją.
- PERIPHERAL: int¶
Inicjalizuje magistralę SPI jako slave (urządzenie peryferyjne) – OpenMV Cam odpowiada na impulsy zegarowe sterowane przez zdalny kontroler.