class SPI – 串行外设接口总线协议(控制器端)¶
SPI是一种由控制器驱动的同步串行协议。在物理层面上,总线由3条线组成:SCK、MOSI、MISO。多个设备可以共享同一总线。每个设备应该有一个单独的第4个信号,CS(片选信号),用来选择与之通信的总线上的特定设备。CS信号的管理应该在用户代码中进行(通过machine.Pin类)。
硬件和软件SPI实现均可通过 machine.SPI 和 machine.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
了解初始化的参数。
方法¶
- 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.MSB
或SPI.LSB
。sck
、mosi
、miso
是用于总线信号的引脚(machine.Pin)对象。对于大多数硬件SPI块(由构造函数的id
参数选择),引脚是固定的,不能更改。在某些情况下,硬件块允许为硬件SPI块选择2-3种备选引脚集。任意引脚分配仅对位摆动SPI驱动程序(id
= -1)可能。pins
- WiPy移植版本不使用sck
、mosi
、miso
参数,而是允许将它们作为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