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
.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
是等待接收的超时时间(以毫秒为单位)。
返回值:包含接收字节的缓冲区。