class SPI – 串行外设接口总线协议(控制器端)

SPI是一种由控制器驱动的同步串行协议。在物理层面上,总线由3条线组成:SCK、MOSI、MISO。多个设备可以共享同一总线。每个设备应该有一个单独的第4个信号,CS(片选信号),用来选择与之通信的总线上的特定设备。CS信号的管理应该在用户代码中进行(通过machine.Pin类)。

硬件和软件SPI实现均可通过 machine.SPImachine.SoftSPI 类。硬件SPI使用系统的底层硬件支持来执行读写操作,通常效率高且速度快,但可能对可用的引脚有限制。软件SPI通过位摆动实现,可以在任何引脚上使用,但效率不高。这些类有相同的方法可用,并且主要在构造方式上有所不同。

示例用法:

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.

构造函数

class machine.SPI(id, ...)

在给定的总线 id 上构造一个SPI对象。id 的值取决于特定的移植版本和其硬件。常用的值为0、1等,用来选择硬件SPI块#0、#1等。

如果没有额外的参数,SPI对象被创建但未初始化(它保留了总线的最后一次初始化设置,如果有的话)。如果给出了额外的参数,则初始化总线。查看 init 了解初始化的参数。

class machine.SoftSPI(baudrate=500000, *, polarity=0, phase=0, bits=8, firstbit=MSB, sck=None, mosi=None, miso=None)

构造一个新的软件SPI对象。必须给出额外的参数,通常至少包括 sckmosimiso,这些用于初始化总线。查看 SPI.init 了解参数的描述。

方法

SPI.init(baudrate=1000000, *, polarity=0, phase=0, bits=8, firstbit=SPI.MSB, sck=None, mosi=None, miso=None, pins=(SCK, MOSI, MISO))

使用给定的参数初始化 SPI 总线:

  • baudrate 是SCK时钟速率。

  • polarity 可以是 0 或 1,表示空闲时钟线的电平。

  • phase 可以是 0 或 1,在第一个或第二个时钟边沿上采样数据。

  • bits 是每次传输的位宽。所有硬件都保证支持8位。

  • firstbit 可以是 SPI.MSBSPI.LSB

  • sckmosimiso 是用于总线信号的引脚(machine.Pin)对象。对于大多数硬件SPI块(由构造函数的 id 参数选择),引脚是固定的,不能更改。在某些情况下,硬件块允许为硬件SPI块选择2-3种备选引脚集。任意引脚分配仅对位摆动SPI驱动程序(id = -1)可能。

  • pins - WiPy移植版本不使用 sckmosimiso 参数,而是允许将它们作为 pins 参数的元组指定。

在硬件SPI的情况下,实际的时钟频率可能低于请求的波特率。这取决于平台硬件。实际速率可以通过打印SPI对象来确定。

SPI.deinit()

关闭SPI总线。

SPI.read(nbytes, write=0x00)

读取由 nbytes 指定的字节数,同时连续写入由 write 给出的单个字节。返回一个包含读取数据的 bytes 对象。

SPI.readinto(buf, write=0x00)

读取到由 buf 指定的缓冲区,同时连续写入由 write 给出的单个字节。返回 None

SPI.write(buf)

写入 buf 中包含的字节。返回 None

SPI.write_readinto(write_buf, read_buf)

write_buf 写入字节,同时读取到 read_buf。缓冲区可以相同或不同,但两个缓冲区必须具有相同的长度。返回 None

常量

SPI.CONTROLLER

用于初始化到控制器的SPI总线;这仅用于WiPy

SPI.MSB
SoftSPI.MSB

将第一个比特设置为最高有效位

SPI.LSB
SoftSPI.LSB

将第一个比特设置为最低有效位