class SPI – un protocollo seriale pilotato da un controller

SPI è un protocollo seriale sincrono pilotato da un controller. A livello fisico utilizza tre linee (SCK, MOSI, MISO) più una linea di chip-select per ciascuna periferica.

L’utilizzo è simile a I2C; la differenza principale sono i parametri passati quando si inizializza il bus:

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

L’unico parametro obbligatorio è mode (SPI.CONTROLLER o SPI.PERIPHERAL). polarity è il livello di riposo di SCK (0 o 1). phase seleziona se i dati vengono campionati sul primo (0) o sul secondo (1) fronte di clock. crc è None (nessun CRC) oppure un polinomio CRC.

Trasferimento dei dati:

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

Costruttori

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

Costruisce un oggetto SPI sul bus indicato (un indice intero della periferica SPI, ad es. 2 per SPI2). Senza parametri aggiuntivi l’oggetto viene creato ma non inizializzato (mantiene le impostazioni precedenti del bus, se presenti); se vengono forniti argomenti aggiuntivi il bus viene inizializzato con essi. Vedere init() per i parametri disponibili.

SPI(2) è cablato sugli stessi pin del connettore su ogni OpenMV Cam STM32; la OpenMV Cam N6 espone in aggiunta SPI(4):

Bus

NSS

SCK

MISO

MOSI

SPI(2) (tutte le OpenMV Cam STM32)

P3

P2

P1

P0

SPI(4) (solo OpenMV Cam N6)

P15

P16

P17

P18

NSS non viene pilotato dalla periferica SPI su nessuno dei due bus; è libero di essere usato come un normale chip-select GPIO.

Metodi

deinit() None

Disattiva il 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

Inizializza il bus SPI con i parametri indicati:

  • mode deve essere SPI.CONTROLLER o SPI.PERIPHERAL.

  • baudrate è la frequenza di clock di SCK (sensata solo per un controller).

  • prescaler è il prescaler da usare per derivare SCK dalla frequenza del bus APB; l’uso di prescaler ha la precedenza su baudrate.

  • polarity può essere 0 o 1, ed è il livello a cui si trova la linea di clock a riposo.

  • phase può essere 0 o 1 per campionare i dati rispettivamente sul primo o sul secondo fronte di clock.

  • bits può essere 8 o 16, ed è il numero di bit in ciascuna parola trasferita.

  • firstbit può essere SPI.MSB o SPI.LSB.

  • ti True indica le convenzioni di segnale Texas Instruments, in contrapposizione a Motorola.

  • crc può essere None per nessun CRC, oppure uno specificatore di polinomio.

La frequenza di clock SPI può non corrispondere esattamente a baudrate. L’hardware supporta solo clock pari alla frequenza del bus APB padre divisa per un prescaler che è una potenza di due (2, 4, 8, 16, 32, 64, 128 o 256); il driver sceglie quello più alto che non supera il baudrate richiesto. SPI(2) è su APB1. Per un controllo preciso sul clock, impostare direttamente prescaler invece di baudrate.

La stampa dell’oggetto SPI mostra il baud rate calcolato e il prescaler scelto.

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

Riceve dati sul bus:

  • recv può essere un intero, ovvero il numero di byte da ricevere, oppure un buffer mutabile, che verrà riempito con i byte ricevuti.

  • timeout è il timeout in millisecondi entro cui attendere la ricezione.

Valore di ritorno: se recv è un intero allora un nuovo buffer con i byte ricevuti, altrimenti lo stesso buffer che è stato passato a recv.

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

Invia dati sul bus:

  • send è il dato da inviare (un intero da inviare, oppure un oggetto buffer).

  • timeout è il timeout in millisecondi entro cui attendere l’invio.

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

Invia e riceve dati sul bus contemporaneamente:

  • send è il dato da inviare (un intero da inviare, oppure un oggetto buffer).

  • recv è un buffer mutabile che verrà riempito con i byte ricevuti. Può essere lo stesso di send, oppure omesso. Se omesso, verrà creato un nuovo buffer.

  • timeout è il timeout in millisecondi entro cui attendere la ricezione.

Valore di ritorno: il buffer con i byte ricevuti.

Costanti

CONTROLLER: int

Inizializza il bus SPI come master (controller) – la OpenMV Cam pilota SCK e MOSI ed è responsabile della transazione.

PERIPHERAL: int

Inizializza il bus SPI come slave (peripheral) – la OpenMV Cam risponde agli impulsi di clock pilotati da un controller remoto.

MSB: int

Passare a firstbit per trasmettere/ricevere prima il bit più significativo (l’ordinamento più comune).

LSB: int

Passare a firstbit per trasmettere/ricevere prima il bit meno significativo.