2.PIOってどんな機能があるの?
ざっくりPIOを説明すると、GPIOを制御する専用のコントローラであり、プログラムでピンを操作できる。
ただし、アセンブラで書く必要があり、32ステップしか使えない。
昔のプログラム電卓かな?
ともあれサンプルを見ながら何ができるかを探っていった。
雑にまとめると
2つのレジスタをカウンタとしてルーブ処理ができる(Xビット転送をY回実行)
push, pull 命令でCPUとPIOのやり取りをFIFOで行う
out命令でシフトレジスタのデータをGPIOに出力できる
in命令で入力も指定できる
set命令でGPIOを設定できる。チップセレクトとか。
命令ごとに sidesetを設定でき、GPIOを操作できる。クロックとか。
これらのGPIOは1ピンじゃなく連続した5ピンまで設定できるので、SPIからQSPIまで作れる。
PIOでの処理はかなり癖があって悩んだが、SPI出力はこんな感じのコードになる。
1.pull FIFOデータ待ち
2.mov FIFOからyに転送バイト数を転送
3.set チップセレクト有効
4.set xに転送ビット数セット
5.pull FIFOデータ待ち
6.set クロックをLO
7.out 1ビットデータを出力
8.set クロックをHI
9.jmp xをカウントダウンして6にジャンプ
10.set クロックをLO
11.jmp yをカウントダウンして4にジャンプ
12.set チップセレクト無効
PIOで面白いところは、6,7や8,9や10,11 をsidesetを使えば1つの命令にまとめて節約できるところ。メモリ32ステップしかないから重要。
CPUからはひたすらデータをFIFOに書き込めばPIOがデータを送信してくれるし、DMAを使えばもっと高速に処理できる。
QSPIにするなら 7 の処理で4ビット出力するようにして、4のループ回数を1/4にすればいい。ただし GPIOが並んでいる必要がある。(picocalcはGP2-GP6と並んでいる)
またチップセレクトもクロックと並んだGPIOになってるなら set じゃなくて sideset にすることもできる。(picocalcはGP20,GP21と並んでいる)
ただ、PSRAMを使うにはチップセレクト有効にしたまま処理を継続したいので、チップセレクトはPIOじゃなくてCPU側で操作したほうがいい。
そして早速動かそうとしたが、動かなかったんだ これがw




