clasa SPI – un protocol serial condus de un controler

SPI este un protocol serial sincron condus de un controler. La nivel fizic folosește trei linii (SCK, MOSI, MISO) plus o linie de selecție a cipului per periferic.

Utilizarea este similară cu I2C; principala diferență o constituie parametrii transmiși la inițializarea magistralei:

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

Singurul parametru obligatoriu este mode (SPI.CONTROLLER sau SPI.PERIPHERAL). polarity este nivelul de repaus al SCK (0 sau 1). phase selectează dacă datele sunt eșantionate pe primul (0) sau pe al doilea (1) front de ceas. crc este fie None (fără CRC), fie un polinom CRC.

Transferul de date:

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

Constructori

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

Construiește un obiect SPI pe bus-ul dat (un index întreg de periferic SPI, de exemplu 2 pentru SPI2). Fără parametri suplimentari, obiectul este creat dar nu este inițializat (păstrează setările anterioare ale magistralei, dacă există); dacă sunt furnizate argumente suplimentare, magistrala este inițializată cu acestea. Consultați init() pentru parametrii disponibili.

SPI(2) este conectat la aceiași pini de pe header pe fiecare cameră OpenMV Cam bazată pe STM32; OpenMV Cam N6 expune în plus SPI(4):

Magistrală

NSS

SCK

MISO

MOSI

SPI(2) (toate camerele OpenMV Cam STM32)

P3

P2

P1

P0

SPI(4) (numai OpenMV Cam N6)

P15

P16

P17

P18

NSS nu este controlat de perifericul SPI pe niciuna dintre magistrale; este liber să fie folosit ca un chip-select GPIO obișnuit.

Metode

deinit() None

Oprește magistrala 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

Inițializează magistrala SPI cu parametrii dați:

  • mode trebuie să fie fie SPI.CONTROLLER, fie SPI.PERIPHERAL.

  • baudrate este rata ceasului SCK (utilă doar pentru un controler).

  • prescaler este prescalerul folosit pentru a deriva SCK din frecvența magistralei APB; folosirea lui prescaler are prioritate față de baudrate.

  • polarity poate fi 0 sau 1 și este nivelul la care se află linia de ceas în repaus.

  • phase poate fi 0 sau 1 pentru a eșantiona datele pe primul, respectiv pe al doilea front de ceas.

  • bits poate fi 8 sau 16 și este numărul de biți din fiecare cuvânt transferat.

  • firstbit poate fi SPI.MSB sau SPI.LSB.

  • ti True indică convențiile de semnal Texas Instruments, spre deosebire de Motorola.

  • crc poate fi None pentru a nu folosi CRC, sau un specificator de polinom.

Frecvența ceasului SPI poate să nu corespundă exact cu baudrate. Hardware-ul acceptă doar ceasuri care reprezintă frecvența magistralei APB părinte împărțită la un prescaler putere a lui doi (2, 4, 8, 16, 32, 64, 128 sau 256); driverul îl alege pe cel mai mare care nu depășește baudrate-ul solicitat. SPI(2) se află pe APB1. Pentru un control precis al ceasului, setați prescaler direct în loc de baudrate.

Afișarea obiectului SPI arată rata baud calculată și prescalerul ales.

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

Recepționează date pe magistrală:

  • recv poate fi un număr întreg, care reprezintă numărul de octeți de recepționat, sau un tampon mutabil, care va fi umplut cu octeții recepționați.

  • timeout este timpul de așteptare în milisecunde pentru recepție.

Valoare returnată: dacă recv este un număr întreg, atunci un nou tampon cu octeții recepționați, altfel același tampon care a fost transmis în recv.

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

Trimite date pe magistrală:

  • send reprezintă datele de trimis (un număr întreg de trimis, sau un obiect tampon).

  • timeout este timpul de așteptare în milisecunde pentru trimitere.

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

Trimite și recepționează date pe magistrală în același timp:

  • send reprezintă datele de trimis (un număr întreg de trimis, sau un obiect tampon).

  • recv este un tampon mutabil care va fi umplut cu octeții recepționați. Poate fi același cu send, sau poate fi omis. Dacă este omis, va fi creat un nou tampon.

  • timeout este timpul de așteptare în milisecunde pentru recepție.

Valoare returnată: tamponul cu octeții recepționați.

Constante

CONTROLLER: int

Inițializează magistrala SPI ca master (controler) – OpenMV Cam controlează SCK și MOSI și are controlul tranzacției.

PERIPHERAL: int

Inițializează magistrala SPI ca slave (periferic) – OpenMV Cam răspunde la impulsurile de ceas controlate de un controler la distanță.

MSB: int

Transmiteți pentru firstbit pentru a transmite/recepționa mai întâi bitul cel mai semnificativ (ordinea cea mai comună).

LSB: int

Transmiteți pentru firstbit pentru a transmite/recepționa mai întâi bitul cel mai puțin semnificativ.