класс 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)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 отвечает на тактовые импульсы, генерируемые удалённым контроллером.