I/Oタイミングの考察

  • 投稿日:
  • 更新日:2015/02/09
  • by
  • カテゴリ: ,

どうもうまく動いてくれないSDカードインタフェースですが、問題はクリアになりました。 わかりにくいので、シーケンス図にします。

sequence.png

この図で、PCからのリクエストがin/out命令で、OUT buffer/IN bufferがそれぞれフリップフロップやラッチです。

最初にコマンドをout命令で送出し、その後inを繰り返してデータを取得するという典型的な例です。 コマンド処理中はbusyをあらわすステータスがIN bufferに入っているので、PC側からはポーリングしながら待ちます。

問題は、赤い部分です。 ここは本来、INT1の処理の最後で書き込んだステータスが返されるはずなのですが、実際にはステータスは稀にしか返りません。 なぜか、ここでINT0の出力が返ります。

しかし、ときどきステータスも返ることがあるため、INT0の出力データの最初のバイトにステータスを埋め込んだとしても、データのずれが発生してしまいます。

なんでこんなことが発生するのか、まだ解明できていません。 busyが返るin命令でも割り込み信号自体はAVRに伝わっているので、それが何か影響しているのかもしれません。 プログラム上は、INT0/INT1の処理中(=割り込み処理中)は割り込みは禁止になっているはずなのですが。

なお、プログラムのメインループはsleepによりアイドル状態(スリープではない)の無限ループとしています。

while (1) {
  sleep_mode();
}

こんな感じです。 基本的に割り込みでしか動作しません。


こちらもよく読まれています