3.PIOのトラブルまみれ
ネットでPIOサンプル見ながら確認して、問題なく動きそうだったんで、さっそく動かした。
トラブルその1
PSRAMからデータが受け取れない。
試しにスピーカーの信号線を操作するプログラムを作ってみたら音が出るので信号は出ている。
picocalcの横に PSRAMと同じ端子が出てるんで、そこで波形を見たが信号が出てない。
さんざん悩んだが、結論から言うとPIOを使用する設定タイミングが間違ってた。
micropythonのドキュメントに入力ピンは手動で設定 という文があったので、GPIOのPin設定の一部(PULL_UPとか)は有効なんだな。と思いGPIOの初期化をしたんだが、順序が重要だった。
PIOはGPIOを操作するんじゃなく、PWMやUARTみたいにファンクション設定として動作していた。
なので、PIOの初期化をした後にGPIOのピン設定をすると、ファンクションが PIO から GPIO に戻されてしまうのだった。(つかここまで書いて PIO ってネーミングがひどいよな とか思った)
2.PSRAMのデータが化ける
スピードを上げるとデータが化ける。最初は大丈夫だが後半だけが化ける
PSRAMチップがクロックに追いつかないなら全部化けるはずが、最初の数バイトは問題ない。
原因はFIFOの読み出し処理が間に合ってないこと。命令を節約するためにFIFOへの自動転送(push)を有効にしてたんだが、なぜかビットシフト途中でもpushしてるっぽい。
命令増えるのを我慢してFIFOをブロックモードにした。
まぁ性能が全然でなくてDMAを使ったんだが。
3. QSPIモードのためのピンの入出力切り替えが効かない。
入出力方向を設定するために使うのはSET命令(set pindirs)。そのせいか、入出力に使うピンは、入力として指定し、更にSET用としても指定する必要がある。
なに?その仕様?素直に入力ピンの方向変えればいいんじゃない?誰得?
あと悩んだのは、micropythonのライブラリを使うとき、入出力で使うピンの数はどこで指定する?ってとこ。
statemachineの設定では、ピンの基準になるGPIO番号を指定するが、何本をoutや sidesetに使うかを明示的に指定するところが無い。
どうやらstatemachineに書き込む命令をアセンブルする asm_pio という部分で、ピンの初期値をタプルで設定するが、このタプルのサイズで判定してるっぽい。ドキュメントに書いてくれよ。。。
参考にしたソースが、micropythonのライブラリを使わずレジスタに直接設定してるのはこれが原因か?




