клас SPI – послідовний протокол, керований контролером¶
SPI – це синхронний послідовний протокол, керований контролером. На фізичному рівні він використовує три лінії (SCK, MOSI, MISO) плюс лінію вибору мікросхеми для кожного периферійного пристрою.
Використання аналогічне до I2C; головна відмінність – параметри, що передаються при ініціалізації шини:
from pyb import SPI
spi = SPI(2, SPI.CONTROLLER, baudrate=600000, polarity=1, phase=0, crc=0x7)
Єдиним обов’язковим параметром є mode (SPI.CONTROLLER або SPI.PERIPHERAL). polarity – це рівень спокою SCK (0 або 1). phase вибирає, чи дані зчитуються на першому (0) або другому (1) фронті тактового сигналу. crc – або None (без CRC), або поліном CRC.
Передача даних:
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
Конструктори¶
- class pyb.SPI(bus: int | str, *args, **kwargs)¶
Створити об’єкт SPI на заданій
bus(цілочисельний індекс периферійного пристрою SPI, наприклад2дляSPI2). Без додаткових параметрів об’єкт створюється, але не ініціалізується (зберігаються попередні налаштування шини, якщо такі є); якщо вказані додаткові аргументи, шина ініціалізується з ними. Дивітьсяinit()для доступних параметрів.SPI(2)підключено до тих самих виводів роз’єму на кожному STM32 OpenMV Cam; OpenMV Cam N6 додатково надаєSPI(4):Шина
NSS
SCK
MISO
MOSI
SPI(2)(всі STM32 OpenMV Cams)P3P2P1P0SPI(4)(тільки OpenMV Cam N6)P15P16P17P18NSSне керується периферійним пристроєм SPI на жодній шині; його можна вільно використовувати як звичайний GPIO для вибору мікросхеми.Методи¶
- 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¶
Ініціалізувати шину SPI із заданими параметрами:
modeмає бутиSPI.CONTROLLERабоSPI.PERIPHERAL.baudrate– частота тактового сигналу SCK (має сенс лише для контролера).prescaler– дільник для отримання SCK з частоти шини APB; використанняprescalerзамінюєbaudrate.polarityможе бути 0 або 1 – рівень, на якому знаходиться неактивна лінія тактового сигналу.phaseможе бути 0 або 1 для зчитування даних на першому або другому фронті тактового сигналу відповідно.bitsможе бути 8 або 16 – кількість бітів у кожному переданому слові.firstbitможе бутиSPI.MSBабоSPI.LSB.tiTrue вказує на використання сигнальних конвенцій Texas Instruments замість Motorola.crcможе бути None для відсутності CRC або специфікатором полінома.
Частота тактового сигналу SPI може не точно відповідати
baudrate. Апаратне забезпечення підтримує лише частоти, що є часткою від ділення частоти батьківської шини APB на степінь двійки (2, 4, 8, 16, 32, 64, 128або256); драйвер вибирає найвищу, що не перевищує запитануbaudrate.SPI(2)знаходиться на APB1. Для точного контролю над частотою встановлюйтеprescalerбезпосередньо замістьbaudrate.Виведення об’єкта SPI показує обчислену швидкість передачі та вибраний дільник.
- recv(recv: int | bytearray, *, timeout: int = 5000) bytes¶
Отримати дані на шині:
recvможе бути цілим числом – кількість байтів для отримання, або змінним буфером, який буде заповнений отриманими байтами.timeout– час очікування в мілісекундах для прийому.
Повернуте значення: якщо
recvє цілим числом – новий буфер із отриманими байтами, інакше той самий буфер, що був переданий доrecv.
- send(send: int | bytes | bytearray, *, timeout: int = 5000) None¶
Надіслати дані на шині:
send– дані для надсилання (ціле число або буферний об’єкт).timeout– час очікування в мілісекундах для передачі.
- send_recv(send: int | bytes | bytearray, recv: bytearray | None = None, *, timeout: int = 5000) bytes¶
Одночасно надсилати та отримувати дані на шині:
send– дані для надсилання (ціле число або буферний об’єкт).recv– змінний буфер, який буде заповнений отриманими байтами. Може збігатися ізsendабо бути опущеним. Якщо опущено, буде створено новий буфер.timeout– час очікування в мілісекундах для прийому.
Повернуте значення: буфер із отриманими байтами.
Константи¶
- CONTROLLER: int¶
Ініціалізувати шину SPI як ведучий (контролер) – OpenMV Cam керує
SCKтаMOSIі відповідає за транзакцію.
- PERIPHERAL: int¶
Ініціалізувати шину SPI як ведомий (периферійний пристрій) – OpenMV Cam реагує на тактові імпульси від зовнішнього контролера.