machine.SPI#

SPI(Serial Peripheral Interface) 是一个同步串行协议,由主机和从机组成。

标准4线模式由 SCK(SCLK), CS(片选), MOSI, MISO 4条线连接主从机

在 K210 上, SPI 有一下特征:

  • 共有 4 个 SPI 设备, 其中 SPI0 、SPI1、 SPI3 只能工作在主机模式下, SPI2 只能工作在从机模式时下, 在 CanMV 上, SPI3 已经用来连接了 SPI Flash 作为保留硬件资源。

  • 支持 1/2/4/8 线全双工模式, 在 CanMV 中, 目前只支持标准(摩托罗拉)4线全双工模式(即 SCK, MOSI, MISO, CS 四个引脚)

  • 最高传输速率 45M:1/2主频,约 200Mbps

  • 支持 DMA

  • 4个可配置任意引脚的硬件片选

machine.SPI#

构造函数#

spi = 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 对象

参数#

  • id: SPI ID, 取值范围[0,4], 目前只支持 0 和 1 、4 , 并且只能是主机模式, 2 只能作为从机,目前未实现, 3 保留, 4 使用软模拟 SPI(.SPI_SOFT)

  • 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 统一管理引脚映射。

函数#

init#

spi.init(id, mode=SPI.MODE_MASTER, baudrate=500000, polarity=0, phase=0, bits=8, firstbit=SPI.MSB, sck, mosi, miso, cs0)

类似构造函数

参数#

与构造函数相同

返回值#

read#

spi.read(nbytes, write=0x00, cs=SPI.CS0)

读取数据

参数#
  • nbytes: 需要读取的长度

  • cs: 选择片选引脚, 在初始化时已经为cs0~cs3设置了引脚,这里只需要选择SPI.CS0~SPI.CS3即可,默认为SPI.CS0

  • write: 因为是全双工,设置在读取时MOSI引脚的值,默认为0x00,即始终为低电平

返回值#

bytes类型的数据

readinto#

spi.readinto(buf, write=0x00, cs=SPI.CS0)

读取数据,并放到指定变量中

参数#
  • bufbytearray 类型, 定义了长度,读取完成后数据保存在此

  • cs: 选择片选引脚, 在初始化时已经为cs0~cs3设置了引脚,这里只需要选择SPI.CS0~SPI.CS3即可,默认为SPI.CS0

  • write: 因为是全双工,设置在读取时MOSI引脚的值,默认为0x00,即始终为低电平

返回值#

write#

spi.write(buf, cs=SPI.CS0)

发送数据

参数#
  • bufbytearray 类型, 定义了数据及长度

  • cs: 选择片选引脚, 在初始化时已经为cs0~cs3设置了引脚,这里只需要选择SPI.CS0~SPI.CS3即可,默认为SPI.CS0

返回值#

write_readinto#

spi.write(write_buf, read_buf, cs=SPI.CS0)

发送数据,同时读取数据到变量,即全双工

参数#
  • write_bufbytearray 类型, 定义了需要发送的数据及长度

  • read_bufbytearray 类型, 定义了接收数据存放的位置

  • cs: 选择片选引脚, 在初始化时已经为cs0~cs3设置了引脚,这里只需要选择SPI.CS0~SPI.CS3即可,默认为SPI.CS0

返回值#

deinit#

spi.deinit()

注销 SPI,释放硬件,关闭 SPI 时钟

参数#

返回值#

常量#

  • SPI0: SPI 0

  • SPI1: SPI 1

  • SPI2: SPI 2

  • MODE_MASTER: 作为主机模式

  • MODE_MASTER_2: 作为主机模式

  • MODE_MASTER_4: 作为主机模式

  • MODE_MASTER_8: 作为主机模式

  • MODE_SLAVE: 作为从机模式

  • MSB: MSB, 即先发送高位或高字节

  • LSB: LSB, 即先发送低位或者低字节

  • CS0: 片选0

  • CS1: 片选1

  • CS2: 片选2

  • CS3: 片选3

例程#

例程 1: 基本读写#

from machine import SPI

spi = 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)
spi.write(w)
spi.write(w, cs=SPI.CS0)
spi.write_readinto(w, r)
spi.read(5, write=0x00)
spi.readinto(r, write=0x00)