3線式シリアル通信は送信データ(SO)、受信データ(SI)及び転送クロック(SCK)
の3本の信号線を用いて通信を行う方式です。
この通信方式では通信をコントロールする方をマスタと呼び、
マスタはSCK信号を出力して通信を制御します。
反対側をスレーブと呼び、こちらはマスタからのSCK信号を受けてデータを送信/受信します。
送信と受信を同時に行えますので、効率的な転送を行うことができます。
また、調歩同期通信のように通信レートよりも高い周波数のクロックでのサンプリングが必要ありませんので、
より高速の通信が可能です。
動作の概要
通常、通信を行っていない場合の SCK信号は Hレベルになっています。
マスタは通信を開始すると、SCKを立ち下げます。
SCK信号の立ち下がりで、マスタ及びスレーブはそれぞれの SO端子に送信データを出力します。
出力されたデータは相手のSI端子に接続されていますので、マスタがSCKを立ち上げたときに取り込まれます。
この動作を8回繰り返すことで1バイトのデータを転送できます。
この方式ではデータだけでなくクロックもやりとりしますので、
調歩同期通信のようにスタート・ビットやストップ・ビットを用いた制御は必要ありません。
また、データは必ず SCK信号に同期して取り込みますので、
送信側と受信側で転送レートが食い違って正常に受信できないと言ったことは発生しません。
このように、SCKの立ち下がりから全体の動作がスタートしますので、
SCKが Hレベルの期間に転送結果の処理を行い、次の転送の準備を完了する必要があります。
以上のような動作が基本ですが、一部のデバイスでは SCKの論理を変更できる
(通信を行っていないときのレベルや送受信のエッジを変更できる) 機能が追加されたり、
外部からシリアルの動作を禁止させることができるものがあります。
また、データ長は 8ビットが基本ですが、
一部のデバイスでは 16ビットまでの可変長のデータを通信できるもの、
複数バイトのデータを転送する機能をもったものもあります。
使用する上での注意点
3線式シリアル通信方式では、マスタがSCK信号を出力する(Lに立ち下げる)前にスレーブは送受信の準備を完了(スレーブがデータを送信したい場合には送信データを書き込み、受信の場合には前のデータの読み出しを完了) しておく必要があります。このためには、別途ハンドシェイクのための信号を準備しておき、マスタは割り込みやポーリング等の手段により、スレーブ側のステータス(準備完了)を検出できるようにしておいてください。
この順序が守られないと、正常なデータ転送はできません。