class SPI – un protocolo serie controlado por un controlador

SPI es un protocolo serie síncrono gobernado por un controlador. A nivel físico utiliza tres líneas (SCK, MOSI, MISO) más una línea de selección de chip por cada periférico.

El uso es similar al de I2C; la principal diferencia son los parámetros que se pasan al inicializar el bus:

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

El único parámetro obligatorio es mode (SPI.CONTROLLER o SPI.PERIPHERAL). polarity es el nivel de reposo de SCK (0 o 1). phase selecciona si los datos se muestrean en el primer (0) o segundo (1) flanco de reloj. crc es None (sin CRC) o un polinomio CRC.

Transferencia de datos:

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

Constructores

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

Construye un objeto SPI en el bus dado (un índice entero de periférico SPI, p. ej. 2 para SPI2). Sin parámetros adicionales, el objeto se crea pero no se inicializa (conserva la configuración de bus anterior, si la hubiera); si se proporcionan argumentos adicionales, el bus se inicializa con ellos. Consulte init() para los parámetros disponibles.

SPI(2) está conectado a los mismos pines del conector en todas las OpenMV Cam basadas en STM32; la OpenMV Cam N6 expone además SPI(4):

Bus

NSS

SCK

MISO

MOSI

SPI(2) (todas las OpenMV Cam con STM32)

P3

P2

P1

P0

SPI(4) (solo OpenMV Cam N6)

P15

P16

P17

P18

NSS no es controlado por el periférico SPI en ninguno de los dos buses; queda libre para usarse como una selección de chip GPIO normal.

Métodos

deinit() None

Apaga el bus 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 el bus SPI con los parámetros dados:

  • mode debe ser SPI.CONTROLLER o SPI.PERIPHERAL.

  • baudrate es la velocidad del reloj SCK (solo tiene sentido para un controlador).

  • prescaler es el divisor que se usa para derivar SCK de la frecuencia del bus APB; el uso de prescaler anula a baudrate.

  • polarity puede ser 0 o 1, y es el nivel en el que reposa la línea de reloj en estado inactivo.

  • phase puede ser 0 o 1 para muestrear los datos en el primer o segundo flanco de reloj respectivamente.

  • bits puede ser 8 o 16, y es el número de bits en cada palabra transferida.

  • firstbit puede ser SPI.MSB o SPI.LSB.

  • ti True indica las convenciones de señal de Texas Instruments, en lugar de las de Motorola.

  • crc puede ser None para no usar CRC, o un especificador de polinomio.

Es posible que la frecuencia del reloj SPI no coincida exactamente con baudrate. El hardware solo admite relojes que sean la frecuencia del bus APB padre dividida por un divisor (prescaler) que sea potencia de dos (2, 4, 8, 16, 32, 64, 128 o 256); el controlador elige el más alto que no supere el baudrate solicitado. SPI(2) está en APB1. Para un control preciso del reloj, establezca prescaler directamente en lugar de baudrate.

Al imprimir el objeto SPI se muestra la velocidad en baudios calculada y el divisor (prescaler) elegido.

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

Recibe datos en el bus:

  • recv puede ser un entero, que es el número de bytes a recibir, o un búfer mutable, que se llenará con los bytes recibidos.

  • timeout es el tiempo de espera en milisegundos para la recepción.

Valor de retorno: si recv es un entero, un nuevo búfer con los bytes recibidos; de lo contrario, el mismo búfer que se pasó a recv.

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

Envía datos en el bus:

  • send son los datos a enviar (un entero a enviar, o un objeto búfer).

  • timeout es el tiempo de espera en milisegundos para el envío.

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

Envía y recibe datos en el bus al mismo tiempo:

  • send son los datos a enviar (un entero a enviar, o un objeto búfer).

  • recv es un búfer mutable que se llenará con los bytes recibidos. Puede ser el mismo que send, u omitirse. Si se omite, se creará un nuevo búfer.

  • timeout es el tiempo de espera en milisegundos para la recepción.

Valor de retorno: el búfer con los bytes recibidos.

Constantes

CONTROLLER: int

Inicializa el bus SPI como maestro (controller) – la OpenMV Cam gobierna SCK y MOSI y está a cargo de la transacción.

PERIPHERAL: int

Inicializa el bus SPI como esclavo (peripheral) – la OpenMV Cam responde a los pulsos de reloj gobernados por un controlador remoto.

MSB: int

Pase a firstbit para transmitir/recibir primero el bit más significativo (el orden más común).

LSB: int

Pase a firstbit para transmitir/recibir primero el bit menos significativo.