はてなブックマークに追加   1、2、3線シリアル・インターフェース(連載 第3回)

SPI(Serial Peripheral Interface)

 今回は、前回のI2Cに引き続き、3線式のSPIについて説明します。
 SPIでも複数のスレーブ・デバイスを接続することができますが、I2Cと違い、バスにスレーブ・アドレスのような識別用のデータが流れることはありません。したがって、通信内容や手順はI2Cに比べて単純です。その代わり、SPIマスタはSS(スレーブ・セレクト)信号により複数の中の一つのスレーブ・デバイスを選択しなければなりません。マスタ側のハードウェアとしては、選択するスレーブの数だけSS信号(出力)が必要になります。
 スレーブは、自分のSS信号がアクティブにされたときにだけ作動します。このSS信号はオプションで、スレーブが一つだけの1:1接続の場合は省略することができます。

●通信の特徴
 SPIの原理はシフト・レジスタの原理そのものです。送信出力部はパラレル→シリアル変換型のシフト・レジスタで作られていて、マスタが生成するシフト・クロック(SCK;シリアル・クロック)でパラレル・データがシリアル信号に変換されます。一つのクロックで1ビット分の信号が出力されます。
 受信部は、シリアル→パラレル変換型のシフト・レジスタで作られています。送信側から送られてきたシリアル信号を、マスタが生成するシフト・クロックでサンプリングして、パラレル・データに変換します。

 シフト・クロックはマスタが生成しますが、このクロックはSCK信号としてスレーブと共用されます。送信と受信はこのクロックにより同時に起こります。つまり、1ビット出力(シフト)すると、同時に1ビット入力されているわけです。8回のクロックで、8ビットのデータが入出力されます。これはマスタとスレーブの8ビットのデータが入れ替わると考えることができます。
 マスタは自分自身でクロックを出力しながら、そのクロックに同期してデータ・ビットを入出力しています。スレーブはマスタが出力するクロックに同期してデータ・ビットを入出力します。

SPI.マスタとスレーブの関係

●SPIの信号線
 シリアル・クロックSCKは単方向の信号で、マスタは出力、スレーブは入力です。
データの入出力信号はSDI(入力)とSDO(出力)の2つあり、それぞれ単方向の信号です。したがって、マスタとスレーブを接続する際は、マスタのSDIはスレーブのSDO、マスタのSDOはスレーブのSDIというようにクロス結線にする必要があります。
 その他、スレーブ・セレクト信号SSはマスタが出力、スレーブが入力で、“L”レベルでアクティブ(選択状態)となります。複数のスレーブを接続する場合はマスタには複数のSS信号出力が必要で、スレーブ選択時は複数の中の一つだけがアクティブになります。

●ハードウェアによるSPIスレーブデバイスの製作例
 原理が簡単なことから、シフト・レジスタなどの汎用ロジックICを使ってSPIスレーブ・デバイスを製作してみました。下の写真は順にユニバーサル基板とプリント基板で製作したセットで、入出力それぞれ16ビットのディジタル入出力ボードです。
 パラレル→シリアル変換型のシフト・レジスタHC165を2個、シリアル→パラレル変換型のシフト・レジスタHC595を2個使い、それぞれシリーズ接続して16ビットにしています。次に回路の機能について簡単に説明します。

SPIDIO試作

SPIDIO専用ボード

(1)入力ポートの回路
 入力は簡単です。入力ポートのデータのサンプリングは、SS信号がアクティブになったときにHC165をロード・モードからシフト・モードへ切り替えるだけです。あとはSCKのクロック信号に合わせて自動的にSDOへシフト・データが出力されます。ただ、モードが切り替わったときに直ぐに第1ビットが出力されるため、SCKが最初に入力されたときには第2ビットから出力されてしまいます。この問題を解決するために、D-FF(HC74)でSDO出力信号をSCKの1クロック分遅らせています。

(2)出力ポートの回路
 出力ポートでは、16ビットのデータがSDIから入力し終わるまで出力ポートの状態を確定させられないため、カウンタ回路により出力確定のタイミングをとっています。16回のクロックを数えて16回目にHC595の出力レジスタをラッチするようにしています。

(3)出力ポートの初期状態
 出力ポートでは電源投入時に状態が不定だと、接続された機器が誤作動して危険なことがあります。そのため、出力状態を確定させておくというのは、出力ポートでは大切な機能になります。HC595の出力レジスタにリセット端子があれば話は簡単なのですが、実際にはありませんので、何かリセットする手段が必要です。HC595のパラレル出力の後段にリセット端子がついたD-FFをつけるのが簡単ですが、それだと、HC595に内蔵されている出力レジスタが無意味になってしまいます。

 今回はHC595のシフト・レジスタがリセット端子でリセットできることを利用して、パワー・オン・リセットでシフト・レジスタをリセットさせ、その後、特定のタイミングでシフト・レジスタのクリアされたデータを出力段のレジスタへロードするようなタイミング発生回路をHC123(モノマルチ回路)で作りました。

 そうこうしているうちに、写真のようにICの数が多くなってしまいました。ユニバーサル基板のDIPスイッチとLEDは入出力の動作確認用です。実際に作動させて、ロジアナで測定した波形を次に示します。

SPIロジアナ


 今回はSPIの原理などについて説明しましたが、通信の原理が簡単なため、MSSP(I2C/SPI通信のハードウェア・モジュール)を内蔵したPICでは簡単なプログラムでSPI通信が実現できます。MSSPを内蔵していなくても、スルーレートは落ちますが、ソフトウェアで簡単に同等の機能を代替できます。

 今回紹介したハードウェアによる入出力ポートは、ソフトウェアがまったく介在しないため、高速で通信できます。回路が大掛かり(?)になってしまいましたが、SPIやシフト・レジスタの動作を理解する上では、このようなアプローチもよいのではないでしょうか。

 次回は1-Wire通信について説明する予定です。


タグ:  

投稿者: yoshida 日時: 2007年4月19日 15:47 | パーマリンク |TOPページへ   ▲画面上へ

トラックバック

このエントリーのトラックバックURL:
http://www.eleki-jack.com/mt/mt-tb.cgi/219

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)