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.MASTER或SPI.SLAVE.baudrate是 SCK 时钟速率(仅适用于主设备)。prescaler是用于从 APB 总线频率导出 SCK 的预分频器;使用prescaler覆盖baudrate。polarity可以是 0 或 1,是空闲时钟线所在的电平。phase可以是 0 或 1 分别在第一个或第二个时钟沿采样数据。bits可以是 8 或 16,并且是每个传输字中的位数。firstbit可以SPI.MSB或SPI.LSB.tiTrue 表示德州仪器,而不是摩托罗拉,信号约定。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是等待接收的超时时间(以毫秒为单位)。
返回值:包含接收字节的缓冲区。