表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
52/61

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のライブラリを使わずレジスタに直接設定してるのはこれが原因か?

評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

↑ページトップへ