class SPI – bir Seri Çevresel Arayüz veri yolu protokolü (denetleyici tarafı)

SPI, bir denetleyici tarafından sürülen senkron bir seri protokoldür. Fiziksel düzeyde bir veri yolu 3 hattan oluşur: SCK, MOSI, MISO. Birden fazla aygıt aynı veri yolunu paylaşabilir. Her aygıtın, veri yolu üzerinde iletişim kurulacak belirli bir aygıtı seçmek için ayrı bir 4. sinyali, CS (Chip Select), olmalıdır. Bir CS sinyalinin yönetimi kullanıcı kodunda (machine.Pin sınıfı aracılığıyla) gerçekleşmelidir.

SPI ve SoftSPI sınıfları aracılığıyla hem donanım hem de yazılım SPI uygulamaları mevcuttur. Donanım SPI, okuma/yazma işlemlerini gerçekleştirmek için sistemin altta yatan donanım desteğini kullanır ve genellikle verimli ve hızlıdır ancak hangi pinlerin kullanılabileceği konusunda kısıtlamaları olabilir. Yazılım SPI bit-banging ile uygulanır ve herhangi bir pinde kullanılabilir ancak o kadar verimli değildir. Bu sınıfların kullanılabilir yöntemleri aynıdır ve esas olarak oluşturulma biçimleriyle farklılık gösterir.

Örnek kullanım:

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.

Yapıcılar

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)

Verilen veri yolu id üzerinde bir SPI nesnesi oluşturur. id değerleri belirli bir porta ve donanımına bağlıdır. 0, 1 vb. değerler yaygın olarak donanım SPI bloğu #0, #1 vb. seçmek için kullanılır.

Ek parametre verilmezse SPI nesnesi oluşturulur ancak başlatılmaz (varsa veri yolunun son başlatılmasındaki ayarlara sahiptir). Ek argümanlar verilirse veri yolu başlatılır. Başlatma parametreleri için init bölümüne bakın.

Yöntemler

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

SPI veri yolunu verilen parametrelerle başlatır:

  • baudrate SCK saat hızıdır.

  • polarity 0 veya 1 olabilir ve boştaki saat hattının bulunduğu seviyedir.

  • phase veriyi sırasıyla birinci veya ikinci saat kenarında örneklemek için 0 veya 1 olabilir.

  • bits her aktarımın bit cinsinden genişliğidir. Yalnızca 8’in tüm donanım tarafından desteklendiği garanti edilir.

  • firstbit SPI.MSB veya SPI.LSB olabilir.

  • sck, mosi, miso veri yolu sinyalleri için kullanılacak pin (machine.Pin) nesneleridir. Çoğu donanım SPI bloğu için (yapıcıya verilen id parametresiyle seçilen) pinler sabittir ve değiştirilemez. Bazı durumlarda donanım blokları, bir donanım SPI bloğu için 2-3 alternatif pin kümesine izin verir. Keyfi pin atamaları yalnızca bir bitbanging SPI sürücüsü (id = -1) için mümkündür.

Donanım SPI durumunda gerçek saat frekansı istenen baud hızından düşük olabilir. Bu, platform donanımına bağlıdır. Gerçek hız, SPI nesnesi yazdırılarak belirlenebilir.

deinit() None

SPI veri yolunu kapatır.

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

write ile verilen tek baytı sürekli yazarken nbytes ile belirtilen sayıda bayt okur. Okunan veriyi içeren bir bytes nesnesi döndürür.

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

write ile verilen tek baytı sürekli yazarken buf ile belirtilen arabelleğe okur. None döndürür.

write(buf: bytes) None

buf içinde bulunan baytları yazar. None döndürür.

write_readinto(write_buf: bytes, read_buf: bytearray) None

read_buf içine okurken write_buf içindeki baytları yazar. Arabellekler aynı veya farklı olabilir ancak her iki arabelleğin de aynı uzunlukta olması gerekir. None döndürür.

Sabitler

MSB: int

En anlamlı biti önce (en yaygın sıralama) iletmek/almak için firstbit argümanına geçirin.

LSB: int

En az anlamlı biti önce iletmek/almak için firstbit argümanına geçirin.

class SoftSPI – yazılımla taklit edilen SPI veri yolu

SoftSPI sınıfı, keyfi GPIO pinlerini bit-banging ile sürerek SPI’yı uygular. SPI ile aynı yöntem yüzeyini sunar, böylece donanım SPI’yı hedefleyen mevcut kod yalnızca bir yapıcı değişikliğiyle yazılıma geçebilir. İhtiyaç duyduğunuz pinler bir donanım SPI bloğuna kablolanmamışsa, mevcut donanım veri yollarından daha fazlasına ihtiyaç duyduğunuzda ya da bir çevre birimi donanımın üretemeyeceği standart olmayan bir saat fazlaması gerektirdiğinde kullanın.

Yapıcılar

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)

Bir yazılım SPI nesnesi oluşturur. sck, mosi ve miso sağlanmalıdır – örtük pin seçimi yoktur. Diğer parametrelerin anlamı için SPI.init() bölümüne bakın. Bit-bang döngüsünün daha fazla ek yükü olduğundan varsayılan baudrate, donanım SPI için olandan daha düşüktür.

Yöntemler

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

Yazılım SPI veri yolunu verilen parametrelerle yeniden başlatır. Yalnızca sağlanan argümanlar güncellenir; diğerleri önceki değerlerini korur. Her argümanın anlamı için SPI.init() bölümüne bakın.

deinit() None

Bit-bang sürücüsünün sahiplendiği GPIO pinlerini serbest bırakır ve veri yolunu sürmeyi durdurur.

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

Tek bayt write değerini sürekli yazarken nbytes bayt okur. Alınan veriyi içeren bir bytes nesnesi döndürür.

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

Tek bayt write değerini sürekli yazarken buf içine okur. None döndürür.

write(buf: bytes) None

buf değerini veri yoluna yazar. Alınan baytlar atılır.

write_readinto(write_buf: bytes, read_buf: bytearray) None

Aynı anda write_buf değerini yazar ve read_buf içine okur. Her iki arabellek de aynı uzunlukta olmalıdır; örtüşebilirler (alias).

Sabitler

MSB: int

En anlamlı biti önce iletmek/almak için firstbit argümanına geçirin.

LSB: int

En az anlamlı biti önce iletmek/almak için firstbit argümanına geçirin.