So-net無料ブログ作成

MC9S08JS8 でLEDマトリックスを駆動する ~ ハードウェア編 (2) ~ [HCS08]このエントリーを含むはてなブックマーク#

2813417

秋月電子通商で購入した 16×16 LED マトリックス基板を MC9S08JS8 につなぎました。 第二回目は、完全シリアル化のおはなしです。

データ線3本は、使いにくい

今回使用した、 16×16 LED マトリックス基板は、複数の基板をデイジーチェインに接続して使用することが出来るとされています。 制御すべき主な信号は、3本のデータ線と1本のクロック線です。 ところが、このままでは都合の悪い事があります。 それは、マイコンのハードウェアとして内蔵されているSPIモジュールが使えないということです。

Serial Peripheral Interface (SPI) という規格は、4線式シリアルとも呼ばれるように、4本の信号線で双方向の通信を行います。 その中の二本がデータ出力とクロック出力です。 つまり、SPIモジュールからはデータ線が一本しか出てこないのです。 そのため、もし、 16×16 LED マトリックス基板をそのまま使おうとしたら、SPIを使うのではなく、ソフトウェアで汎用入出力ポートからシリアルデータを送出するプログラムを書かなくてはなりません。 ここで作成しようとしているアプリケーションは、 MC9S08JS8 を使うので、当然、USBによる通信を考えています。 できたら、ソフトウェア処理は減らしたいので、何とかしてSPIを使いたいところです。

SerializedInterface.png

そこで、このアプリケーションでは、データ線の構成を組み替えることにより、データ線を一本に統一しました。 つまり、真にシリアル化されたインターフェースになったというわけです。 SPCK端子の出力がクロックとして使われ、MOSI端子の出力がデータ線として使われます。

もちろん、デメリットが無いわけではありません。 キットで想定されている接続では、 16×3=48 クロックで全てのデータを送出することができました。 ところが、完全シリアル化した場合には、 16×3×3=144 クロックの時間が必要になります。 ただ、完全シリアル化した場合には、SPIというハードウェアの力を借りることができますので、実際の処理時間が3倍になる訳ではありません。

クロックの取り回しも変更した

キットで想定されている接続と異なっているのは、データ線だけではありません。 クロック線もなぜか逆順に接続されています。


ForwardClockTiming.png

これは、キットで想定している接続を行った場合の簡略図とタイミング図です。 クロック信号は、各 16×16 LED マトリックス基板でバッファリングされながら、隣の基板に伝達されます。 タイミング図では、このバッファリングによる伝播遅延が大きかった場合を示しています。

クロック信号"CK2"が遅延した場合、"CK1"クロックによって"Q1"信号が変更されてから"CK2"クロックが到着します。 すると、本来、"Q2"は"Q1"の前の値である"D1"となるべきだったのに、"D0"となってしまいます。 データ入力"D0"が突き抜けて出力に出てしまったというわけです。 この現象を「レーシング」と呼んでいます。

レーシングの原因は、専門的にはホールド時間の不足です。 ホールド時間を増加するためには、データ線に遅延を加えるとうまくいきます。 しかし、遅延を加えるには素子の追加が必要です。 しかも、適切な遅延を加える必要がありますが、どのくらいが適切なのでしょうか。 適切な遅延時間は、基板の環境にもよるので、一概には決められません。


BackwardClockTiming.png

そこで、このアプリケーションでは、別の解決策をとりました。 それが、クロックをデータとは反対方向に走らせるという方法です。

このようなクロック線の取り回しを行うと、シフトレジスタのホールド時間が極端に短くならない限り、原理的にはレーシングが起きなくなります。 しかも、クロック・バッファでの遅延が大きいほど、ホールド時間に余裕が出来ます。

デメリットは、全体の配線長が長くなってしまうことと、ホールド時間が改善した分セットアップ時間の余裕が減少してしまうことです。 セットアップ時間の心配については、 16×16 LED マトリックス基板の最大クロック周波数がSPIとしては遅い500kHzとされていることから、問題にはなりません。

このキットの場合、直接接続された基板同士でホールド時間制約を満たせばよいので、キットの想定どおりの接続にしても、それほど心配は無いのだろうとは思います。 ただ、変なところでつまずきたくは無いので、ちょっとばかり気を使ってみました。

SPIではレーシングは起きないのか

SPIでも、複数のデバイスをデイジーチェーンに接続して使用する方法が使われる場合があります。 そのような場合にも、レーシングの心配は無いのでしょうか。 結論から言うと、SPIという規格を守っているデバイスを接続する限り、問題は起こりません。 理由は、SPIという規格が「クロックの二つのエッジを使って送受信を行うシステムだから」です。


ShiftRegisterTiming.png

例えば、クロックの立ち上がりエッジで動作するシフトレジスタの場合、シフトレジスタがシリアルデータを受信するタイミングは、クロックの立ち上がりです。 また、シフトレジスタの出力が変化するタイミングもクロックの立ち上がりです。 そのため、このようなシフトレジスタを複数デイジーチェーン接続すると、シフトレジスタが動作するタイミングのバラツキによって、変化した直後のデータを受信してしまい、「レーシング」を引き起こす配があります。


SpiDeviceTiming.png

SPIでは、ちょっと事情が違います。 例えば、クロックの立ち上がりで出力が変化するデバイスの場合には、クロックの立ち下がりエッジでデータを受信します。 そのため、ホールド時間に半クロック周期分の余裕が生じ、安全に通信を行うことが出来ます。 もちろん、セットアップ時間も半クロック周期になってしまうので、高速動作させる場合には不利になります。

では、シフトレジスタでもSPIのようにデータ受信と出力変化のタイミングをずらす方法はないでしょうか。 実は、あります。 図のようにシフトレジスタ(青いブロック)の入力にハーフラッチ(緑のブロック)を追加して、シフトレジスタが受け取るデータを半クロック分遅延させてやるのです。 「ハーフラッチ」は、「Dラッチ」とも呼ばれ、具体的には、74HC75または74HC375などの製品があります。 「ハーフラッチ」が手に入らない場合には、「D型フリップフロップ」に逆相のクロックを与えて使っても、同じ効果が得られます。 これで、より安全なシリアル通信を行うことが出来ます。

次回予告

ハードウェアに関して、言い残したことは…


nice!(1)  コメント(0)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。