machine.SPI
SPI(Serial Peripheral Interface) 是一个同步串行协议,由主机和从机组成。
标准4线模式由 SCK(SCLK), CS(片选), MOSI, MISO 4条线连接主从机
在 K210 上, SPI 有一下特征:
- 共有 4 个 SPI 设备, 其中 SPI0 、SPI1、 SPI3 只能工作在主机模式下, SPI2 只能工作在从机模式时下, 在 MaixPy 上, SPI3已经用来连接了 SPI Flash, 暂时保留, 以后如果有必要再考虑开放接口与 SPI Flash 分时复用
- 支持 1/2/4/8 线全双工模式, 在 MaixPy 中, 目前只支持标准(摩托罗拉)4线全双工模式(即 SCK, MOSI, MISO, CS 四个引脚)
- 最高传输速率45M
- 支持DMA
- 4个可配置任意引脚的硬件片选
1. 构造函数
class machine.SPI(id, mode=SPI.MODE_MASTER, baudrate=500000, polarity=0, phase=0, bits=8, firstbit=SPI.MSB, sck, mosi, miso, cs0, cs1, cs2, cs3)
通过指定的参数新建一个 SPI 对象
1.1. 参数
id
: SPI ID, 取值范围[0,3], 目前只支持 0 和 1, 并且只能是主机模式, 2 只能作为从机,目前未实现, 3 保留mode
: SPI 模式,MODE_MASTER
或者MODE_MASTER_2
或者MODE_MASTER_4
或者MODE_MASTER_8
或者MODE_SLAVE
, 目前只支持MODE_MASTER
baudrate
: SPI 波特率(频率)polarity
: 极性, 取值为 0 或 1, 表示 SPI 在空闲时的极性, 0 代表低电平, 1 代表高电平phase
: 相, 取值位 0 或 1, 表示在时钟的第一个还是第二个跳变沿采集数据, 0 表示第一个, 1 表示第二个bits
: 数据宽度, 默认值为8, 取值范围[4,32]firstbit
: 指定传输采用 MSB 还是 LSB 顺序传输, 默认SPI.MSB
sck
: SCK(时钟)引脚, 可直接传引脚数值,取值范围:[0,47]。 可以不设置,而是使用 fm 统一管理引脚映射。mosi
: MOSI(主机输出) 引脚, 可直接传引脚数值,取值范围:[0,47]。 可以不设置,而是使用 fm 统一管理引脚映射。miso
: MISO(主机输入) 引脚, 可直接传引脚数值,取值范围:[0,47]。 可以不设置,而是使用 fm 统一管理引脚映射。cs0
: CS0(片选) 引脚, 可直接传引脚数值,取值范围:[0,47]。 可以不设置,而是使用 fm 统一管理引脚映射。cs1
: CS1(片选) 引脚, 可直接传引脚数值,取值范围:[0,47]。 可以不设置,而是使用 fm 统一管理引脚映射。cs2
: CS2(片选) 引脚, 可直接传引脚数值,取值范围:[0,47]。 可以不设置,而是使用 fm 统一管理引脚映射。cs3
: CS3(片选) 引脚, 可直接传引脚数值,取值范围:[0,47]。 可以不设置,而是使用 fm 统一管理引脚映射。d0~d7
: 数据引脚, 在非标准4线模式中使用,目前保留。 可以不设置,而是使用 fm 统一管理引脚映射。
2. 方法
2.1. init
类似构造函数
SPI.init(id, mode=SPI.MODE_MASTER, baudrate=500000, polarity=0, phase=0, bits=8, firstbit=SPI.MSB, sck, mosi, miso, cs0)
参数
与构造函数相同
返回值
无
2.2. read
读取数据
SPI.read(nbytes, write=0x00, cs=SPI.CS0)
参数
nbytes
: 需要读取的长度cs
: 选择片选引脚, 在初始化时已经为cs0
~cs3
设置了引脚,这里只需要选择SPI.CS0
~SPI.CS3
即可,默认为SPI.CS0
write
: 因为是全双工,设置在读取时MOSI
引脚的值,默认为0x00
,即始终为低电平
返回值
bytes
类型的数据
2.3. readinto
读取数据,并放到指定变量中
SPI.readinto(buf, write=0x00, cs=SPI.CS0)
参数
buf
:bytearray
类型, 定义了长度,读取完成后数据保存在此cs
: 选择片选引脚, 在初始化时已经为cs0
~cs3
设置了引脚,这里只需要选择SPI.CS0
~SPI.CS3
即可,默认为SPI.CS0
write
: 因为是全双工,设置在读取时MOSI
引脚的值,默认为0x00
,即始终为低电平
返回值
无
2.4. write
发送数据
SPI.write(buf, cs=SPI.CS0)
参数
buf
:bytearray
类型, 定义了数据及长度cs
: 选择片选引脚, 在初始化时已经为cs0
~cs3
设置了引脚,这里只需要选择SPI.CS0
~SPI.CS3
即可,默认为SPI.CS0
返回值
无
2.5. write_readinto
发送数据,同时读取数据到变量,即全双工
SPI.write(write_buf, read_buf, cs=SPI.CS0)
参数
write_buf
:bytearray
类型, 定义了需要发送的数据及长度read_buf
:bytearray
类型, 定义了接收数据存放的位置cs
: 选择片选引脚, 在初始化时已经为cs0
~cs3
设置了引脚,这里只需要选择SPI.CS0
~SPI.CS3
即可,默认为SPI.CS0
返回值
无
2.6. deinit/_del_
注销 SPI,释放硬件,关闭 SPI 时钟
SPI.deinit()
参数
无
返回值
无
例子
spi.deinit()
或者
del spi
3. 常量
SPI0
: SPI 0SPI1
: SPI 1SPI2
: SPI 2MODE_MASTER
: 作为主机模式MODE_MASTER_2
: 作为主机模式MODE_MASTER_4
: 作为主机模式MODE_MASTER_8
: 作为主机模式MODE_SLAVE
: 作为从机模式MSB
: MSB, 即先发送高位或高字节LSB
: LSB, 即先发送低位或者低字节CS0
: 片选0CS1
: 片选1CS2
: 片选2CS3
: 片选3
4. 例程
4.1. 例程 1: 基本读写
from machine import SPI
spi1 = SPI(SPI.SPI1, mode=SPI.MODE_MASTER, baudrate=10000000, polarity=0, phase=0, bits=8, firstbit=SPI.MSB, sck=28, mosi=29, miso=30, cs0=27)
w = b'1234'
r = bytearray(4)
spi1.write(w)
spi1.write(w, cs=SPI.CS0)
spi1.write_readinto(w, r)
spi1.read(5, write=0x00)
spi1.readinto(r, write=0x00)