class PIO -- 高度な PIO の使用

PIO クラスは、RP2040 の 2 つあるプログラマブル I/O (PIO) ブロックの 1 つをラップします。各 PIO ブロックには、4 つの独立したステートマシンで共有される命令メモリ(32 命令)と、各ステートマシンへの専用 FIFO インターフェース、および IRQ コントローラが含まれます。

ほとんどのスクリプトは StateMachine を通じて PIO とやり取りします -- このクラスは以下のことを必要とする高度なユースケース向けです:

  • add_program() / remove_program() を介してプログラムを明示的にロードおよび削除する。

  • gpio_base() を介して PIO の GPIO ベースをチップの 32 ピンウィンドウ内で移動する。

  • irq() を介してブロック全体の IRQ フラグにフックする。

PIO プログラムのアセンブルについては rp2.asm_pio() を参照してください。

コンストラクタ

class rp2.PIO(id: int)

id で識別される PIO ブロックに対応するシングルトンの PIO オブジェクトを返します。RP2040 には 01 の番号が付いた 2 つの PIO ブロックがあります。それ以外の id では ValueError を送出します。

メソッド

gpio_base(base: machine.Pin | int | None = None, /) int

この PIO ブロックの GPIO ベースを取得または設定します。

RP2040 の PIO は GPIO 空間への 32 ピンウィンドウを参照します。このウィンドウは GPIO0 または GPIO16 から始めることができます。ベースは、この PIO 上のすべてのステートマシンに対してどのウィンドウが有効になるかを制御します。

引数なしの場合、現在のベース(GPIO ピン番号、0 または 16)を返します。

引数を指定すると、ベースを設定します。basemachine.Pin インスタンスまたは整数のピン番号を指定でき、GPIO0 または GPIO16 に解決される必要があります。ベースは、この PIO ブロック上でプログラムが追加されたりステートマシンが構築されたりする 前に 設定しなければなりません。

add_program(program: Callable) None

program をこの PIO の命令メモリにロードします。生成されるメモリレイアウトは、この PIO ブロック上のすべてのステートマシンで再利用されます。

各 PIO はすべてのプログラムで共有される 32 命令分のプログラムメモリしか持ちません。新しいプログラムが収まらない場合、このメソッドは OSError(ENOMEM) を送出します。同じプログラムを両方の PIO インスタンスにロードできますが、それぞれ別々のメモリ領域を消費します。

remove_program(program: Callable | None = None, /) None

program をこの PIO の命令メモリから削除し、新しいプログラムのための空き領域を確保します。program を省略すると、この PIO に現在ロードされているすべてのプログラムが削除されます。

ロードされていなかったプログラムを削除しても何も起こりません(例外なし)。

state_machine(id: int, program: Callable | None = None, *args, **kwargs) StateMachine

この PIO ブロックが所有する 4 つの StateMachine インスタンスのうちの 1 つを返します。id はローカルのステートマシンインデックス(0 -- 3)です。

program が指定された場合、ステートマシンはそれを実行するように構成されます -- すべての位置引数/キーワード引数は StateMachine.init() に転送されます。

例:

>>> rp2.PIO(1).state_machine(3)
StateMachine(7)

返されるオブジェクトのグローバルなステートマシン ID は pio_id * 4 + sm_id です。

irq(handler: Callable[[PIO], None] | None = None, trigger: int = IRQ_SM0 | IRQ_SM1 | IRQ_SM2 | IRQ_SM3, hard: bool = False) Callable

この PIO のブロックレベル IRQ を取得または構成します。

handler は、要求されたステートマシン IRQ のいずれかがラッチされたときに発火するコールバックです。ハンドラはこの PIO インスタンスを唯一の引数として受け取ります。ハンドラ内では、発火したステートマシンは self.irq().flags()IRQ_SM* 定数と AND することで識別できます。

trigger は、IRQ_SM0 から IRQ_SM3 までの 1 つ以上のビットマスクです。既定ではいずれのステートマシンでも発火します。

hard=True はハード割り込みハンドラ(コールバック内でのヒープ割り当てなし)を登録します。

MicroPython は各 PIO ブロックの IRQ 0 をバインドします。IRQ 1 は予約されており、Python からはアクセスできません。

定数

IN_LOW: int

asm_pio()out_init / set_init / sideset_init に渡すと、ピンは Low に駆動された入力として開始します(すなわち、出力バッファが 0 を保持したトライステート)。

IN_HIGH: int

asm_pio()out_init / set_init / sideset_init に渡すと、ピンは出力バッファが 1 を保持した入力として開始します。

OUT_LOW: int

asm_pio()out_init / set_init / sideset_init に渡すと、ピンは論理 0 に駆動された出力として開始します。

OUT_HIGH: int

asm_pio()out_init / set_init / sideset_init に渡すと、ピンは論理 1 に駆動された出力として開始します。

SHIFT_LEFT: int

asm_pio() または StateMachine.init()in_shiftdir / out_shiftdir に渡すと、シフトはビットを MSB 方向へ移動します。

SHIFT_RIGHT: int

asm_pio() または StateMachine.init()in_shiftdir / out_shiftdir に渡すと、シフトはビットを LSB 方向へ移動します。

JOIN_NONE: int

asm_pio()fifo_join に渡すと、ステートマシンは別々の 4 ワード TX FIFO と RX FIFO を持ちます(既定)。

JOIN_TX: int

asm_pio()fifo_join に渡すと、RX FIFO を取り込むことで TX FIFO が 8 ワードに倍増されます。ステートマシンはデータを受信できなくなります。

JOIN_RX: int

asm_pio()fifo_join に渡すと、TX FIFO を取り込むことで RX FIFO が 8 ワードに倍増されます。ステートマシンはデータを送信できなくなります。

IRQ_SM0: int

irq()trigger フラグ: ステートマシン 0 がその IRQ を発生させました。

IRQ_SM1: int

irq()trigger フラグ: ステートマシン 1 がその IRQ を発生させました。

IRQ_SM2: int

irq()trigger フラグ: ステートマシン 2 がその IRQ を発生させました。

IRQ_SM3: int

irq()trigger フラグ: ステートマシン 3 がその IRQ を発生させました。