class SPI – 由控制器驱动的串行协议

SPI 是一种由控制器驱动的串行协议。在物理层面上有 3 条线:SCK、MOSI、MISO。

查看 I2C 的使用模型;SPI 非常相似。主要区别在于初始化 SPI 总线时的参数:

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

唯一必需的参数是 mode,可以是 SPI.CONTROLLER 或 SPI.PERIPHERAL。极性可以是 0 或 1,表示空闲时钟线的电平。相位可以是 0 或 1,分别在第一个或第二个时钟边沿上采样数据。CRC 可以为 None 表示无 CRC,或者是一个多项式指示器。

SPI的其他方法:

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/recv 4 bytes from/to buf

构造

class pyb.SPI(bus, ...)

在给定总线上构造一个 SPI 对象。bus 可以是 2。如果没有额外的参数,则创建 SPI 对象但不初始化(它具有总线上最后一次初始化的设置,如果有的话)。如果给定了额外的参数,则会初始化总线。请参阅 init 来了解初始化的参数。

SPI总线的物理引脚如下:

  • SPI(2): (NSS, SCK, MISO, MOSI) = (P3, P2, P1, P0) = (PB12, PB13, PB14, PB15)

目前,NSS引脚未被SPI驱动程序使用,可供其他用途使用。

方法

SPI.deinit()

关闭SPI总线。

SPI.init(mode, baudrate=328125, *, prescaler=-1, polarity=1, phase=0, bits=8, firstbit=SPI.MSB, ti=False, crc=None)

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

  • mode 必须是 SPI.CONTROLLERSPI.PERIPHERAL

  • baudrate 是 SCK 时钟速率(仅适用于控制器)。

  • prescaler 是用于从 APB 总线频率导出 SCK 的预分频器;使用 prescaler 将覆盖 baudrate

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

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

  • bits 可以是 8 或 16,是每个传输字中的位数。

  • firstbit 可以是 SPI.MSBSPI.LSB

  • ti 为 True 表示 Texas Instruments,与 Motorola 信号约定相对。

  • crc 可以为 None 表示无 CRC,或者是一个多项式指示器。

请注意,SPI 时钟频率不总是请求的波特率。硬件仅支持 APB 总线频率除以预分频器得到的波特率,预分频器可以为 2、4、8、16、32、64、128 或 256。SPI(2) 在 AHB1 上。为了精确控制 SPI 时钟频率,请指定 prescaler 而不是 baudrate

打印SPI对象将显示计算出的波特率和选择的预分频器。

SPI.recv(recv, *, timeout=5000)

在总线上接收数据:

  • recv 可以是一个整数,表示要接收的字节数,或者是一个可变缓冲区,将用接收到的字节填充它。

  • timeout 是等待接收的超时时间(以毫秒为单位)。

返回值:如果 recv 是整数,则返回接收到的字节的新缓冲区,否则返回传入 recv 的相同缓冲区。

SPI.send(send, *, timeout=5000)

在总线上发送数据:

  • send 是要发送的数据(一个要发送的整数或缓冲区对象)。

  • timeout 是等待发送的超时时间(以毫秒为单位)。

返回值:None

SPI.send_recv(send, recv=None, *, timeout=5000)

同时在总线上发送和接收数据:

  • send 是要发送的数据(一个要发送的整数或缓冲区对象)。

  • recv 是一个可变缓冲区,将用接收到的字节填充它。它可以与 send 相同,也可以省略。如果省略,则会创建一个新的缓冲区。

  • timeout 是等待接收的超时时间(以毫秒为单位)。

返回值:接收到字节的缓冲区。

常量

SPI.CONTROLLER
SPI.PERIPHERAL

用于将 SPI 总线初始化为控制器或外围设备模式

SPI.LSB
SPI.MSB

将第一位设置为最小有效位或最大有效位