lớp SPI -- giao thức nối tiếp do bộ điều khiển điều khiển

SPI là giao thức nối tiếp đồng bộ do bộ điều khiển điều khiển. Ở mức vật lý, nó sử dụng ba dây (SCK, MOSI, MISO) cộng với một dây chọn chip cho mỗi ngoại vi.

Cách dùng tương tự như I2C; sự khác biệt chính là các tham số truyền vào khi khởi tạo bus:

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

Tham số duy nhất bắt buộc là mode (SPI.CONTROLLER hoặc SPI.PERIPHERAL). polarity là mức nhàn rỗi của SCK (0 hoặc 1). phase chọn xem dữ liệu được lấy mẫu trên cạnh xung nhịp đầu tiên (0) hay thứ hai (1). crcNone (không có CRC) hoặc một đa thức CRC.

Truyền dữ liệu:

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

Hàm khởi tạo

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

Khởi tạo một đối tượng SPI trên bus đã cho (một chỉ số ngoại vi SPI kiểu số nguyên, ví dụ 2 cho SPI2). Không có thêm tham số, đối tượng được tạo nhưng chưa được khởi tạo (nó giữ nguyên các thiết lập bus trước đó, nếu có); nếu có thêm đối số, bus được khởi tạo với chúng. Xem init() để biết các tham số có sẵn.

SPI(2) được kết nối với cùng các chân header trên mọi OpenMV Cam STM32; OpenMV Cam N6 bổ sung thêm SPI(4):

Bus

NSS

SCK

MISO

MOSI

SPI(2) (tất cả các OpenMV Cam STM32)

P3

P2

P1

P0

SPI(4) (chỉ OpenMV Cam N6)

P15

P16

P17

P18

NSS không được điều khiển bởi ngoại vi SPI trên bất kỳ bus nào; nó có thể được dùng tự do như một GPIO chọn chip thông thường.

Phương thức

deinit() None

Tắt bus 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

Khởi tạo bus SPI với các tham số đã cho:

  • mode phải là SPI.CONTROLLER hoặc SPI.PERIPHERAL.

  • baudrate là tốc độ xung nhịp SCK (chỉ có ý nghĩa đối với bộ điều khiển).

  • prescaler là hệ số chia để tạo ra SCK từ tần số bus APB; sử dụng prescaler sẽ ghi đè baudrate.

  • polarity có thể là 0 hoặc 1, là mức mà đường xung nhịp nhàn rỗi ở.

  • phase có thể là 0 hoặc 1 để lấy mẫu dữ liệu trên cạnh xung nhịp đầu tiên hoặc thứ hai tương ứng.

  • bits có thể là 8 hoặc 16, là số bit trong mỗi từ được truyền.

  • firstbit có thể là SPI.MSB hoặc SPI.LSB.

  • ti True cho biết quy ước tín hiệu Texas Instruments, thay vì Motorola.

  • crc có thể là None để không có CRC, hoặc một chỉ định đa thức.

Tần số xung nhịp SPI có thể không khớp chính xác với baudrate. Phần cứng chỉ hỗ trợ các xung nhịp là tần số bus APB cha chia cho hệ số chia là lũy thừa hai (2, 4, 8, 16, 32, 64, 128 hoặc 256); trình điều khiển chọn hệ số cao nhất không vượt quá baudrate được yêu cầu. SPI(2) nằm trên APB1. Để kiểm soát chính xác xung nhịp, hãy đặt prescaler trực tiếp thay vì baudrate.

In đối tượng SPI hiển thị tốc độ baud đã tính toán và hệ số chia được chọn.

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

Nhận dữ liệu trên bus:

  • recv có thể là một số nguyên, là số byte cần nhận, hoặc một bộ đệm có thể thay đổi, sẽ được lấp đầy bằng các byte nhận được.

  • timeout là thời gian chờ tính bằng mili giây để chờ nhận.

Giá trị trả về: nếu recv là số nguyên thì trả về bộ đệm mới chứa các byte đã nhận, ngược lại trả về cùng bộ đệm đã truyền vào recv.

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

Gửi dữ liệu trên bus:

  • send là dữ liệu cần gửi (một số nguyên cần gửi, hoặc một đối tượng bộ đệm).

  • timeout là thời gian chờ tính bằng mili giây để chờ gửi.

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

Gửi và nhận dữ liệu trên bus cùng một lúc:

  • send là dữ liệu cần gửi (một số nguyên cần gửi, hoặc một đối tượng bộ đệm).

  • recv là một bộ đệm có thể thay đổi sẽ được lấp đầy bằng các byte nhận được. Nó có thể giống như send, hoặc bỏ qua. Nếu bỏ qua, một bộ đệm mới sẽ được tạo.

  • timeout là thời gian chờ tính bằng mili giây để chờ nhận.

Giá trị trả về: bộ đệm chứa các byte đã nhận.

Hằng số

CONTROLLER: int

Khởi tạo bus SPI như master (bộ điều khiển) -- OpenMV Cam điều khiển SCKMOSI và chịu trách nhiệm giao dịch.

PERIPHERAL: int

Khởi tạo bus SPI như slave (ngoại vi) -- OpenMV Cam phản hồi các xung nhịp do bộ điều khiển từ xa điều khiển.

MSB: int

Truyền đến firstbit để truyền/nhận bit quan trọng nhất trước (thứ tự phổ biến nhất).

LSB: int

Truyền đến firstbit để truyền/nhận bit ít quan trọng nhất trước.