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 には0と1の番号が付いた 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)を返します。引数を指定すると、ベースを設定します。
baseはmachine.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 を保持したトライステート)。
- 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_TX: int¶
asm_pio()のfifo_joinに渡すと、RX FIFO を取り込むことで TX FIFO が 8 ワードに倍増されます。ステートマシンはデータを受信できなくなります。