Darkside(リンクエラー修正しました)

2018年11月6日(火) 21:28

遅延・大

 最初にクロックを1回だけ空送信すると、期待通りにデーターを受け取れた。だが、原因不明のまま対症療法は不安である。なぜなら、ソフトウェアSPIは極めて単純な処理であって、紛れる余地がない。それが原因不明のビットずれを起こすというのは、何か想定外のトラブルが発生している可能性が高い。
 先頭ビットだけ1になるようなキー状態にして、クロック(黄色)とデーター(青色)をオシロで確認する。

 最初のクロックの立ち上がりと、データーが1になる立ち上がりは、一致しているのが理想である。ところが、7〜8μ秒も遅延している。
 ポート状態変化割り込みが発生してからそのハンドラ内でデーターを送り出すまで、7〜8μ秒も要しているということだ。動作クロック32MHzなのに!
 せいぜい1〜2μ秒の遅延だと思っていた。それが遥かに大きな遅延だった。あっさり原因判明。クロック周期を約10μ秒にしていたので、7〜8μ秒の遅延は安定的に1ビットのズレを発生させていたのだ。

 しかし、ビット取得ミスまでのマージンが2μ秒ていどしかない。もっとマージンが大きくなるよう調整すべきだろう。

 そもそも7〜8μ秒も遅延するのでは、クロックで割り込みイを掛けて処理するのは実用にならない。「パケット先頭」を通知する STRB パルスの立ち上がりで割り込みを発生させ、そのハンドラ内でクロックをポーリングした方が遅延を減らせるだろう。
 そう考えて試したところ、ポーリングによる遅延は2〜3μ秒と判明。割り込みを使うのに比べて、3分の1の遅延で済んでいる。これなら、先頭ビットから普通に処理可能だ。

 クロック周期が10μ秒弱で、ビットずれのマージン3μ秒ていどを確保するよう調整。

 しかし、C言語だとポーリングがここまで遅くなるのか。32MHzなのだから、アセンブラを使えば余裕で遅延1μ秒を切れる。
 とはいえ、これ以上速くする必要性が薄い。STRB 割り込みも7μ秒は遅延するだろうから、STRB を立ち上げてから最初のクロックを立ち上げるまで15μ秒以上待つという仕様にしてある。それでも、26ビットの送信には0.3ミリ秒も掛からない。

 これを0.2ミリ秒や0.1ミリ秒に短縮する意味は小さいので、これで完成としよう。

written by higashino [バトルタンク改造Tiger1] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4