class SPI -- 由控制器驅動的串列協定¶
SPI 是一種由控制器驅動的同步串列協定。在實體層級上,它使用三條線(SCK、MOSI、MISO)加上每個周邊一條的晶片選擇線。
用法與 I2C 類似;主要差異在於初始化匯流排時所傳遞的參數:
from pyb import SPI
spi = SPI(2, SPI.CONTROLLER, baudrate=600000, polarity=1, phase=0, crc=0x7)
唯一必要的參數是 mode(SPI.CONTROLLER 或 SPI.PERIPHERAL)。polarity 是 SCK 的閒置準位(0 或 1)。phase 選擇資料是在第一個(0)或第二個(1)時鐘邊緣取樣。crc 為 None(無 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)P3P2P1P0SPI(4)(僅限 OpenMV Cam N6)P15P16P17P18NSS在兩個匯流排上都不由 SPI 周邊驅動;它可以自由地作為一般 GPIO 晶片選擇使用。方法¶
- 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.CONTROLLER或SPI.PERIPHERAL。baudrate是 SCK 時鐘速率(只對控制器有意義)。prescaler是用來從 APB 匯流排頻率推導出 SCK 的預除器;使用prescaler會覆蓋baudrate。polarity可以是 0 或 1,是閒置時鐘線所處的準位。phase可以是 0 或 1,分別在第一個或第二個時鐘邊緣取樣資料。bits可以是 8 或 16,是每個傳輸字組的位元數。firstbit可以是SPI.MSB或SPI.LSB。ti為 True 表示採用 Texas Instruments 的訊號慣例,而非 Motorola 的慣例。crc可以是 None 表示無 CRC,或一個多項式指定符。
SPI 時鐘頻率可能不會與
baudrate完全相符。硬體只支援為父 APB 匯流排頻率除以二的冪次預除器(2, 4, 8, 16, 32, 64, 128或256)的時鐘;驅動程式會挑選不超過所要求baudrate的最高者。SPI(2)位於 APB1 上。若要精確控制時鐘,請直接設定prescaler而非baudrate。印出 SPI 物件會顯示計算出的鮑率與選定的預除器。
- recv(recv: int | bytearray, *, timeout: int = 5000) bytes¶
在匯流排上接收資料:
recv可以是一個整數,表示要接收的位元組數,或是一個可變緩衝區,將以接收到的位元組填入。timeout是等待接收的逾時毫秒數。
回傳值:如果
recv是整數,則回傳一個包含所接收位元組的新緩衝區,否則回傳傳入recv的同一個緩衝區。
常數¶