SPI通信の実装とデバッグ
SPI通信は、マイコンとセンサ、メモリ、A/Dコンバータなどの周辺ICを接続する際にクロック同期でオーバーヘッドが小さく、プッシュプル駆動で高速化しやすいため、よく使われる同期式シリアル通信です。一般的に、I2CやUARTと比べて高速通信を実現しやすいため、組み込みソフトウェア開発で広く利用されています。
一方で、SPI通信は配線が正しくても、モードやタイミング条件が一致しないと正常に通信できない場合があります。特にSPIモード設定やタイミング条件が合っていない場合、受信データの化け、1ビットずれ、応答なしといった不具合につながります。
この記事では、SPI通信の実装時に確認すべき設定、SPIモードの考え方、データシートやタイミング図の読み取り方、通信が安定するための確認ポイントを解説します。
SPI通信の実装で確認すべき基本設定
SPI通信では、一般的にSCLK、MOSI、MISO、CS(ChipSelect)/SS(SlaveSelect)の4本の信号線を使用します。SCLKはマスタが出力するクロック信号、MOSIはマスタからスレーブへの送信線、MISOはスレーブからマスタへの受信線です。CS/SSは通信対象のスレーブを選択するために使います。
実装時には、次の項目を確認します。
| 項目 | 確認内容 |
|---|---|
| 通信速度 | SPIクロック周波数が仕様範囲内か |
| データ長 | 8ビット、16ビットなどの転送単位が合っているか |
| ビット順 | MSBfirstか、LSBfirstか |
| CS/SS | 極性や通信前後の待ち時間が適切か |
| SPIモード | CPOL・CPHAが通信相手と一致しているか |
この中でも、通信不良の原因になりやすいのがSPIモード設定です。SPIではクロック信号に同期してデータを送受信します。このため、データを読み取るタイミングが通信相手と合っていなければ、正しいデータを取得できないことがあります。
ポイント①:SPIモード設定
CPOL・CPHAで決まるMode0〜3
SPIモードは、CPOLとCPHAの組み合わせで決まります。
CPOLはクロック信号の極性です。通信していない待機状態でSCLKがLowであればCPOL=0、HighであればCPOL=1です。
CPHAはクロック信号の位相を示し、データをクロックの先行(leading)エッジと後続(trailing)エッジのどちらでサンプリングまたはシフトするかを決めます。CPHA=0では先行エッジ、CPHA=1では後続エッジでデータをサンプリングします。先行エッジが立ち上がりか立ち下がりかは、CPOLの設定によって変わります。
- 先行エッジは、CPOL=0では立ち上がり、CPOL=1では立ち下がりです。
- CPHA は『先行/後続エッジのどちらでサンプルするか』を示します。立ち上がり/立ち下がりは CPOL によって先行/後続が入れ替わります。
- 一般には CPHA=0 は先行エッジで入力サンプル、反対側エッジで出力更新とされます。最終判断はデバイスのタイミング図に従ってください。
| SPIモード | CPOL | CPHA | クロック待機状態 | サンプリング(入力取り込み) | シフト(出力更新) |
|---|---|---|---|---|---|
| Mode0 | 0 | 0 | Low | 立ち上がり | 立ち下がり |
| Mode1 | 0 | 1 | Low | 立ち下がり | 立ち上がり |
| Mode2 | 1 | 0 | High | 立ち下がり | 立ち上がり |
| Mode3 | 1 | 1 | High | 立ち上がり | 立ち下がり |
たとえば、通信相手のICがMode0で動作する場合にはマスタ側もCPOL=0、CPHA=0に設定します。モードが合っていないと、クロック信号とデータのタイミングがずれ、受信データが化けたり、正常に通信できなかったりする原因になります。
通信相手の仕様にあわせて設定する
SPIでは、スレーブ側の仕様にあわせてマスタ側を設定するのが基本です。スレーブICによっては対応モードが固定されているため、SPIモードや通信速度、データ長、ビット順、CS制御条件などをデータシートで確認します。複数のスレーブデバイスを同じSPIバスに接続する場合は、デバイスごとに対応モードや最大クロック周波数が異なる点にも注意が必要です。
ポイント②:SPIモード設定をデータシートとタイミング図から読み取る
SCLKの待機状態からCPOLを判断する
データシートに「SPIMode0」や「CPOL=0、CPHA=1」などと明記されていれば、その設定に合わせます。ただし、製品によってはMode番号ではなく、タイミング図だけが示されている場合もあります。
その場合、まずSCLKの待機状態を確認します。通信していないアイドル状態のときにSCLKがLowであればCPOL=0、HighであればCPOL=1です。
サンプリングエッジからCPHAを判断する
次に、データを読み取るタイミングを確認します。タイミング図では、SCLKの立ち上がりエッジまたは立ち下がりエッジに対して、MOSIやMISOのデータがどの区間で有効になるかが示されています。データが安定している区間と、サンプリングされるエッジを確認することで、CPOLとあわせてCPHAを判断できます。
| 確認箇所 | 見る内容 |
|---|---|
| SCLKの待機状態 | CPOLを判断する |
| データの有効期間 | MOSI/MISOが安定している区間を確認する |
| サンプリングエッジ | どのエッジで読み取るか確認する |
| SetupTime/HoldTime | データが安定していることが要求される時間を確認する |
SetupTime/HoldTimeを確認する
SetupTimeは、クロックエッジで読み取る前にデータが安定していなければならない時間です。HoldTimeは、読み取り後もデータを保持する必要がある時間です。これらを満たしていない場合、SPIモードが正しくてもデータの誤サンプリングや通信エラーが発生することがあります。
また、CS信号のタイミングにも注意が必要です。スレーブICによっては、CSをアクティブにしてから最初のクロックを出すまで、または通信終了後にCSをアイドル状態にするまでに、一定の待ち時間が必要な場合があります。
安定したSPI通信のためのタイミング調整
低速クロックから確認する
SPI通信が安定した状態を保つためには、初期実装から最大クロック周波数で動かさず、まず低速クロックで通信が成立することを確認します。低速で正常に動作する場合、配線、SPIモード、データ長、ビット順といった基本的な設定には大きな誤りがないことを確認できます。
その上で通信速度を上げたときに不安定になる場合は、SetupTime、HoldTime、信号品質、CS制御タイミングなどを確認します。
| 症状 | 考えられる原因の例 |
|---|---|
| 受信データが1ビットずれる | CPHAの設定不一致(サンプリングエッジのずれ)など |
| 受信データが化ける | SPIモード、ビット順、データ長の不一致やタイミング違反 |
| 0x00または0xFFばかり返る | MISO未接続、CS不備、スレーブ未応答、MISO が Hi-Z のまま(基板上のプルアップ/プルダウン抵抗により値が固定化されている場合)、レベル不定など |
| 最初の1バイトだけ化ける | CS後の待ち時間不足 |
| 低速では動作するが高速では不安定 | SetupTime/HoldTime不足、信号品質の問題 |
ロジックアナライザやオシロスコープで波形を確認する
SPI通信のデバッグでは、ソフトウェア上の設定値だけでなく、実際の信号波形の確認が有効です。ロジックアナライザを使うと、SCLK、MOSI、MISO、CSを同時に確認できることに加え、プロトコルデコード機能により送受信データも確認できます。
オシロスコープでは、信号の立ち上がり、立ち下がり、ノイズ、リンギングなどを確認できます。通信速度を上げたときだけ不安定になる場合には、ソフトウェア設定だけでなく、配線長や基板パターンなどのハードウェア要因についても確認します。
SPI通信では、設定が多少ずれていても一見正常に動作しているように見える場合があります。しかし、温度、電源電圧、基板差、通信速度などの条件が変わると、タイミング条件を満たせなくなり、不具合が表面化することがあります。たとえば、温度変化によって通信が不安定になったり、配線を長くしたときに波形が乱れたりする場合があります。そのため、初期段階でタイミングと波形を確認しておくことにより、後工程での原因不明の通信不良を減らせます。


