machine.SPI

简介

machine.SPI 类是 machine 模块下面的一个硬件类,用于对 SPI 的配置和控制,提供对 SPI 设备的操作方法。

  • SPI 是一个由主机驱动的同步串行协议。在物理层,总线有三根:SCK、MOSI、MISO。多个设备可以共享同一总线,每个设备都由一个单独的信号 SS 来选中,也称片选信号。
  • 主机通过片选信号选定一个设备进行通信。SS 信号的管理应该由用户代码负责。(通过 machine.Pin

    构造函数

在 RT-Thread MicroPython 中 SPI 对象的构造函数如下:

class machine.SPI(id, …)

在给定总线上构造一个 SPI 对象,id 取决于特定的移植。

如果想要使用软件 SPI , 即使用引脚模拟 SPI 总线,那么初始化的第一个参数需要设置为 -1 ,可参考 软件 SPI 示例

使用硬件 SPI 在初始化时只需传入 SPI 设备的编号即可,如 '50' 表示 SPI5 总线上的第 0 个设备。初始化方式可参考 硬件 SPI 示例

如果没有额外的参数,SPI 对象会被创建,但是不会被初始化,如果给出额外的参数,那么总线将被初始化,初始化参数可以参考下面的 SPI.init 方法。

方法

SPI.init(baudrate=1000000, *, polarity=0, phase=0, bits=8, firstbit=SPI.MSB, sck=None, mosi=None, miso=None)

用给定的参数初始化SPI总线:

  • baudrate :SCK 时钟频率。
  • polarity :极性可以是 0 或 1,是时钟空闲时所处的电平。
  • phase :相位可以是 0 或 1,分别在第一个或者第二个时钟边缘采集数据。
  • bits :每次传输的数据长度,一般是 8 位。
  • firstbit :传输数据从高位开始还是从低位开始,可以是 SPI.MSB 或者 SPI.LSB。
  • sck :用于 sck 的 machine.Pin 对象。
  • mosi :用于 mosi 的 machine.Pin 对象。
  • miso :用于miso 的 machine.Pin 对象。

    SPI.deinit()

关闭 SPI 总线。

SPI.read(nbytes, write=0x00)

读出 n 字节的同时不断的写入 write 给定的单字节。返回一个存放着读出数据的字节对象。

SPI.readinto(buf, write=0x00)

读出 n 字节到 buf 的同时不断地写入 write 给定的单字节。这个方法返回读入的字节数。

SPI.write(buf)

写入 buf 中包含的字节。返回None

SPI.write_readinto(write_buf, read_buf)

在读出数据到 readbuf 时,从 writebuf 中写入数据。缓冲区可以是相同的或不同,但是两个缓冲区必须具有相同的长度。返回 None

常量

SPI.MASTER

用于初始化 SPI 总线为主机。

SPI.MSB

设置从高位开始传输数据。

SPI.LSB

设置从低位开始传输数据。

示例

软件模拟 SPI

  1. >>> from machine import Pin, SPI
  2. >>> clk = Pin(("clk", 43), Pin.OUT_PP)
  3. >>> mosi = Pin(("mosi", 44), Pin.OUT_PP)
  4. >>> miso = Pin(("miso", 45), Pin.IN)
  5. >>> spi = SPI(-1, 500000, polarity = 0, phase = 0, bits = 8, firstbit = 0, sck = clk, mosi = mosi, miso = miso)
  6. >>> print(spi)
  7. SoftSPI(baudrate=500000, polarity=0, phase=0, sck=clk, mosi=mosi, miso=miso)
  8. >>> spi.write("hello rt-thread!")
  9. >>> spi.read(10)
  10. b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

硬件 SPI

需要先开启 SPI 设备驱动,查找设备可以在 msh 中输入list_device 命令。在构造函数的第一个参数传入 50,系统就会搜索名为 spi50 的设备,找到之后使用这个设备来构建 SPI 对象:

  1. >>> from machine import SPI
  2. >>> spi = SPI(50)
  3. >>> print(spi)
  4. SPI(device port : spi50)
  5. >>> spi.write(b'\x9f')
  6. >>> spi.read(5)
  7. b'\xff\xff\xff\xff\xff'
  8. >>> buf = bytearray(1)
  9. >>> spi.write_readinto(b"\x9f",buf)
  10. >>> buf
  11. bytearray(b'\xef')
  12. >>> spi.init(100000,0,0,8,1) # Resetting SPI parameter

更多内容可参考 machine.SPI

评论

原文: https://www.rt-thread.org/document/site/submodules/micropython/docs/04-Hardware_Control_Module/04-machine-SPI/