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

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 для передачи/приёма младшего бита первым.