class SPI – ett styrenhetsdrivet seriellt protokoll

SPI är ett synkront seriellt protokoll som drivs av en styrenhet. På den fysiska nivån använder det tre ledningar (SCK, MOSI, MISO) plus en chip-select-ledning per kringutrustning.

Användningen liknar I2C; den huvudsakliga skillnaden är de parametrar som skickas vid initiering av bussen:

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

Den enda obligatoriska parametern är mode (SPI.CONTROLLER eller SPI.PERIPHERAL). polarity är vilonivån för SCK (0 eller 1). phase väljer om data samplas på den första (0) eller andra (1) klockflanken. crc är antingen None (ingen CRC) eller ett CRC-polynom.

Överföra data:

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

Konstruktorer

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

Konstruera ett SPI-objekt på den angivna bus (ett heltal för SPI-kringutrustningens index, t.ex. 2 för SPI2). Utan ytterligare parametrar skapas objektet men initieras inte (det behåller de tidigare bussinställningarna, om sådana finns); om extra argument anges initieras bussen med dem. Se init() för de tillgängliga parametrarna.

SPI(2) är kopplad till samma header-stift på varje STM32 OpenMV Cam; OpenMV Cam N6 exponerar dessutom SPI(4):

Buss

NSS

SCK

MISO

MOSI

SPI(2) (alla STM32 OpenMV Cam)

P3

P2

P1

P0

SPI(4) (endast OpenMV Cam N6)

P15

P16

P17

P18

NSS drivs inte av SPI-kringutrustningen på någon av bussarna; den är fri att använda som en vanlig GPIO chip-select.

Metoder

deinit() None

Stäng av SPI-bussen.

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

Initiera SPI-bussen med de angivna parametrarna:

  • mode måste vara antingen SPI.CONTROLLER eller SPI.PERIPHERAL.

  • baudrate är klockfrekvensen för SCK (endast meningsfullt för en styrenhet).

  • prescaler är den prescaler som används för att härleda SCK från APB-bussfrekvensen; användning av prescaler åsidosätter baudrate.

  • polarity kan vara 0 eller 1, och är den nivå som den vilande klockledningen ligger på.

  • phase kan vara 0 eller 1 för att sampla data på den första respektive andra klockflanken.

  • bits kan vara 8 eller 16, och är antalet bitar i varje överfört ord.

  • firstbit kan vara SPI.MSB eller SPI.LSB.

  • ti True anger Texas Instruments-signalkonventioner, i motsats till Motorola.

  • crc kan vara None för ingen CRC, eller en polynomspecificerare.

SPI-klockfrekvensen kanske inte matchar baudrate exakt. Hårdvaran stöder endast klockor som är den överordnade APB-bussfrekvensen dividerad med en prescaler som är en tvåpotens (2, 4, 8, 16, 32, 64, 128 eller 256); drivrutinen väljer den högsta som inte överskrider den begärda baudrate. SPI(2) ligger på APB1. För exakt kontroll över klockan, ställ in prescaler direkt i stället för baudrate.

Utskrift av SPI-objektet visar den beräknade baudhastigheten och den valda prescalern.

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

Ta emot data på bussen:

  • recv kan vara ett heltal, vilket är antalet byte att ta emot, eller en muterbar buffert som kommer att fyllas med mottagna byte.

  • timeout är timeouten i millisekunder att vänta på mottagningen.

Returvärde: om recv är ett heltal returneras en ny buffert med de mottagna byten, annars samma buffert som skickades in till recv.

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

Skicka data på bussen:

  • send är de data som ska skickas (ett heltal att skicka, eller ett buffertobjekt).

  • timeout är timeouten i millisekunder att vänta på sändningen.

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

Skicka och ta emot data på bussen samtidigt:

  • send är de data som ska skickas (ett heltal att skicka, eller ett buffertobjekt).

  • recv är en muterbar buffert som kommer att fyllas med mottagna byte. Den kan vara densamma som send, eller utelämnas. Om den utelämnas skapas en ny buffert.

  • timeout är timeouten i millisekunder att vänta på mottagningen.

Returvärde: bufferten med de mottagna byten.

Konstanter

CONTROLLER: int

Initiera SPI-bussen som master (styrenhet) – OpenMV Cam driver SCK och MOSI och ansvarar för transaktionen.

PERIPHERAL: int

Initiera SPI-bussen som slav (kringutrustning) – OpenMV Cam svarar på klockpulser som drivs av en fjärrstyrenhet.

MSB: int

Skicka till firstbit för att sända/ta emot den mest signifikanta biten först (den vanligaste ordningen).

LSB: int

Skicka till firstbit för att sända/ta emot den minst signifikanta biten först.