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
busindicato (un indice intero della periferica SPI, ad es.2perSPI2). 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. Vedereinit()per i parametri disponibili.SPI(2)è cablato sugli stessi pin del connettore su ogni OpenMV Cam STM32; la OpenMV Cam N6 espone in aggiuntaSPI(4):Bus
NSS
SCK
MISO
MOSI
SPI(2)(tutte le OpenMV Cam STM32)P3P2P1P0SPI(4)(solo OpenMV Cam N6)P15P16P17P18NSSnon viene pilotato dalla periferica SPI su nessuno dei due bus; è libero di essere usato come un normale chip-select GPIO.Metodi¶
- 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:
modedeve essereSPI.CONTROLLERoSPI.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 diprescalerha la precedenza subaudrate.polaritypuò essere 0 o 1, ed è il livello a cui si trova la linea di clock a riposo.phasepuò essere 0 o 1 per campionare i dati rispettivamente sul primo o sul secondo fronte di clock.bitspuò essere 8 o 16, ed è il numero di bit in ciascuna parola trasferita.firstbitpuò essereSPI.MSBoSPI.LSB.tiTrue indica le convenzioni di segnale Texas Instruments, in contrapposizione a Motorola.crcpuò 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, 128o256); il driver sceglie quello più alto che non supera ilbaudraterichiesto.SPI(2)è su APB1. Per un controllo preciso sul clock, impostare direttamenteprescalerinvece dibaudrate.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:
recvpuò 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 arecv.
- 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 disend, 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
SCKeMOSIed è 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.