class SPI -- 由控制器驅動的串列協定

SPI 是一種由控制器驅動的同步串列協定。在實體層級上,它使用三條線(SCKMOSIMISO)加上每個周邊一條的晶片選擇線。

用法與 I2C 類似;主要差異在於初始化匯流排時所傳遞的參數:

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

唯一必要的參數是 modeSPI.CONTROLLERSPI.PERIPHERAL)。polaritySCK 的閒置準位(01)。phase 選擇資料是在第一個(0)或第二個(1)時鐘邊緣取樣。crcNone(無 CRC)或一個 CRC 多項式。

傳輸資料:

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

建構子

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

在給定的 bus(一個整數 SPI 周邊索引,例如 2 表示 SPI2)上建構一個 SPI 物件。不帶額外參數時,物件會被建立但不會初始化(它會保留先前的匯流排設定,若有的話);如果提供了額外引數,則匯流排會以這些引數初始化。可用的參數請參閱 init()

SPI(2) 在每一個 STM32 OpenMV Cam 上都連接到相同的排針接腳;OpenMV Cam N6 額外提供 SPI(4)

匯流排

NSS

SCK

MISO

MOSI

SPI(2)(所有 STM32 OpenMV Cam)

P3

P2

P1

P0

SPI(4)(僅限 OpenMV Cam N6)

P15

P16

P17

P18

NSS 在兩個匯流排上都不由 SPI 周邊驅動;它可以自由地作為一般 GPIO 晶片選擇使用。

方法

deinit() None

關閉 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

以給定的參數初始化 SPI 匯流排:

  • mode 必須是 SPI.CONTROLLERSPI.PERIPHERAL

  • baudrate 是 SCK 時鐘速率(只對控制器有意義)。

  • prescaler 是用來從 APB 匯流排頻率推導出 SCK 的預除器;使用 prescaler 會覆蓋 baudrate

  • polarity 可以是 0 或 1,是閒置時鐘線所處的準位。

  • phase 可以是 0 或 1,分別在第一個或第二個時鐘邊緣取樣資料。

  • bits 可以是 8 或 16,是每個傳輸字組的位元數。

  • firstbit 可以是 SPI.MSBSPI.LSB

  • ti 為 True 表示採用 Texas Instruments 的訊號慣例,而非 Motorola 的慣例。

  • crc 可以是 None 表示無 CRC,或一個多項式指定符。

SPI 時鐘頻率可能不會與 baudrate 完全相符。硬體只支援為父 APB 匯流排頻率除以二的冪次預除器(2, 4, 8, 16, 32, 64, 128256)的時鐘;驅動程式會挑選不超過所要求 baudrate 的最高者。SPI(2) 位於 APB1 上。若要精確控制時鐘,請直接設定 prescaler 而非 baudrate

印出 SPI 物件會顯示計算出的鮑率與選定的預除器。

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

在匯流排上接收資料:

  • recv 可以是一個整數,表示要接收的位元組數,或是一個可變緩衝區,將以接收到的位元組填入。

  • timeout 是等待接收的逾時毫秒數。

回傳值:如果 recv 是整數,則回傳一個包含所接收位元組的新緩衝區,否則回傳傳入 recv 的同一個緩衝區。

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

在匯流排上傳送資料:

  • send 是要傳送的資料(要傳送的整數,或一個緩衝區物件)。

  • timeout 是等待傳送的逾時毫秒數。

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

在匯流排上同時傳送與接收資料:

  • send 是要傳送的資料(要傳送的整數,或一個緩衝區物件)。

  • recv 是一個可變緩衝區,將以接收到的位元組填入。它可以與 send 相同,或省略。若省略,則會建立一個新的緩衝區。

  • timeout 是等待接收的逾時毫秒數。

回傳值:包含所接收位元組的緩衝區。

常數

CONTROLLER: int

將 SPI 匯流排初始化為主控端(控制器)—— OpenMV Cam 驅動 SCKMOSI 並掌控交易。

PERIPHERAL: int

將 SPI 匯流排初始化為從屬端(周邊)—— OpenMV Cam 回應由遠端控制器驅動的時鐘脈衝。

MSB: int

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

LSB: int

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