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). crc là None (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ụ2choSPI2). 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. Xeminit()để 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êmSPI(4):Bus
NSS
SCK
MISO
MOSI
SPI(2)(tất cả các OpenMV Cam STM32)P3P2P1P0SPI(4)(chỉ OpenMV Cam N6)P15P16P17P18NSSkhô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¶
- 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:
modephải làSPI.CONTROLLERhoặcSPI.PERIPHERAL.baudratelà tốc độ xung nhịp SCK (chỉ có ý nghĩa đối với bộ điều khiển).prescalerlà hệ số chia để tạo ra SCK từ tần số bus APB; sử dụngprescalersẽ ghi đèbaudrate.polaritycó thể là 0 hoặc 1, là mức mà đường xung nhịp nhàn rỗi ở.phasecó 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.bitscó thể là 8 hoặc 16, là số bit trong mỗi từ được truyền.firstbitcó thể làSPI.MSBhoặcSPI.LSB.tiTrue cho biết quy ước tín hiệu Texas Instruments, thay vì Motorola.crccó 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, 128hoặc256); 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 đặtprescalertrự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:
recvcó 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.timeoutlà thời gian chờ tính bằng mili giây để chờ nhận.
Giá trị trả về: nếu
recvlà 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àorecv.
- send(send: int | bytes | bytearray, *, timeout: int = 5000) None¶
Gửi dữ liệu trên bus:
sendlà 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).timeoutlà 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:
sendlà 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).recvlà 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.timeoutlà 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
SCKvàMOSIvà chịu trách nhiệm giao dịch.