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 exemplu2pentruSPI2). 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țiinit()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 plusSPI(4):Magistrală
NSS
SCK
MISO
MOSI
SPI(2)(toate camerele OpenMV Cam STM32)P3P2P1P0SPI(4)(numai OpenMV Cam N6)P15P16P17P18NSSnu este controlat de perifericul SPI pe niciuna dintre magistrale; este liber să fie folosit ca un chip-select GPIO obișnuit.Metode¶
- 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:
modetrebuie să fie fieSPI.CONTROLLER, fieSPI.PERIPHERAL.baudrateeste rata ceasului SCK (utilă doar pentru un controler).prescalereste prescalerul folosit pentru a deriva SCK din frecvența magistralei APB; folosirea luiprescalerare prioritate față debaudrate.polaritypoate fi 0 sau 1 și este nivelul la care se află linia de ceas în repaus.phasepoate fi 0 sau 1 pentru a eșantiona datele pe primul, respectiv pe al doilea front de ceas.bitspoate fi 8 sau 16 și este numărul de biți din fiecare cuvânt transferat.firstbitpoate fiSPI.MSBsauSPI.LSB.tiTrue indică convențiile de semnal Texas Instruments, spre deosebire de Motorola.crcpoate 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, 128sau256); driverul îl alege pe cel mai mare care nu depășeștebaudrate-ul solicitat.SPI(2)se află pe APB1. Pentru un control precis al ceasului, setațiprescalerdirect în loc debaudrate.Afișarea obiectului SPI arată rata baud calculată și prescalerul ales.
- recv(recv: int | bytearray, *, timeout: int = 5000) bytes¶
Recepționează date pe magistrală:
recvpoate 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.timeouteste timpul de așteptare în milisecunde pentru recepție.
Valoare returnată: dacă
recveste un număr întreg, atunci un nou tampon cu octeții recepționați, altfel același tampon care a fost transmis înrecv.
- send(send: int | bytes | bytearray, *, timeout: int = 5000) None¶
Trimite date pe magistrală:
sendreprezintă datele de trimis (un număr întreg de trimis, sau un obiect tampon).timeouteste 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:
sendreprezintă datele de trimis (un număr întreg de trimis, sau un obiect tampon).recveste un tampon mutabil care va fi umplut cu octeții recepționați. Poate fi același cusend, sau poate fi omis. Dacă este omis, va fi creat un nou tampon.timeouteste 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șiMOSIș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ță.