lớp SPI -- giao thức bus giao tiếp ngoại vi nối tiếp (phía điều khiển)

SPI là giao thức nối tiếp đồng bộ được điều khiển bởi một bộ điều khiển. Ở cấp độ vật lý, một bus bao gồm 3 đường: SCK, MOSI, MISO. Nhiều thiết bị có thể chia sẻ cùng một bus. Mỗi thiết bị nên có một tín hiệu riêng biệt thứ 4 là CS (Chip Select), để chọn một thiết bị cụ thể trên bus để giao tiếp. Việc quản lý tín hiệu CS nên được thực hiện trong mã người dùng (qua lớp machine.Pin).

Cả hai triển khai SPI phần cứng và phần mềm đều tồn tại thông qua các lớp SPISoftSPI. SPI phần cứng sử dụng hỗ trợ phần cứng cơ bản của hệ thống để thực hiện các thao tác đọc/ghi và thường hiệu quả và nhanh nhưng có thể có các hạn chế về chân nào có thể sử dụng. SPI phần mềm được triển khai bằng bit-banging và có thể được sử dụng trên bất kỳ chân nào nhưng không hiệu quả bằng. Các lớp này có các phương thức tương tự nhau và khác nhau chủ yếu ở cách chúng được tạo.

Ví dụ sử dụng:

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.

Constructors

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)

Tạo một đối tượng SPI trên bus được chỉ định, id. Các giá trị của id phụ thuộc vào cổng cụ thể và phần cứng của nó. Các giá trị 0, 1, v.v. thường được sử dụng để chọn khối SPI phần cứng #0, #1, v.v.

Khi không có tham số bổ sung, đối tượng SPI được tạo nhưng chưa được khởi tạo (nó có cài đặt từ lần khởi tạo cuối cùng của bus, nếu có). Nếu có thêm đối số, bus sẽ được khởi tạo. Xem init để biết các tham số khởi tạo.

Methods

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

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

  • baudrate là tốc độ xung nhịp SCK.

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

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

  • bits là độ rộng tính bằng bit của mỗi lần truyền. Chỉ 8 được đảm bảo hỗ trợ bởi tất cả phần cứng.

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

  • sck, mosi, miso là các đối tượng chân (machine.Pin) để sử dụng cho các tín hiệu bus. Đối với hầu hết các khối SPI phần cứng (được chọn bởi tham số id của constructor), các chân được cố định và không thể thay đổi. Trong một số trường hợp, các khối phần cứng cho phép 2-3 bộ chân thay thế cho một khối SPI phần cứng. Gán chân tùy ý chỉ có thể với trình điều khiển SPI bitbanging (id = -1).

Trong trường hợp SPI phần cứng, tần số xung nhịp thực tế có thể thấp hơn tốc độ baud được yêu cầu. Điều này phụ thuộc vào phần cứng của nền tảng. Tốc độ thực tế có thể được xác định bằng cách in đối tượng SPI.

deinit() None

Tắt bus SPI.

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

Đọc một số byte được chỉ định bởi nbytes trong khi liên tục ghi byte đơn được chỉ định bởi write. Trả về đối tượng bytes với dữ liệu đã đọc.

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

Đọc vào bộ đệm được chỉ định bởi buf trong khi liên tục ghi byte đơn được chỉ định bởi write. Trả về None.

write(buf: bytes) None

Ghi các byte chứa trong buf. Trả về None.

write_readinto(write_buf: bytes, read_buf: bytearray) None

Ghi các byte từ write_buf trong khi đọc vào read_buf. Các bộ đệm có thể giống nhau hoặc khác nhau, nhưng cả hai bộ đệm phải có cùng độ dài. Trả về None.

Constants

MSB: int

Truyền vào firstbit để truyền/nhận bit có trọng số cao nhất trước (thứ tự phổ biến nhất).

LSB: int

Truyền vào firstbit để truyền/nhận bit có trọng số thấp nhất trước.

lớp SoftSPI -- bus SPI mô phỏng bằng phần mềm

Lớp SoftSPI triển khai SPI bằng cách bit-banging các chân GPIO tùy ý. Nó hiển thị cùng bề mặt phương thức như SPI để mã hiện tại nhắm mục tiêu SPI phần cứng có thể chuyển sang phần mềm chỉ với một thay đổi constructor. Sử dụng nó khi các chân bạn cần không được nối dây tới một khối SPI phần cứng, khi bạn cần nhiều hơn số lượng bus phần cứng có sẵn, hoặc khi một ngoại vi yêu cầu pha xung nhịp không tiêu chuẩn mà phần cứng không thể tạo ra.

Constructors

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)

Tạo một đối tượng SPI phần mềm. sck, mosimiso phải được cung cấp -- không có lựa chọn chân ngầm định. Xem SPI.init() để biết ý nghĩa của các tham số khác. Giá trị mặc định baudrate thấp hơn so với SPI phần cứng vì vòng lặp bit-bang có nhiều chi phí overhead hơn.

Methods

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

Khởi tạo lại bus SPI phần mềm với các tham số đã cho. Chỉ các đối số được cung cấp mới được cập nhật; các đối số khác giữ nguyên giá trị trước đó. Xem SPI.init() để biết ý nghĩa của từng đối số.

deinit() None

Giải phóng các chân GPIO được yêu cầu bởi trình điều khiển bit-bang và ngừng điều khiển bus.

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

Đọc nbytes byte trong khi liên tục ghi byte đơn write. Trả về đối tượng bytes chứa dữ liệu nhận được.

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

Đọc vào buf trong khi liên tục ghi byte đơn write. Trả về None.

write(buf: bytes) None

Ghi buf vào bus. Các byte nhận được bị loại bỏ.

write_readinto(write_buf: bytes, read_buf: bytearray) None

Đồng thời ghi write_buf và đọc vào read_buf. Cả hai bộ đệm phải có cùng độ dài; chúng có thể tham chiếu cùng một vùng nhớ.

Constants

MSB: int

Truyền vào firstbit để truyền/nhận bit có trọng số cao nhất trước.

LSB: int

Truyền vào firstbit để truyền/nhận bit có trọng số thấp nhất trước.