MPASM Technic – SPIが受信できない

開発途中でSPIやEUART(Serial COMM)が正しく動作しない状態に陥った。
結果であるが、PMD0のSYSCMDは注意が必要である。

SPIやEUARTなど周辺モジュールはこのビットがOFFであっても動いているので、調査中も長らく気がつかなかった。
CPU内部の周辺モジュールによっては、このビットがOFFである場合、モジュール本体としての機能は動作しているが、SPIでは入力信号が入ってこない(つねに0)ことが発生した。EUARTは送信ができなくなった。
内部クロックにも何系統もあるようで、Fosc/4はこのビットの影響を受けないとかマニュアルに書かれている。

マニュアル(のブロック図)には書かれていないので私の勝手な想像ではあるが、周辺モジュールの入力回路の手前で、このクロックによる入力データの正規化(同期化)回路が動作していると考える。
そのため、同期クロックが停止すると(モジュールは動作しているが)入力信号が最後のラッチ状態で変化しないのではないかと予想される。
高速入力回路において、安定した入力を得るために動作に同期したクロックで正規化することは普通の行為です。

CPU的に問題なのは、SPI専用の入力正規化回路(たぶんDラッチ)が存在するのであれば、SPIモジュールをイネーブルにすることで、一緒に動作する必要があると考えます。

Microchip技術サポートへの問い合わせを行い(しばらく待つが回答の連絡がなく)、一旦あきらめて、ソフト的にSPIを構成したものを作成していた。
しかし別の部分のDebug中、当初作成しその際は動作していたEUARTの送信がまったくできなくなっていることに気がつき、改めてすべてのソースを逆から戻って動作チェックした。その結果、SYSCMDに行き当たった。
開発当初は、たまたまこのレジスタを設定していなかったため、偶然的に結果にたどり着けた。
修正したところ、EUARTが動作することが確認できた。
もしやと思いCPUHardによるSPIを試したところ動作することがわかった。

Web情報を含め資料と呼べるものが皆無なため、これがわかるまでに、試行錯誤でかなり長い時間を要した。

Microchip技術サポートはその後も連絡ないけど、一応自己解決と内容を伝えたので、Errataか何らかの改良が出るかもしれません。

 

私の失敗談として、使用していないPMDは切って、機能を使用するたびに該当の電源をONにして開発を進めたが、最初は使用の有無にかかわらずすべてONにして、すべて完成時に、各機能を確かめつつ、1つづつOFFしていったほうが楽であったかなと考える。

また、PPSというピンへの機能再配置があり、うまく動いたあとは良いのだが、当初は正しく動作する基本となるものがないと、それぞれが原因として絡み合って、わけがわからない状態に陥った。

カテゴリー: MPASM, PIC, PIC18F, PIC18F46K40, PIC18FxxK40 タグ: , , , パーマリンク