SPI 类——主驱动串行协议

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

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

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

唯一需要的参数是模式、SPI.MASTER 或 SPI.SLAVE。极性可以是 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可以是 1 或 2,或“X”或“Y”。在没有附加参数的情况下,SPI 对象被创建但不初始化(它具有总线上次初始化的设置,如果有的话)。如果给出了额外的参数,则总线被初始化。参见init初始化参数。

SPI 总线的物理引脚为:

  • SPI(1)在 X 位置: (NSS, SCK, MISO, MOSI) = (X5, X6, X7, X8) = (PA4, PA5, PA6, PA7)

  • SPI(2)在 Y 位置: (NSS, SCK, MISO, MOSI) = (Y5, Y6, Y7, Y8) = (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,是空闲时钟线所在的电平。

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

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

  • firstbit可以 SPI.MSBSPI.LSB.

  • ti True 表示德州仪器,而不是摩托罗拉,信号约定。

  • crc 可以为 None 表示没有 CRC,或多项式说明符。

请注意,SPI 时钟频率并不总是所请求的波特率。硬件仅支持 APB 总线频率(请参阅pyb.freq())除以预分频器的波特率,可以是 2、4、8、16、32、64、128或 256。SPI(1) 在 AHB2 上,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

将第一位设置为最低或最高有效位