kelas SPI -- protokol serial yang digerakkan oleh controller

SPI adalah protokol serial sinkron yang digerakkan oleh controller. Pada level fisik, protokol ini menggunakan tiga jalur (SCK, MOSI, MISO) ditambah jalur chip-select per periferal.

Penggunaan mirip dengan I2C; perbedaan utama adalah parameter yang diteruskan saat menginisialisasi bus:

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

Satu-satunya parameter yang diperlukan adalah mode (SPI.CONTROLLER atau SPI.PERIPHERAL). polarity adalah level idle dari SCK (0 atau 1). phase memilih apakah data disampling pada tepi clock pertama (0) atau kedua (1). crc adalah None (tanpa CRC) atau polinomial CRC.

Mentransfer 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

Konstruktor

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

Membuat objek SPI pada bus yang diberikan (indeks periferal SPI integer, misalnya 2 untuk SPI2). Tanpa parameter tambahan, objek dibuat tetapi tidak diinisialisasi (mempertahankan pengaturan bus sebelumnya, jika ada); jika argumen tambahan diberikan, bus diinisialisasi dengan argumen tersebut. Lihat init() untuk parameter yang tersedia.

SPI(2) terhubung ke pin header yang sama pada setiap STM32 OpenMV Cam; OpenMV Cam N6 juga mengekspos SPI(4):

Bus

NSS

SCK

MISO

MOSI

SPI(2) (semua STM32 OpenMV Cam)

P3

P2

P1

P0

SPI(4) (hanya OpenMV Cam N6)

P15

P16

P17

P18

NSS tidak digerakkan oleh periferal SPI pada salah satu bus; bebas digunakan sebagai chip-select GPIO biasa.

Metode

deinit() None

Mematikan bus 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

Menginisialisasi bus SPI dengan parameter yang diberikan:

  • mode harus berupa SPI.CONTROLLER atau SPI.PERIPHERAL.

  • baudrate adalah laju clock SCK (hanya masuk akal untuk controller).

  • prescaler adalah pembagi frekuensi yang digunakan untuk menurunkan SCK dari frekuensi bus APB; penggunaan prescaler menggantikan baudrate.

  • polarity dapat berupa 0 atau 1, dan merupakan level di mana jalur clock idle berada.

  • phase dapat berupa 0 atau 1 untuk mengambil sampel data pada tepi clock pertama atau kedua.

  • bits dapat berupa 8 atau 16, dan merupakan jumlah bit dalam setiap kata yang ditransfer.

  • firstbit dapat berupa SPI.MSB atau SPI.LSB.

  • ti True menunjukkan Texas Instruments, sebagai lawan dari Motorola, konvensi sinyal.

  • crc dapat berupa None untuk tidak ada CRC, atau penentu polinomial.

Frekuensi clock SPI mungkin tidak persis sama dengan baudrate. Hardware hanya mendukung clock yang merupakan frekuensi bus APB induk dibagi dengan pembagi berpangkat dua (2, 4, 8, 16, 32, 64, 128 atau 256); driver memilih yang tertinggi yang tidak melebihi baudrate yang diminta. SPI(2) berada di APB1. Untuk kontrol presisi atas clock, atur prescaler secara langsung alih-alih baudrate.

Mencetak objek SPI menampilkan laju baud yang dihitung dan pembagi frekuensi yang dipilih.

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

Menerima data pada bus:

  • recv dapat berupa integer, yang merupakan jumlah byte yang akan diterima, atau buffer yang dapat diubah, yang akan diisi dengan byte yang diterima.

  • timeout adalah batas waktu dalam milidetik untuk menunggu penerimaan.

Nilai kembalian: jika recv adalah integer maka buffer baru dari byte yang diterima, jika tidak, buffer yang sama yang diteruskan ke recv.

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

Mengirim data pada bus:

  • send adalah data yang akan dikirim (integer untuk dikirim, atau objek buffer).

  • timeout adalah batas waktu dalam milidetik untuk menunggu pengiriman.

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

Mengirim dan menerima data pada bus secara bersamaan:

  • send adalah data yang akan dikirim (integer untuk dikirim, atau objek buffer).

  • recv adalah buffer yang dapat diubah yang akan diisi dengan byte yang diterima. Ini bisa sama dengan send, atau dihilangkan. Jika dihilangkan, buffer baru akan dibuat.

  • timeout adalah batas waktu dalam milidetik untuk menunggu penerimaan.

Nilai kembalian: buffer dengan byte yang diterima.

Konstanta

CONTROLLER: int

Menginisialisasi bus SPI sebagai master (controller) -- OpenMV Cam menggerakkan SCK dan MOSI dan bertanggung jawab atas transaksi.

PERIPHERAL: int

Menginisialisasi bus SPI sebagai slave (peripheral) -- OpenMV Cam merespons pulsa clock yang digerakkan oleh controller jarak jauh.

MSB: int

Diteruskan ke firstbit untuk mentransmisi/menerima bit paling signifikan terlebih dahulu (urutan yang paling umum).

LSB: int

Diteruskan ke firstbit untuk mentransmisi/menerima bit paling tidak signifikan terlebih dahulu.