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.CONTROLLER
或SPI.PERIPHERAL
。baudrate
是 SCK 时钟速率(仅适用于控制器)。prescaler
是用于从 APB 总线频率导出 SCK 的预分频器;使用prescaler
将覆盖baudrate
。polarity
可以是 0 或 1,表示空闲时钟线的电平。phase
可以是 0 或 1,在第一个或第二个时钟边沿上采样数据。bits
可以是 8 或 16,是每个传输字中的位数。firstbit
可以是SPI.MSB
或SPI.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¶
将第一位设置为最小有效位或最大有效位