2.1 信号線数:信号名
SPIバスは4線式.同期式シリアル・インターフェースです.同期式シリアル・インターフェースとはクロック信号に同期してデータを送受する方法で,信号線のうちの1本をクロックに使います.
データには2本の信号線.メインからサブへのデータとサブからメインへのデータにそれぞれ1本使います.あとのもう1本はチップ・セレクトと呼ばれる信号です.SPIでは転送対象を指定するためのアドレス指定を行う方法がありません.そのためチップセレクト信号を使って,転送対象デバイスを指定します[図1].
信号名はさまざまな名前で呼ばれる場合があります.次の信号名はOSHWAによる呼称[英語サイト]です.
- SDO:データ出力
- SDI:データ入力
- SCK:シリアル・クロック
- CS:チップセレクト:CS
上記では,SDO,SDIの名称は各チップにおけるデータ入出力の方向が基準になっています.この場合,各ピン名としては明確で良いのですが,メイン/サブ間での信号の方向を示すには不便です,
これに代わって回路図上などでよく使われる信号名には以下のようなものもあります.このブログではこれらの語に統一します.
- MOSI:メインからサブへのデータ(Main Out Sub In)
- MISO:サブからメインへのデータ(Main In Sub Out)
- SCLK:シリアル・クロック
- CS:チップセレクト:CS
これらの信号のうちMISOだけはサブからメインへの信号で,それ以外は全てメインからサブへの信号となります.通信中に信号の方向が切り替わることはありません.
図1:コントローラとターゲット.各信号名
信号本数を節約するため,例えば片方向だけの通信が行われる場合,いずれかのデータ線が省略される場合があります.
また送受信を時多重にしてデータ線を1本だけで使うことができるようにしたターゲットもも存在します.この場合,メイン側ではMOSI/MISOを抵抗を用いてショートして,信号をまとめます.
2.2 プッシュプル.非転送時のハイ・インピーダンス状態
信号はプッシュプルで出力されます.また非データ転送時のMOSI,MISOの出力はハイ・インピーダンス状態に置かれます.これは複数のサブノードが並列に接続された時に,他の通信に影響を与えないようにするためです.
信号電圧はサブノードのデバイスによって規定されているため,それに合わせてやる必要があります.メイン側とサブノードで電圧が違う場合は電圧変換が必要です.
2.3 クロック周波数
クロック周波数も特に規定はありません.通常は百kHz台から数MHz台のクロックが使われる場合が多く,上限はサブノード・デバイスの仕様によって決められます.高レートでのデータ転送が必要なアプリケーションでは数十MHzのクロックが使われることもあります. またメモリ・デバイスなどでは,MOSIやMISOのデータ線を複数用いて転送レートを上げる応用例もあります.
3. プロトコル
データ転送手順を決めるプロトコルも特に厳密な決まりはなく,サブノード・デバイス毎に自由に決められています.メイン側となるマイコンでは様々なサブノード・デバイスをサポートするための設定が用意されています.
基本の転送手順は,転送先のサブノードに接続されたCSをアサートしてから転送を始めます.CSデアサートで転送が終了します.CSのアサートとデアサートはLOWとHIGHの信号で行われますが,この極性はサブノード・デバイスの仕様で規定されます. データのビット順については,多くのデバイスではMSBファーストとなっていますが,これにも例外があります.転送単位とするビット数も特に決まっていません.2ビットから16ビットとしている解説を見たことがありますが,もっと大きいビット長を単位としたサブノードも存在する(例えば64ビットなど)ためこの限りではありません.
3.1 モード
SPIには「モード」と呼ばれる設定があります.これはクロックの極性とエッジの選択の組み合わせを指しており,それぞれに2つの設定で4つのモードが存在します[図2].
クロック極性(Polarity)はCPOLと呼ばれる設定で,データ非転送時のSCLKがLOWかHIGHかを決める設定です.メイン側の設定ではを0に設定するとLOW,1ならHIGHになります. エッジの選択(phase)はCPHAと呼ばれます.データのラッチ(取り込み)を最初のクロックエッジで行うか,2番目のエッジで行うかを決める設定です. 0の設定で最初のエッジ,1の設定で2番目のエッジを選択します. CPOLとCPHAを組み合わせてモード0〜3のように表す場合もあります[表2].
さらに,これに加えてチップセレクトの極性が逆のサブノードも存在するので注意が必要です.
図2:モード(CPOL,CPHA)
| |
CPOL |
CPHA |
| mode=0 |
0 |
0 |
| mode=1 |
0 |
1 |
| mode=2 |
1 |
0 |
| mode=3 |
1 |
1 |
表2:モードとCPOL,CPHA
「データをラッチするエッジ」とは?
データはクロックに同期して送受信されますが,クロックの立ち上がり,立ち下がりのどちらかひとつのエッジでデータの変化します. [図3]に立ち下がりでデータが変化する例を示して説明します.メイン側デバイスが出力するSCLKの立ち下がりのタイミングにに合わせて,メイン側はMOSIの,サブノード側はMISOの出力を変化させます.次のデータは次の立ち下がりで切り替わりますが,それまでの間は安定した状態になります.クロックの立ち上がりは,ちょうどこの期間に起こるため,このタイミングに合わせて互いのデータの取り込みを行います.これが「ラッチを行うエッジ」です.

図3:データ(MOSI/MISO)とクロック(SCLK)の同期
3.2 データ転送
チップセレクトがアサートされたのち,クロックに同期してデータを送受信します.サブノードは自身のチップセレクトがアサートされたことを受け,クロックに合わせてデータを取り込み,また出力します.
[図4]はSPI転送の一例です.CSアサート中のクロックに合わせてデータがやり取りされます.ロジック回路に慣れている方なら,シフトレジスタによる単純な回路によって実現していることが見て取れると思います.
図4:SPI転送の例
4. 接続トポロジ
4.1 チップセレクトによる並列接続とデイジーチェーン
複数のサブノードは[図5]のように接続します. 各サブノード向けにチップセレクトを用意し,それぞれの信号で送受信先を指定しながら通信を行います. またはCS信号の本数を節約するために縦続接続(デイジーチェーン)を行なって,ビット長を拡張したひとつのサブノードと見做して通信を行う方法も使われます[図6].
先にも述べましたが,複数の種類のサブノードを同じSPIバスに接続するには注意が必要です. 先に述べたような,「モード」やチップセレクトの極性,さらにデータ・ビット長が同一とは限りません.このため各サブノードへの通信の度に設定を切り替えたり,ハードウェアでの調整が必要な場合があります.

図5:並列接続

図6:デイジーチェーン接続
5. 参考資料
[初出:インターフェース 2024年3月号(CQ出版)「I2C&SPIをゼロから作る④…SPIの通信規格」p71-73.ブログ掲載にあたり通信仕様解説部分を抜粋,加筆修正]
変更履歴:
2025-02-03:初版
2025-02-25:「5. 参考資料」の項に「NXP システム・マネジメントI²C, I3C, SPIセレクタ・ガイド」へのリンクを追加
2025-05-01:目次を訂正(項目削除),2.2節の項目名訂正
=========================
本投稿の「Comment」欄にコメントをいただいても、現在返信に対応しておりません。
お手数をおかけしますが、お問い合わせの際には「NXPへの技術質問 - 問い合わせ方法 (日本語ブログ)」をご参照ください。
(既に弊社NXP代理店、もしくはNXPとお付き合いのある方は、直接担当者へご質問いただいてもかまいません。)