
SPIインターフェース:動作モード・タイミング・配線
CPOL、CPHA、MOSI、MISO、SCLK、CSの役割を理解し、タイミング、論理レベル、接続形態、デバッグの要点を踏まえて信頼性の高いSPIバスを構成します。
執筆・技術レビューElectroDesignForge Engineering Team
編集方針を見る参考ガイド
SPI(Serial Peripheral Interface)は、コントローラーと近くのフラッシュメモリ、ADC/DAC、ディスプレイ、センサー、RF機器などのICを接続します。高速な全二重の同期式シリアル通信ですが、完全に統一された規格ではありません。フレーム形式や電気的限界は各データシートで確認します。
早見表
| 信号 | コントローラーから見た方向 | 機能 | 注意点 |
|---|---|---|---|
| SCLK / SCK | 出力 | シリアルクロック | アイドル時のレベルはCPOLで決まります。 |
| MOSI | コントローラー → 周辺機器 | 送信データ | COPI、SDI、DINとも呼びます。 |
| MISO | 周辺機器 → コントローラー | 受信データ | CIPO、SDO、DOUTとも呼びます。非選択時は高インピーダンスにします。 |
| CS / SS / nCS | 出力。通常はアクティブロー | 機器の選択とフレームの境界 | 通常、周辺機器ごとに独立したCSが一本必要です。 |
| GND | 共通 | 基準電位と帰路 | 特に基板外では信号線に沿わせます。 |
MOSIとMISOの方向はコントローラーから見たものです。COPI(Controller Out, Peripheral In)とCIPO(Controller In, Peripheral Out)なら、回路図なしでも信号の向きを明確にできます。
SPIにはアドレス指定、応答確認、共通の最高速度の定義がありません。コマンド、レジスタアドレス、ダミーバイト、応答は機器ごとのプロトコルで決まります。そのためロジックアナライザーで正常なビット列が見えても、CSやフレーム形式が間違っていれば機器は応答しません。
配線前に確認: 論理レベル、許容SCLK周波数、SPIモード、MSB/LSBの順序、ワード長、CSのアクティブレベルとタイミング。1.8 V、2.5 V、3.3 V、5 Vの電圧ドメインがそのまま互換とは限りません。
四つのモード:CPOLとCPHA
- CPOL(クロック極性)はSCLKのアイドルレベルを定めます。0はロー、1はハイです。
- CPHA(クロック位相)はサンプリングするエッジを定めます。CPHA = 0ではCS後の最初のエッジで最初のビットを読み、CPHA = 1ではそのエッジでビットが変わり、次のエッジで読みます。
| モード | CPOL | CPHA | SCLKのアイドルレベル | サンプリングエッジ | データが変わるエッジ |
|---|---|---|---|---|---|
| 0 | 0 | 0 | ロー | 立ち上がり | 立ち下がり |
| 1 | 0 | 1 | ロー | 立ち下がり | 立ち上がり |
| 2 | 1 | 0 | ハイ | 立ち下がり | 立ち上がり |
| 3 | 1 | 1 | ハイ | 立ち上がり | 立ち下がり |
先行エッジはアイドル状態からの最初の遷移、後続エッジは二番目の遷移です。CPHA = 0では先行エッジ、CPHA = 1では後続エッジでサンプリングします。どちらのCPOL設定でも同じです。
タイミング図の読み方
- CSが有効になる前のSCLKレベルを見ます。これがCPOLです。
- データが安定して読み取られるエッジを見ます。これがCPHAです。
- CPHA = 0では、最初のエッジより前に最初のビットが有効でなければなりません。
- データシートの出力遅延を確認します。データが常に反対側のエッジで正確に変わるとは限りません。
CPHAを間違えるとビットがずれやすく、CPOLを間違えると誤った時点の値でも一見もっともらしい列になります。0x00、0xFF、無効なIDは症状の一例で、原因を確定するものではありません。
周波数以外のタイミング要件
| パラメータ | 意味 | 違反した場合の問題 |
|---|---|---|
fSCLK | 最大クロック周波数 | 間欠的なエラーや不安定なサンプリング |
tSU(D) | サンプリングエッジ前のMOSI/MISOセットアップ時間 | ビットを誤ったレベルで読む |
tH(D) | サンプリングエッジ後のデータ保持時間 | 次のビットが現在のビットを乱す |
tCSS | CSアサートから最初のSCLKエッジまでの時間 | 最初のコマンドが無視される、またはずれる |
tCSH | 最後のエッジからCS解除までの時間 | 最後のビットが受け付けられない |
tCSHI | フレーム間にCSを非アクティブに保つ時間 | 内部状態がリセットされない |
tDO | MISOの出力遅延 | 高速時に早すぎる時点で読む |
タイミングの余裕には、レベル変換器の遅延、配線やケーブルの伝搬時間、実際のエッジ速度、容量性負荷を含めます。短い基板配線では動く速度でも、コネクタや分岐を追加すると失敗する場合があります。
通常のアクティブローCSでは、SCLKをCPOLで決まるレベルに保ち、CSをアサートし、tCSSを待ちます。CPHA = 0で最初のビットが間に合うようデータを出してクロックを送出し、最後のエッジからtCSHを待ってCSを解除します。コマンド、アドレス、データの間ずっとCSをローに保つ機器もあれば、CSの立ち上がりで処理を実行する機器もあります。
MOSI、MISO、SCLK、CSの配線
制御側 MOSI ─────────► 周辺機器 SDI / DIN
制御側 MISO ◄───────── 周辺機器 SDO / DOUT
制御側 SCLK ─────────► 周辺機器 SCK
制御側 nCS ─────────► 周辺機器 nCS
GND ─────────► GND
MISOを共用できるのは、非選択の周辺機器が確実に高インピーダンスになる場合だけです。プル抵抗でアイドル状態を決めても、二つの出力が同時に駆動する衝突は解消できません。
SCLKは全ビットで切り替わり、全受信側の基準となり、リンギングも起こすため特に重要です。短く保ち、連続したグラウンド面の上に配線し、敏感なアナログ入力から離します。ドライバー側に数十オームの直列抵抗を置くと、一対一の接続では減衰に役立つ場合があります。値はオシロスコープで確認してください。
CSによって応答する周辺機器を一つに絞ります。コントローラーのリセット中は、内部プル抵抗、消費電力、立ち上がり時間を確認したうえで、非アクティブ側へのプルアップが役立ちます。
SPIの接続構成
独立したCSを持つスター接続
SCLKとMOSIをすべてのICへ送り、各ICには専用のCSを接続します。選択された機器だけがMISOを駆動します。
┌──────────► 周辺機器 A
制御側 ─ SCLK ├──────────► 周辺機器 B
─ MOSI ├──────────► 周辺機器 C
─ MISO ◄────────── 非選択時は高インピーダンスとなる共用出力
─ CSA ───────────► A
─ CSB ───────────► B
─ CSC ───────────► C
推奨される構成で、デバッグしやすく、他の機器を経由してバイトを送る必要もありません。GPIOが足りない場合はデコーダーやエキスパンダーでCSを生成できますが、その遅延と電源投入時の状態を設計に含めます。
デイジーチェーン
一部のシフトレジスタやLEDドライバーはデイジーチェーン接続を想定しています。シリアル出力を次段の入力へ接続し、SCLKとCSを共用します。
制御側 MOSI ─► 機器 1 ─► 機器 2 ─► 機器 3
制御側 SCLK ─► すべての機器
制御側 CS ─► すべての機器
制御側 MISO ◄─ 最終段の機器の出力(ある場合)
フレーム長は全機器のワード長の合計で、物理的な接続順序がバイト順を決めます。単にバスを共用する通常のSPI周辺機器には適しません。
バスの共用と信号品質
各分岐はスタブとなり、SCLKを高速化するほど波形を悪化させます。配線をまとめ、枝を短くしてください。ケーブルや基板間接続ではfSCLKを下げ、近くにグラウンド帰路を設け、受信側で測定します。SPIは長距離向けの差動インターフェースではありません。
| 状況 | 推奨する方法 |
|---|---|
| 一つのIC、非常に短い配線 | 直接接続し、モードと論理レベルを確認します |
| 一枚の基板に複数のIC | 独立したCSを使い、非選択時のMISOを高インピーダンスにします |
| SCLKのリンギング | コントローラー近くに直列抵抗を置き、オシロスコープで確認します |
| ケーブルや基板間接続 | 速度を下げ、GND線を交互に配置し、長さを制限します。必要ならトランシーバーを使います |
| CS線が多い | 安全な電源投入時状態を持つデコーダー、シフトレジスタ、エキスパンダーを使います |
論理レベルとデバッグ
VIH/VILしきい値と絶対最大定格を両方向で比較してください。1.8 VのMISO出力は3.3 V入力には低すぎる場合があり、5 V出力は非対応の3.3 V入力を破損するおそれがあります。I²Cでよく使う双方向MOSFETレベル変換器が高速なSCLKやMOSIにも適するとは限りません。選んだ電圧、速度、負荷に対応したバッファーや変換器を使います。
- まず一つの周辺機器を100 kHz以下で動かします。
- データを見る前に電源、GND、リセット、CSの状態を確認します。
- 有効なCSをトリガーとして、SCLK、CS、MOSI、MISOを同時に測ります。
- CPOL/CPHA、ビット順、各フレームの正確なエッジ数を確認します。
- 仕様に記載されたIDまたはステータスレジスタを読み、徐々に速度を上げます。
ロジックアナライザーはプロトコルの確認に使い、エッジ、オーバーシュート、雑音、反射にはオシロスコープを使います。周辺機器の入力近くを測定してください。コントローラー側だけでは配線の問題を見落とします。
チェックリスト
- 回路図とファームウェアにCPOL、CPHA、ビット順、ワード長を明記する。
- データシートで定義されたチェーン接続を使わない限り、周辺機器ごとに一つのCSを設ける。
- 非選択時はMISOを高インピーダンスにし、出力同士の競合を防ぐ。
- 両方向の論理しきい値、絶対最大定格、タイミングを確認する。
- SCLKを連続したグラウンド面の上に短く配線し、直列抵抗を使う場合は効果を検証する。
- リセット中と電源投入時にCSを安全な状態に保つ。
- ケーブル、コネクタ、レベル変換器、分岐を追加したら受信側で測定する。
参考資料
- NXP - SPI ブロック ガイド 3.0
- マイクロチップ - SPI Serial Interface
- 対象とするコントローラーと周辺機器のデータシートを優先してください。モード、タイミング、論理レベル、フレーム構成は機器ごとに決まります。