class SPI -- protokol bus Serial Peripheral Interface (sisi kontroler)

SPI adalah protokol serial sinkron yang dikendalikan oleh sebuah kontroler. Pada tingkat fisik, sebuah bus terdiri dari 3 jalur: SCK, MOSI, MISO. Beberapa perangkat dapat berbagi bus yang sama. Setiap perangkat harus memiliki sinyal keempat yang terpisah, CS (Chip Select), untuk memilih perangkat tertentu pada bus tempat komunikasi berlangsung. Pengelolaan sinyal CS harus dilakukan dalam kode pengguna (melalui kelas machine.Pin).

Implementasi SPI perangkat keras dan perangkat lunak tersedia melalui kelas SPI dan SoftSPI. SPI perangkat keras menggunakan dukungan perangkat keras yang mendasari sistem untuk melakukan baca/tulis dan biasanya efisien dan cepat, tetapi mungkin memiliki batasan pada pin mana yang dapat digunakan. SPI perangkat lunak diimplementasikan dengan bit-banging dan dapat digunakan pada pin mana pun tetapi tidak seefisien. Kedua kelas ini memiliki metode yang sama dan berbeda terutama dalam cara membuatnya.

Contoh penggunaan:

from machine import SPI, Pin

spi = SPI(0, baudrate=400000)           # Create SPI peripheral 0 at frequency of 400kHz.
                                        # Depending on the use case, extra parameters may be required
                                        # to select the bus characteristics and/or pins to use.
cs = Pin(4, mode=Pin.OUT, value=1)      # Create chip-select on pin 4.

try:
    cs(0)                               # Select peripheral.
    spi.write(b"12345678")              # Write 8 bytes, and don't care about received data.
finally:
    cs(1)                               # Deselect peripheral.

try:
    cs(0)                               # Select peripheral.
    rxdata = spi.read(8, 0x42)          # Read 8 bytes while writing 0x42 for each byte.
finally:
    cs(1)                               # Deselect peripheral.

rxdata = bytearray(8)
try:
    cs(0)                               # Select peripheral.
    spi.readinto(rxdata, 0x42)          # Read 8 bytes inplace while writing 0x42 for each byte.
finally:
    cs(1)                               # Deselect peripheral.

txdata = b"12345678"
rxdata = bytearray(len(txdata))
try:
    cs(0)                               # Select peripheral.
    spi.write_readinto(txdata, rxdata)  # Simultaneously write and read bytes.
finally:
    cs(1)                               # Deselect peripheral.

Konstruktor

class machine.SPI(id: int, baudrate: int = 1000000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None)

Membuat objek SPI pada bus yang diberikan, id. Nilai id bergantung pada port tertentu dan perangkat kerasnya. Nilai 0, 1, dst. umumnya digunakan untuk memilih blok SPI perangkat keras #0, #1, dst.

Tanpa parameter tambahan, objek SPI dibuat tetapi tidak diinisialisasi (memiliki pengaturan dari inisialisasi terakhir bus, jika ada). Jika argumen tambahan diberikan, bus diinisialisasi. Lihat init untuk parameter inisialisasi.

Metode

init(baudrate: int = 1000000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = SPI.MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None) None

Menginisialisasi bus SPI dengan parameter yang diberikan:

  • baudrate adalah laju clock SCK.

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

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

  • bits adalah lebar dalam bit setiap transfer. Hanya 8 yang dijamin didukung oleh semua perangkat keras.

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

  • sck, mosi, miso adalah objek pin (machine.Pin) yang digunakan untuk sinyal bus. Untuk sebagian besar blok SPI perangkat keras (yang dipilih oleh parameter id pada konstruktor), pin bersifat tetap dan tidak dapat diubah. Dalam beberapa kasus, blok perangkat keras memungkinkan 2-3 set pin alternatif untuk blok SPI perangkat keras. Penugasan pin sembarang hanya dimungkinkan untuk driver SPI bitbanging (id = -1).

Dalam kasus SPI perangkat keras, frekuensi clock aktual mungkin lebih rendah dari laju baud yang diminta. Hal ini bergantung pada perangkat keras platform. Laju aktual dapat ditentukan dengan mencetak objek SPI.

deinit() None

Mematikan bus SPI.

read(nbytes: int, write: int = 0x00) bytes

Membaca sejumlah byte yang ditentukan oleh nbytes sambil terus-menerus menulis satu byte yang diberikan oleh write. Mengembalikan objek bytes dengan data yang dibaca.

readinto(buf: bytearray, write: int = 0x00) None

Membaca ke dalam buffer yang ditentukan oleh buf sambil terus-menerus menulis satu byte yang diberikan oleh write. Mengembalikan None.

write(buf: bytes) None

Menulis byte yang terdapat dalam buf. Mengembalikan None.

write_readinto(write_buf: bytes, read_buf: bytearray) None

Menulis byte dari write_buf sambil membaca ke dalam read_buf. Buffer dapat sama atau berbeda, tetapi kedua buffer harus memiliki panjang yang sama. Mengembalikan None.

Konstanta

MSB: int

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

LSB: int

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

class SoftSPI -- bus SPI yang diemulasi oleh perangkat lunak

Kelas SoftSPI mengimplementasikan SPI dengan bit-banging pin GPIO sembarang. Kelas ini mengekspos permukaan metode yang sama dengan SPI sehingga kode yang menargetkan SPI perangkat keras dapat beralih ke perangkat lunak hanya dengan mengubah konstruktor. Gunakan ketika pin yang Anda butuhkan tidak terhubung ke blok SPI perangkat keras, ketika Anda memerlukan lebih banyak dari bus perangkat keras yang tersedia, atau ketika sebuah periferal memerlukan phasing clock non-standar yang tidak dapat dihasilkan oleh perangkat keras.

Konstruktor

class machine.SoftSPI(baudrate: int = 500000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None)

Membuat objek SPI perangkat lunak. sck, mosi dan miso harus disediakan -- tidak ada pemilihan pin implisit. Lihat SPI.init() untuk arti parameter lainnya. baudrate default lebih rendah dari pada SPI perangkat keras karena loop bit-bang memiliki overhead lebih banyak.

Metode

init(baudrate: int = 500000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = SoftSPI.MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None) None

Menginisialisasi ulang bus SPI perangkat lunak dengan parameter yang diberikan. Hanya argumen yang disediakan yang diperbarui; yang lain mempertahankan nilai sebelumnya. Lihat SPI.init() untuk arti setiap argumen.

deinit() None

Melepaskan pin GPIO yang diklaim oleh driver bit-bang dan berhenti mengendalikan bus.

read(nbytes: int, write: int = 0x00) bytes

Membaca nbytes byte sambil terus-menerus menulis satu byte write. Mengembalikan objek bytes yang berisi data yang diterima.

readinto(buf: bytearray, write: int = 0x00) None

Membaca ke dalam buf sambil terus-menerus menulis satu byte write. Mengembalikan None.

write(buf: bytes) None

Menulis buf ke bus. Byte yang diterima dibuang.

write_readinto(write_buf: bytes, read_buf: bytearray) None

Secara bersamaan menulis write_buf dan membaca ke dalam read_buf. Kedua buffer harus memiliki panjang yang sama; keduanya boleh saling merujuk.

Konstanta

MSB: int

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

LSB: int

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