rp2pio – RP2 系列可编程 IO (PIO) 外设的硬件接口。

rp2pio.pins_are_sequential(pins: List[microcontroller.Pin])bool

如果引脚具有连续的 GPIO 编号,则返回 True,否则返回 False

class rp2pio.StateMachine(program: _typing.ReadableBuffer, frequency: int, *, init: Optional[_typing.ReadableBuffer] = None, first_out_pin: Optional[microcontroller.Pin] = None, out_pin_count: int = 1, initial_out_pin_state: int = 0, initial_out_pin_direction: int = 4294967295, first_in_pin: Optional[microcontroller.Pin] = None, in_pin_count: int = 1, pull_in_pin_up: int = 0, pull_in_pin_down: int = 0, first_set_pin: Optional[microcontroller.Pin] = None, set_pin_count: int = 1, initial_set_pin_state: int = 0, initial_set_pin_direction: int = 31, first_sideset_pin: Optional[microcontroller.Pin] = None, sideset_pin_count: int = 1, initial_sideset_pin_state: int = 0, initial_sideset_pin_direction: int = 31, exclusive_pin_use: bool = True, auto_pull: bool = False, pull_threshold: int = 32, out_shift_right: bool = True, wait_for_txstall: bool = True, auto_push: bool = False, push_threshold: int = 32, in_shift_right: bool = True, user_interruptible: bool = True)

单个 PIO 状态机

RP2 系列微控制器上的可编程 I/O 外设是独一无二的。它是可用于各种协议的通用状态机的集合。状态机可以是独立的或协调的。程序存储器和 IRQ 在特定 PIO 实例中的状态机之间共享。否则他们是独立的。

此类旨在促进 PIO 资源的共享。默认情况下,假设状态机单独使用,并且可以放置在任一 PIO 中。如果可能,具有相同程序的状态机将放置在相同的 PIO 中。

使用给定的程序在给定的引脚上构造一个 StateMachine 对象。

参数
  • program (ReadableBuffer) – 与状态机一起运行的程序

  • frequency (int) – 状态机的目标时钟频率。实际可能更少。

  • init (ReadableBuffer) –在启动时运行一次的程序。这是在程序启动后运行的,因此指令可能会混合在一起

  • first_out_pin (Pin) – 与 OUT 指令一起使用的第一个引脚

  • out_pin_count (int) – 与从 first_out_pin 开始的 OUT 一起使用的连续引脚数

  • initial_out_pin_state (int) – 从 first_out_pin 开始的输出引脚的初始输出值

  • initial_out_pin_direction (int) – 从 first_out_pin 开始的输出引脚的初始输出方向

  • first_in_pin (Pin) – 与 IN 指令一起使用的第一个引脚

  • in_pin_count (int) – 从 first_in_pin 开始与 IN 一起使用的连续引脚数

  • pull_in_pin_up (int) – 此掩码中的 1 位在相应的输入引脚上设置上拉

  • pull_in_pin_down (int) – 此掩码中的 1 位在相应的输入引脚上设置下拉。设置两个pull 启用“总线保持”功能,即对GPIO 当前高/低状态的任何弱拉。

  • first_set_pin (Pin) – 与 SET 指令一起使用的第一个引脚

  • set_pin_count (int) – 与 SET 一起使用的连续引脚数,从 first_set_pin 开始

  • initial_set_pin_state (int) – 从 first_set_pin 开始的 set 引脚的初始输出值

  • initial_set_pin_direction (int) –从 first_set_pin 开始的 set 引脚的初始输出方向

  • first_sideset_pin (Pin) – 与边组一起使用的第一个引脚

  • sideset_pin_count (int) –与从 first_sideset_pin 开始的边集一起使用的连续引脚数

  • initial_sideset_pin_state (int) – 从 first_sideset_pin 开始的 sideset 引脚的初始输出值

  • initial_sideset_pin_direction (int) –从 first_sideset_pin 开始的 sideset 引脚的初始输出方向

  • jmp_pin (Pin) – 决定 JMP PIN 指令采用的分支的引脚

  • exclusive_pin_use (bool) – 当为 True 时,不与其他状态机共享任何引脚。引脚永远不会与其他外围设备共享

  • auto_pull (bool) –当为真时,当 OUT 指令移位超过 pull_threshold 位时,自动将数据从 tx FIFO 加载到输出移位寄存器 (OSR)

  • pull_threshold (int) –在将新值从 tx FIFO 加载到 OSR 之前要移位的位数

  • out_shift_right (bool) – 当为 True 时,数据从 OSR 的右侧 (LSB) 移出。否则将向左移出 (MSB)。笔记!当字节数不是 2 的幂(1、2 或 4 字节)时,这会影响数据对齐。

  • wait_for_txstall (bool) –当为 True 时,写数据将被阻塞,直到 TX FIFO 和 OSR 为空并且指令被停止等待更多数据。当为 False 时,数据写入不会等待 OSR 清空(仅 TX FIFO),因此请确保在取消或停止状态机之前留出足够的时间。

  • auto_push (bool) – 当为真时,当 IN 指令移位超过 push_threshold 位时,自动将输入移位寄存器 (ISR) 中的数据保存到 rx FIFO 中

  • push_threshold (int) – 在将 ISR 值保存到 RX FIFO 之前要移动的位数

  • in_shift_right (bool) –当为 True 时,数据移入 ISR 的右侧 (LSB)。否则,它会移入左侧 (MSB)。笔记!当字节数不是 2 的幂(1、2 或 4 字节)时,这会影响数据对齐。

  • user_interruptible (bool) – 如果为 True(默认值), write(), readinto()write_readinto()可以被 ctrl-C 中断。这在开发 PIO 程序时很有用:如果程序中存在导致无限循环的错误,您将能够中断循环。但是,如果您正在写入的设备在读取或写入中断时可能会进入错误状态,则您可能需要在程序经过审查后将其设置为 False。

frequency :int

实际状态机频率。由于内部限制,这可能与请求的频率不匹配。

rxstall :bool

当状态机由于上次 clear_rxfifo调用后的RX FIFO 已满而停止时为真 。

in_waiting :int

可供读入的字数

deinit(self)None

关闭状态机并释放其资源。

__enter__(self)StateMachine

上下文管理器使用的无操作。由上下文管理器助手提供。

__exit__(self)None

退出上下文时自动取消初始化硬件。有关更多信息,请参阅 Lifetime 和ContextManagers

restart(self)None

重置此状态机,运行任何 init 并启用时钟。

run(self, instructions: _typing.ReadableBuffer)None

运行所有给定的指令。它们可能会与内存中的指令交错。确保这不会等待输入!

这可用于将内部状态输出到 RX FIFO,然后使用 readinto.

stop(self)None

停止状态机时钟。使用restart 来启用它。

write(self, buffer: _typing.ReadableBuffer, *, start: int = 0, end: Optional[int] = None)None

将其中包含的数据写入buffer 状态机。如果缓冲区为空,则什么也不会发生。

Parameters
  • buffer (ReadableBuffer) – 写出这个缓冲区中的数据

  • start (int) – buffer 要写出的切片的开始: buffer[start:end]

  • end (int) – 切片的结尾;该指数不包括在内。默认为len(buffer)

readinto(self, buffer: _typing.WriteableBuffer, *, start: int = 0, end: Optional[int] = None)None
读入 buffer. 如果要读取的字节数为 0,则什么也不会发生。缓冲区

包括添加到 fifo 的任何数据,即使它是在调用之前添加的。

参数
  • 缓冲区 (WriteableBuffer) – 将数据读入此缓冲区

  • start (int) – buffer要读入的切片的开始:buffer[start:end]

  • end (int) – 切片的结尾;该指数不包括在内。默认为len(buffer)

write_readinto(self, buffer_out: _typing.ReadableBuffer, buffer_in: _typing.WriteableBuffer, *, out_start: int = 0, out_end: Optional[int] = None, in_start: int = 0, in_end: Optional[int] = None)None

写出数据,buffer_out w同时读入数据buffer_in。由buffer_out[out_start:out_end] 和定义的切片的长度 buffer_in[in_start:in_end]可能不同。一旦两者都填满,该函数将返回。如果缓冲区切片长度都为 0,则什么也不会发生。

参数
  • buffer_out (ReadableBuffer) – 写出这个缓冲区中的数据

  • buffer_in (WriteableBuffer) – 将数据读入该缓冲区

  • out_start (int) – 要写出的 buffer_out 切片的开始:buffer_out[out_start:out_end]

  • out_end (int) –切片的结尾;该指数不包括在内。默认为len(buffer_out)

  • in_start (int) – buffer_in 要读入的切片的开始:buffer_in[in_start:in_end]

  • in_end (int) – 切片的结尾;该指数不包括在内。默认为len(buffer_in)

clear_rxfifo(self)None

清除 rxFIFO 中的任何未读字节。