клас 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)

P3

P2

P1

P0

SPI(4) (тільки OpenMV Cam N6)

P15

P16

P17

P18

NSS не керується периферійним пристроєм SPI на жодній шині; його можна вільно використовувати як звичайний GPIO для вибору мікросхеми.

Методи

deinit() None

Вимкнути шину 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

Ініціалізувати шину 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.

  • ti True вказує на використання сигнальних конвенцій 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 реагує на тактові імпульси від зовнішнього контролера.

MSB: int

Передати до firstbit для передачі/прийому старшого значущого біта першим (найпоширеніший порядок).

LSB: int

Передати до firstbit для передачі/прийому молодшого значущого біта першим.