class SPI – protocolo série controlado por controlador

SPI é um protocolo série síncrono controlado por um controlador. Ao nível físico utiliza três linhas (SCK, MOSI, MISO) mais uma linha de seleção de chip por periférico.

A utilização é semelhante a I2C; a principal diferença está nos parâmetros passados ao inicializar o barramento:

from pyb import SPI
spi = SPI(2, SPI.CONTROLLER, baudrate=600000, polarity=1, phase=0, crc=0x7)

O único parâmetro obrigatório é mode (SPI.CONTROLLER ou SPI.PERIPHERAL). polarity é o nível inativo de SCK (0 ou 1). phase seleciona se os dados são amostrados na primeira (0) ou segunda (1) transição de relógio. crc é None (sem CRC) ou um polinómio CRC.

Transferência de dados:

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

Construtores

class pyb.SPI(bus: int | str, *args, **kwargs)

Constrói um objeto SPI no bus indicado (um índice inteiro de periférico SPI, por exemplo 2 para SPI2). Sem parâmetros adicionais, o objeto é criado mas não inicializado (retém as configurações anteriores do barramento, se existirem); se forem fornecidos argumentos extra, o barramento é inicializado com eles. Consulte init() para os parâmetros disponíveis.

SPI(2) está ligado aos mesmos pinos do conector em todas as OpenMV Cams STM32; a OpenMV Cam N6 expõe adicionalmente SPI(4):

Barramento

NSS

SCK

MISO

MOSI

SPI(2) (todas as OpenMV Cams STM32)

P3

P2

P1

P0

SPI(4) (apenas OpenMV Cam N6)

P15

P16

P17

P18

NSS não é controlado pelo periférico SPI em nenhum dos barramentos; está disponível para ser utilizado como GPIO normal de seleção de chip.

Métodos

deinit() None

Desativa o barramento 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

Inicializa o barramento SPI com os parâmetros indicados:

  • mode deve ser SPI.CONTROLLER ou SPI.PERIPHERAL.

  • baudrate é a taxa de relógio SCK (apenas relevante para um controlador).

  • prescaler é o prescaler a utilizar para derivar o SCK da frequência do barramento APB; a utilização de prescaler substitui baudrate.

  • polarity pode ser 0 ou 1, e é o nível em que a linha de relógio fica em repouso.

  • phase pode ser 0 ou 1 para amostrar os dados na primeira ou segunda transição de relógio, respetivamente.

  • bits pode ser 8 ou 16, e é o número de bits em cada palavra transferida.

  • firstbit pode ser SPI.MSB ou SPI.LSB.

  • ti True indica convenções de sinal Texas Instruments, em oposição a Motorola.

  • crc pode ser None para sem CRC, ou um especificador de polinómio.

A frequência de relógio SPI pode não corresponder exatamente a baudrate. O hardware apenas suporta relógios que são a frequência do barramento APB pai dividida por um prescaler que é potência de dois (2, 4, 8, 16, 32, 64, 128 ou 256); o driver escolhe o mais alto que não exceda o baudrate solicitado. SPI(2) está no APB1. Para controlo preciso sobre o relógio, defina prescaler diretamente em vez de baudrate.

Ao imprimir o objeto SPI é mostrada a taxa de baud calculada e o prescaler escolhido.

recv(recv: int | bytearray, *, timeout: int = 5000) bytes

Recebe dados no barramento:

  • recv pode ser um inteiro, que é o número de bytes a receber, ou um buffer mutável, que será preenchido com os bytes recebidos.

  • timeout é o tempo limite em milissegundos para aguardar a receção.

Valor de retorno: se recv for um inteiro, um novo buffer com os bytes recebidos; caso contrário, o mesmo buffer que foi passado a recv.

send(send: int | bytes | bytearray, *, timeout: int = 5000) None

Envia dados no barramento:

  • send são os dados a enviar (um inteiro a enviar, ou um objeto buffer).

  • timeout é o tempo limite em milissegundos para aguardar o envio.

send_recv(send: int | bytes | bytearray, recv: bytearray | None = None, *, timeout: int = 5000) bytes

Envia e recebe dados no barramento ao mesmo tempo:

  • send são os dados a enviar (um inteiro a enviar, ou um objeto buffer).

  • recv é um buffer mutável que será preenchido com os bytes recebidos. Pode ser o mesmo que send, ou omitido. Se omitido, será criado um novo buffer.

  • timeout é o tempo limite em milissegundos para aguardar a receção.

Valor de retorno: o buffer com os bytes recebidos.

Constantes

CONTROLLER: int

Inicializa o barramento SPI como mestre (controlador) – a OpenMV Cam controla SCK e MOSI e gere a transação.

PERIPHERAL: int

Inicializa o barramento SPI como escravo (periférico) – a OpenMV Cam responde aos impulsos de relógio acionados por um controlador remoto.

MSB: int

Passar a firstbit para transmitir/receber o bit mais significativo primeiro (a ordenação mais comum).

LSB: int

Passar a firstbit para transmitir/receber o bit menos significativo primeiro.