class SPI – een door een controller aangestuurd serieel protocol

SPI is een synchroon serieel protocol dat door een controller wordt aangestuurd. Op fysiek niveau gebruikt het drie lijnen (SCK, MOSI, MISO) plus een chip-select-lijn per randapparaat.

Het gebruik is vergelijkbaar met I2C; het belangrijkste verschil zijn de parameters die worden doorgegeven bij het initialiseren van de bus:

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

De enige vereiste parameter is mode (SPI.CONTROLLER of SPI.PERIPHERAL). polarity is het rusttoestandsniveau van SCK (0 of 1). phase bepaalt of data wordt bemonsterd op de eerste (0) of tweede (1) klokflank. crc is ofwel None (geen CRC) of een CRC-polynoom.

Data overbrengen:

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

Constructors

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

Construeer een SPI-object op de opgegeven bus (een geheel getal als SPI-randapparaatindex, bijv. 2 voor SPI2). Zonder aanvullende parameters wordt het object gemaakt maar niet geïnitialiseerd (het behoudt de vorige businstellingen, indien aanwezig); als er extra argumenten worden opgegeven, wordt de bus daarmee geïnitialiseerd. Zie init() voor de beschikbare parameters.

SPI(2) is bedraad naar dezelfde headerpinnen op elke STM32 OpenMV Cam; de OpenMV Cam N6 stelt daarnaast SPI(4) beschikbaar:

Bus

NSS

SCK

MISO

MOSI

SPI(2) (alle STM32 OpenMV Cams)

P3

P2

P1

P0

SPI(4) (alleen OpenMV Cam N6)

P15

P16

P17

P18

NSS wordt op geen van beide bussen door het SPI-randapparaat aangestuurd; het is vrij te gebruiken als een normale GPIO-chip-select.

Methoden

deinit() None

Schakel de SPI-bus uit.

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

Initialiseer de SPI-bus met de opgegeven parameters:

  • mode moet ofwel SPI.CONTROLLER of SPI.PERIPHERAL zijn.

  • baudrate is de SCK-kloksnelheid (alleen zinvol voor een controller).

  • prescaler is de prescaler die wordt gebruikt om SCK af te leiden van de APB-busfrequentie; gebruik van prescaler overschrijft baudrate.

  • polarity kan 0 of 1 zijn en is het niveau waarop de kloklijn in rust staat.

  • phase kan 0 of 1 zijn om data respectievelijk op de eerste of tweede klokflank te bemonsteren.

  • bits kan 8 of 16 zijn en is het aantal bits in elk overgebracht woord.

  • firstbit kan SPI.MSB of SPI.LSB zijn.

  • ti True duidt op Texas Instruments-signaalconventies, in tegenstelling tot die van Motorola.

  • crc kan None zijn voor geen CRC, of een polynoom-specificatie.

De SPI-klokfrequentie komt mogelijk niet exact overeen met baudrate. De hardware ondersteunt alleen klokken die de bovenliggende APB-busfrequentie gedeeld door een macht-van-twee-prescaler zijn (2, 4, 8, 16, 32, 64, 128 of 256); de driver kiest de hoogste die de gevraagde baudrate niet overschrijdt. SPI(2) zit op APB1. Voor precieze controle over de klok stel je prescaler rechtstreeks in in plaats van baudrate.

Bij het afdrukken van het SPI-object worden de berekende baudrate en de gekozen prescaler getoond.

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

Ontvang data op de bus:

  • recv kan een geheel getal zijn, namelijk het aantal te ontvangen bytes, of een muteerbare buffer die met ontvangen bytes wordt gevuld.

  • timeout is de time-out in milliseconden om op de ontvangst te wachten.

Retourwaarde: als recv een geheel getal is, dan een nieuwe buffer met de ontvangen bytes, anders dezelfde buffer die aan recv is doorgegeven.

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

Verstuur data op de bus:

  • send is de te verzenden data (een te verzenden geheel getal, of een bufferobject).

  • timeout is de time-out in milliseconden om op de verzending te wachten.

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

Verstuur en ontvang data op de bus tegelijkertijd:

  • send is de te verzenden data (een te verzenden geheel getal, of een bufferobject).

  • recv is een muteerbare buffer die met ontvangen bytes wordt gevuld. Deze kan hetzelfde zijn als send, of weggelaten worden. Indien weggelaten, wordt een nieuwe buffer gemaakt.

  • timeout is de time-out in milliseconden om op de ontvangst te wachten.

Retourwaarde: de buffer met de ontvangen bytes.

Constanten

CONTROLLER: int

Initialiseer de SPI-bus als master (controller) – de OpenMV Cam stuurt SCK en MOSI aan en heeft de leiding over de transactie.

PERIPHERAL: int

Initialiseer de SPI-bus als slave (randapparaat) – de OpenMV Cam reageert op klokpulsen die door een externe controller worden aangestuurd.

MSB: int

Geef door aan firstbit om de meest-significante bit eerst te verzenden/ontvangen (de meest gebruikelijke volgorde).

LSB: int

Geef door aan firstbit om de minst-significante bit eerst te verzenden/ontvangen.