SPI类 – 串行外设接口

SPI是由主机驱动的串行协议。其物理层包括3道线:SCK、MOSI、MISO。

SPI的应用模式与I2C极为相似。其主要区别在于初始化SPI总线的参数:

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

只需参数为SPI.MASTER或SPI.SLAVE模式。极性可为0或1,即闲置时钟线所在水平。相位可为0或1,各在第一第二个时钟边缘采样数据。CRC可为None或一个多项式。

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对象。可为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, polarity=1, phase=0, bits=8, firstbit=SPI.MSB, ti=False, crc=None)

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

  • mode 必须为 SPI.MASTERSPI.SLAVE.
  • baudrate 是SCK的时钟频率(只对主机有效)。
  • prescaler 是用来从APB的总线频率中获取SCK的预标量; prescaler 的使用优先于 baudrate .
  • polarity 可为0或1极性可为0或1,即闲置时钟线所在水平。
  • phase 可为0或1,各在第一第二个时钟边缘采样数据。
  • bits can be 8 or 16, and is the number of bits in each transferred word.
  • firstbit 可为 SPI.MSB 或者 SPI.LSB.
  • crc 可为None(无CRC时)或一个多项式。

注意:SPI时钟频率可能并非所请求的波特率。硬件仅支持为APB总线频率(见 pyb.freq())除以预分频数的波特率, 其数值可为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.MASTER
SPI.SLAVE

将SPI总线初始化为主模式或从模式。

SPI.LSB
SPI.MSB

将首位设置为最小或最重要的位。