SPIバスはアメリカのモトローラ(現NXPセミコンダクターズ)によって提唱されたシリアル・バス仕様です.仕様が策定されたのは1980年代半ばとされています. SPIは「Serial Peripheral Interface」の略でプロセッサと周辺チップとの接続に使われる4線式のシリアル・バスとして開発されました. この派生仕様としての3線式SPIバスも存在しますが,基本となっているのは元の4線式です.
SPIでは信号の極性やデータの同期タイミング設定など,通信方法に幾つかのバリエーションがあるので,使用の際にはこれを意識する必要があります.
SPIはI²Cと同じく,チップ間のデータのやり取りに使われますが,それぞれに利点と不利な点があります.これを[表1]にまとめます.
SPIはより高速なデータ転送が必要な用途に使われます.これは電気的仕様の違いによるもので,I²Cではオープンドレインで信号を駆動するのに対し,SPIではプッシュプルで駆動するため高速化が容易です.さらにデータ転送速度の点では送受信を同時に行える全二重通信が行えるのが特長です.
一方,SPIにもいくつかの不利な点があります.転送のデータ長やクロックの極性は転送先デバイスごとに規定されているため,複数種類のデバイスの混在が困難な場合があります.また同種でも複数のデバイスを接続している場合には,各々のデバイスにチップセレクト信号が必要になるため信号線数が増えたり,あるいは縦続接続を行った場合にはデータ転送長の調整が必要になったりします.
| I²C | SPI | |
| 線数 | 2 データ:SDA クロック:SCL |
4 データ:SDO, SDI (MOSI, MISO) クロック:SCLK チップセレクト:CS |
| 速度 | ~400kHz モードにより1MHz, 3.4MHz, 5MHz |
数百kHz〜数十MHz |
| 通信方向 | 双方向 半二重 |
双方向 全二重 |
| 接続方法 | マルチドロップ(並列) 複数コントローラ 対 複数ターゲット |
並列 または デイジーチェーン 単一コントローラ 対 複数ターゲット |
| 信号駆動 | オープンドレイン (プルアップ抵抗要) |
プッシュプル |
表1:I²CとSPIの比較
SPIでも主と従の関係で転送が行われます.これまでそれぞれにマスタ/スレーブの語が一般に使われていましたが,現在はコントローラ/ターゲットに改められています.
また,これまでの役割名の頭文字「M/S」をそのまま当てはめてメイン/サブノード(サブ)とも呼ばれます.以降,このブログではあえてこのメイン/サブノード(サブ)を使います.
SPIでは複数のメインが存在できません.必ずひとつのメインと,ひとつまたは複数のターゲット間で通信が行われます.
SPIバスは4線式.同期式シリアル・インターフェースです.同期式シリアル・インターフェースとはクロック信号に同期してデータを送受する方法で,信号線のうちの1本をクロックに使います.
データには2本の信号線.メインからサブへのデータとサブからメインへのデータにそれぞれ1本使います.あとのもう1本はチップ・セレクトと呼ばれる信号です.SPIでは転送対象を指定するためのアドレス指定を行う方法がありません.そのためチップセレクト信号を使って,転送対象デバイスを指定します[図1].
信号名はさまざまな名前で呼ばれる場合があります.次の信号名はOSHWAによる呼称[英語サイト]です.
上記では,SDO,SDIの名称は各チップにおけるデータ入出力の方向が基準になっています.この場合,各ピン名としては明確で良いのですが,メイン/サブ間での信号の方向を示すには不便です,
これに代わって回路図上などでよく使われる信号名には以下のようなものもあります.このブログではこれらの語に統一します.
これらの信号のうちMISOだけはサブからメインへの信号で,それ以外は全てメインからサブへの信号となります.通信中に信号の方向が切り替わることはありません.
図1:コントローラとターゲット.各信号名
信号本数を節約するため,例えば片方向だけの通信が行われる場合,いずれかのデータ線が省略される場合があります.
また送受信を時多重にしてデータ線を1本だけで使うことができるようにしたターゲットもも存在します.この場合,メイン側ではMOSI/MISOを抵抗を用いてショートして,信号をまとめます.
信号はプッシュプルで出力されます.また非データ転送時のMOSI,MISOの出力はハイ・インピーダンス状態に置かれます.これは複数のサブノードが並列に接続された時に,他の通信に影響を与えないようにするためです.
信号電圧はサブノードのデバイスによって規定されているため,それに合わせてやる必要があります.メイン側とサブノードで電圧が違う場合は電圧変換が必要です.
クロック周波数も特に規定はありません.通常は百kHz台から数MHz台のクロックが使われる場合が多く,上限はサブノード・デバイスの仕様によって決められます.高レートでのデータ転送が必要なアプリケーションでは数十MHzのクロックが使われることもあります. またメモリ・デバイスなどでは,MOSIやMISOのデータ線を複数用いて転送レートを上げる応用例もあります.
データ転送手順を決めるプロトコルも特に厳密な決まりはなく,サブノード・デバイス毎に自由に決められています.メイン側となるマイコンでは様々なサブノード・デバイスをサポートするための設定が用意されています.
基本の転送手順は,転送先のサブノードに接続されたCSをアサートしてから転送を始めます.CSデアサートで転送が終了します.CSのアサートとデアサートはLOWとHIGHの信号で行われますが,この極性はサブノード・デバイスの仕様で規定されます. データのビット順については,多くのデバイスではMSBファーストとなっていますが,これにも例外があります.転送単位とするビット数も特に決まっていません.2ビットから16ビットとしている解説を見たことがありますが,もっと大きいビット長を単位としたサブノードも存在する(例えば64ビットなど)ためこの限りではありません.
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)の同期
チップセレクトがアサートされたのち,クロックに同期してデータを送受信します.サブノードは自身のチップセレクトがアサートされたことを受け,クロックに合わせてデータを取り込み,また出力します.
[図4]はSPI転送の一例です.CSアサート中のクロックに合わせてデータがやり取りされます.ロジック回路に慣れている方なら,シフトレジスタによる単純な回路によって実現していることが見て取れると思います.
図4:SPI転送の例
複数のサブノードは[図5]のように接続します. 各サブノード向けにチップセレクトを用意し,それぞれの信号で送受信先を指定しながら通信を行います. またはCS信号の本数を節約するために縦続接続(デイジーチェーン)を行なって,ビット長を拡張したひとつのサブノードと見做して通信を行う方法も使われます[図6].
先にも述べましたが,複数の種類のサブノードを同じSPIバスに接続するには注意が必要です. 先に述べたような,「モード」やチップセレクトの極性,さらにデータ・ビット長が同一とは限りません.このため各サブノードへの通信の度に設定を切り替えたり,ハードウェアでの調整が必要な場合があります.
図5:並列接続
図6:デイジーチェーン接続
[初出:インターフェース 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節の項目名訂正
2026-07-24:「2.1 信号線数:信号名」と「5. 参考資料」内の「OSHWAによる役割名と信号名」へのリンク切れを修正
=========================
本投稿の「Comment」欄にコメントをいただいても、現在返信に対応しておりません。
お手数をおかけしますが、お問い合わせの際には「NXPへの技術質問 - 問い合わせ方法 (日本語ブログ)」をご参照ください。
(既に弊社NXP代理店、もしくはNXPとお付き合いのある方は、直接担当者へご質問いただいてもかまいません。)
マイコン/プロセッサと周辺デバイス間の通信に使われるSPIバス.
あまりに当たり前に使われるこのシリアルバスですが,あえていま,その成り立ちについてまとめてみます.