class SPI -- 序列周邊介面匯流排協定(控制器端)

SPI 是一種由控制器驅動的同步序列協定。在實體層面上,匯流排由 3 條線組成:SCK、MOSI、MISO。多個裝置可共用同一條匯流排。每個裝置應有獨立的第 4 條訊號線 CS(Chip Select,晶片選擇),用以選取匯流排上要進行通訊的特定裝置。CS 訊號的管理應在使用者程式碼中處理(透過 machine.Pin 類別)。

硬體與軟體 SPI 實作分別透過 SPISoftSPI 類別提供。硬體 SPI 利用系統底層的硬體支援來執行讀寫,通常高效快速,但對可使用的接腳可能有所限制。軟體 SPI 透過位元拍打(bit-banging)實作,可在任何接腳上使用,但效率較低。這兩個類別提供相同的可用方法,主要差異在於建構方式。

使用範例:

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.

建構子

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)

在指定的匯流排 id 上建構一個 SPI 物件。id 的值取決於特定移植版及其硬體。0、1 等值通常用於選取硬體 SPI 區塊 #0、#1 等。

若未提供額外參數,則會建立 SPI 物件但不進行初始化(它將沿用匯流排上次初始化的設定,若有的話)。若給定額外引數,則匯流排會被初始化。初始化參數請參閱 init

方法

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 匯流排:

  • baudrate 是 SCK 時脈速率。

  • polarity 可為 0 或 1,表示閒置時脈線所停留的電位。

  • phase 可為 0 或 1,分別表示在第一個或第二個時脈邊緣上取樣資料。

  • bits 是每次傳輸的位元寬度。僅 8 保證為所有硬體所支援。

  • firstbit 可為 SPI.MSBSPI.LSB

  • sckmosimiso 是用於匯流排訊號的接腳(machine.Pin)物件。對於大多數硬體 SPI 區塊(由傳給建構子的 id 參數所選取),接腳是固定的且無法變更。在某些情況下,硬體區塊允許硬體 SPI 區塊有 2-3 組替代的接腳組合。只有在位元拍打 SPI 驅動程式(id = -1)中才可任意指派接腳。

在硬體 SPI 的情況下,實際的時脈頻率可能低於所請求的 baudrate。這取決於平台硬體。實際速率可透過列印 SPI 物件來得知。

deinit() None

關閉 SPI 匯流排。

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

讀取由 nbytes 指定數量的位元組,同時持續寫入由 write 給定的單一位元組。回傳一個包含所讀取資料的 bytes 物件。

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

讀取資料至由 buf 指定的緩衝區,同時持續寫入由 write 給定的單一位元組。回傳 None

write(buf: bytes) None

寫入 buf 中所含的位元組。回傳 None

write_readinto(write_buf: bytes, read_buf: bytearray) None

在從 read_buf 讀取的同時寫入來自 write_buf 的位元組。兩個緩衝區可以相同或不同,但兩者長度必須相同。回傳 None

常數

MSB: int

傳給 firstbit 以最高有效位元優先傳送/接收(最常見的順序)。

LSB: int

傳給 firstbit 以最低有效位元優先傳送/接收。

class SoftSPI -- 軟體模擬的 SPI 匯流排

SoftSPI 類別透過位元拍打任意 GPIO 接腳來實作 SPI。它暴露與 SPI 相同的方法介面,因此針對硬體 SPI 撰寫的既有程式碼只需變更建構子即可切換為軟體實作。當你需要的接腳未連接到硬體 SPI 區塊、需要的匯流排數量超過可用硬體匯流排,或周邊裝置要求硬體無法產生的非標準時脈相位時,可使用它。

建構子

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)

建構一個軟體 SPI 物件。必須提供 sckmosimiso——沒有隱含的接腳選擇。其他參數的意義請參閱 SPI.init()。預設的 baudrate 比硬體 SPI 低,因為位元拍打迴圈有較多的開銷。

方法

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

以給定的參數重新初始化軟體 SPI 匯流排。只有所提供的引數會被更新;其餘的會保留先前的值。每個引數的意義請參閱 SPI.init()

deinit() None

釋放位元拍打驅動程式所佔用的 GPIO 接腳,並停止驅動匯流排。

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

讀取 nbytes 位元組,同時持續寫入單一位元組 write。回傳一個包含所接收資料的 bytes 物件。

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

讀取資料至 buf,同時持續寫入單一位元組 write。回傳 None

write(buf: bytes) None

buf 寫入匯流排。所接收的位元組會被捨棄。

write_readinto(write_buf: bytes, read_buf: bytearray) None

同時寫入 write_buf 並讀取至 read_buf。兩個緩衝區的長度必須相同;它們可以是同一個。

常數

MSB: int

傳給 firstbit 以最高有效位元優先傳送/接收。

LSB: int

傳給 firstbit 以最低有效位元優先傳送/接收。