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