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.2voorSPI2). 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. Zieinit()voor de beschikbare parameters.SPI(2)is bedraad naar dezelfde headerpinnen op elke STM32 OpenMV Cam; de OpenMV Cam N6 stelt daarnaastSPI(4)beschikbaar:Bus
NSS
SCK
MISO
MOSI
SPI(2)(alle STM32 OpenMV Cams)P3P2P1P0SPI(4)(alleen OpenMV Cam N6)P15P16P17P18NSSwordt op geen van beide bussen door het SPI-randapparaat aangestuurd; het is vrij te gebruiken als een normale GPIO-chip-select.Methoden¶
- 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:
modemoet ofwelSPI.CONTROLLERofSPI.PERIPHERALzijn.baudrateis de SCK-kloksnelheid (alleen zinvol voor een controller).prescaleris de prescaler die wordt gebruikt om SCK af te leiden van de APB-busfrequentie; gebruik vanprescaleroverschrijftbaudrate.polaritykan 0 of 1 zijn en is het niveau waarop de kloklijn in rust staat.phasekan 0 of 1 zijn om data respectievelijk op de eerste of tweede klokflank te bemonsteren.bitskan 8 of 16 zijn en is het aantal bits in elk overgebracht woord.firstbitkanSPI.MSBofSPI.LSBzijn.tiTrue duidt op Texas Instruments-signaalconventies, in tegenstelling tot die van Motorola.crckan 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, 128of256); de driver kiest de hoogste die de gevraagdebaudrateniet overschrijdt.SPI(2)zit op APB1. Voor precieze controle over de klok stel jeprescalerrechtstreeks in in plaats vanbaudrate.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:
recvkan een geheel getal zijn, namelijk het aantal te ontvangen bytes, of een muteerbare buffer die met ontvangen bytes wordt gevuld.timeoutis de time-out in milliseconden om op de ontvangst te wachten.
Retourwaarde: als
recveen geheel getal is, dan een nieuwe buffer met de ontvangen bytes, anders dezelfde buffer die aanrecvis doorgegeven.
- send(send: int | bytes | bytearray, *, timeout: int = 5000) None¶
Verstuur data op de bus:
sendis de te verzenden data (een te verzenden geheel getal, of een bufferobject).timeoutis 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:
sendis de te verzenden data (een te verzenden geheel getal, of een bufferobject).recvis een muteerbare buffer die met ontvangen bytes wordt gevuld. Deze kan hetzelfde zijn alssend, of weggelaten worden. Indien weggelaten, wordt een nieuwe buffer gemaakt.timeoutis 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
SCKenMOSIaan 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.