前回は、SPI通信の 前編としてFRDMボード2台用いて、SPI通信のサンプルアプリケーションを動かしてみました。
今回は、4つのSPIモードの設定を変えながら、実際に送受信されるSPI信号を確認してみようと思います。本稿では、以下の[前編]記事の作業が完了していることを前提に進めます。
[前編] SPI通信のサンプルアプリケーションを動かしてみる。
[後編] SPIのモードを変えながら、実際のSPI信号を観測して、変化を見てみる。
(作業時間:20分) ※前編の内容(MCUXpresso for VSC, SDKがインストールされていて、SPIのアプリケーション動作確認)が済んでいる前提。
ハードウェア
・FRDM-MCXN947 (USBケーブル付属) x 2枚
・ジャンパ線 : 複数本
・ロジックアナライザー ※SPI信号解析用
ソフトウェア
・FRDM-MCXN947用のSDK
*MCX N947向けのSDK(ver. 26.3.0)をVSCodeにインストールした前提で説明していきます。
開発環境(MCUXpresso for VSC)の準備、SDKのインストール方法は、以下の記事をご参考ください。
記事:MCUXpresso for VSCとSDKのインストール (日本語ブログ)
記事SPIバスの概要 (日本語ブログ)にて、CPOL = 0 or 1, CPHA = 0 or 1の組み合わせ、計4通りのモードがあると説明されています。
表1 4つのモードとCPOL,CPHA
| CPOL | CPHA | |
| mode=0 | 0 | 0 |
| mode=1 | 0 | 1 |
| mode=2 | 1 | 0 |
| mode=3 | 1 | 1 |
図1 CPOL,CPHAの設定による挙動
先ずは波形を確認していく前に、前回SPI通信のサンプル・アプリケーションをデフォルトの状態でビルドして動かしてみました。デフォルト状態のCPOL、CPHAの設定を確認します。
CPOLとCPHAは、fsl_lspi.hの中で定義されています。
図2 CPOLとCPHAの定義(fsl_lspi.h)
次にSPIの初期化は、fsl_lpspi.c内のLPSPI_MasterGetDefaultConfig()内で実施されていました。
下図赤枠内で、コントローラ(マスタ)側のCPOL=0, CPHA=0が設定されていることが分かりました。また同じファイル内にデバイス(スレーブ)側の設定LPSPI_SlaveGetDefaultConfig()も含まれているので、CPOL、CPHAをマスタとスレーブの2カ所ともパラメータを変更しながらテストしていきます。
図3 マスタ側の設定箇所 LPSPI_MasterGetDefaultConfig()
図4 スレーブ側の設定箇所 LPSPI_SlaveGetDefaultConfig()
それでは、「前回の記事」を参考に2つのFRDMボードとPCを接続させて、シリアル・モニターも2つ開いて、それぞれのサンプル・アプリケーションが動作していることを確認してください。
図5 シリアルモニターでのSPI通信結果
この状態で、2つのFRDMボードのSPIを結線します。
※先に結線してからFRDMボードに電源を入れてしまうと、うまく動かないことがありますので、ご注意ください。
前回の記事と同じ内容ですが、FRDM-MCXN947の回路図を確認してみると、以下のJ2コネクタの#8がMOSI、#10がMISOであることが分かります。
図6 FRDM-MCXN947のSPI回路図
FRDM-MCXN947上のJ2コネクタ同士を以下のように、ジャンパ線で接続してください。
※J2の#6ピンと#8ピンをクロスさせて接続してください。
表2 FRDM-MCXN947同士のSPI結線
| LPSPI_master | LPSPI_slave |
| J2-14 : GND | J2-14 : GND |
| J2-12 : CLK | J2-12 : CLK |
| J2-6 : SOUT(MOSI) | J2-8 : SIN(MISO) |
| J2-8 : SIN(MISO) | J2-6 : SOUT(MOSI) |
| J2-6 : SS(PCS) | J2-6 : SS(PCS) |
通常ArduinoシールドソケットでSPIに使われるD10、D11、D12、D13に相当する端子です。
図7 SPI接続図
※今回はこのMaster - Slave間の信号を確認するためにロジック・アナライザーを接続します。
ではロジック・アナライザが正しく動作しているか実際にSPI信号を送受信して確認してみます。
図8 SPIデータ送受信をシリアル・モニターで表示した結果
図9 SPIデータ送受信をロジック・アナライザーで表示した結果
上図の文字が小さいのですが、Masterから見た際に、送信、受信共に正しく動作していることが確認できました。
ここで送信部分(↑画像上半分)を見てみると、MOSI(Master Out Slave In)はデータがインクリメントされていくのに対して、MISO(Master In Slave Out)がずっと"High (=hFF)"であることが分かります。反対に受信部分(↑画像下半分)を見てみると、今度はMOSIが"High (=hFF)"固定で、MISOはデータがインクリメントされています。
これは正しい動きで、SPIバスの概要 (日本語ブログ)にも記載があるとおり、非データ転送時のMOSI,MISOの出力はハイ・インピーダンス状態におかれるためです。
それでは実際の信号を見ていきます。
ここからは3.CPOL, CPHAの設定確認 (サンプル・コードのどこで設定されている?)を参考にしながら、マスタ、スレーブ両方の「CPOL、CPHAの値を変更→ビルド→書き込み」を行い、測定を行いました。
SPIモード0:CPOL=0, CPHA=0のSPI信号 (デフォルト設定の状態)
図10 CPOL=0, CPHA=0時のMasterからSlaveへのデータ送信波形
図10を見るとクロック(CLK)はデータが転送される前(アイドル時)にLowとなっている(図中の橙枠)ので、POL=0であることが分かります。
また1回目のCLKの立ち上がりエッジでMOSIのデータをラッチ(図中の赤線)しており、2回目のCLKの立ち下がりエッジでMOSIのデータを変化(図中の緑線)させているので、CPHA=0であることが分かります。
SPIモード1:CPOL=0, CPHA=1のSPI信号
図11 CPOL=0, CPHA=1時のMasterからSlaveへのデータ送信波形
図11を見るとCLKはデータが転送される前(アイドル時)にLowとなっている(図中の橙枠)ので、POL=0であることが分かります。
今度は、1回目のCLKの立ち上がりエッジでMOSIのデータを変化(図中の緑線)させており、2回目のCLKの立ち下がりエッジでMOSIのデータをラッチ(図中の赤線)しているので、CPHA=1であることが分かります。
SPIモード2:CPOL=1, CPHA=0のSPI信号
図12 CPOL=1, CPHA=0時のMasterからSlaveへのデータ送信波形
図12を見るとCLKはデータが転送される前(アイドル時)にHighとなっている(図中の橙枠)ので、POL=1であることが分かります。
また1回目のCLKの立ち下がりエッジでMOSIのデータをラッチ(図中の赤線)させており、2回目のCLKの立ち上がりエッジでMOSIのデータを変化(図中の緑線)しているので、CPHA=0であることが分かります。
※クロックの極性が変わっているので、1回目と2回目のクロックが混同しないように。
SPIモード3:CPOL=1, CPHA=1のSPI信号
図13 CPOL=1, CPHA=1時のMasterからSlaveへのデータ送信波形
図13を見るとCLKはデータが転送される前(アイドル時)にHighとなっている(図中の橙枠)ので、POL=1であることが分かります。
また1回目のCLKの立ち下がりエッジでMOSIのデータを変化(図中の緑線)させており、2回目のCLKの立ち上がりエッジでMOSIのデータをラッチ(図中の赤線)しているので、CPHA=1であることが分かります。
あらためて今回の測定結果をまとめると以下(表3)のようになりました。
表3 4つのモードとCPOL、CPHAの関係まとめ
| SPIモード | CPOL | CPHA | アイドル時のCLK | 1回目のCLK | 2回目のCLK |
| mode=0 | 0 | 0 | Low | 立ち上がりエッジでデータをラッチ | 立ち下がりエッジでデータを変化 |
| mode=1 | 0 | 1 | Low | 立ち上がりエッジでデータを変化 | 立ち下がりエッジでデータをラッチ |
| mode=2 | 1 | 0 | High | 立ち下がりエッジでデータをラッチ | 立ち上がりエッジでデータをラッチ |
| mode=3 | 1 | 1 | High | 立ち下がりエッジでデータを変化 | 立ち上がりエッジでデータをラッチ |
実際にSPIモードを4通り、CPOLとCPHAを変えながら信号の測定をしてみました。自分で測定しながら、極性と位相が変わると混乱しましたが、期待通りの動作を確認できました。基礎を学ぶ際には、プログラムを変えてビルドして動いたことを確認するだけでなく、実際に信号を見てみると理解が進むかもしれません。是非、みなさんも試してみてください。
=========================
本投稿の「Comment」欄にコメントをいただいても、現在返信に対応しておりません。
お手数をおかけしますが、お問い合わせの際には「NXPへの技術質問 - 問い合わせ方法 (日本語ブログ)」をご参照ください。
(既に弊社NXP代理店、もしくはNXPとお付き合いのある方は、直接担当者へご質問いただいてもかまいません。)
前回は、SPI通信の 前編としてFRDMボード2台用いて、SPI通信のサンプルアプリケーションを動かしてみました。
今回は、4つのSPIモードの設定を変えながら、実際に送受信されるSPI信号を確認してみようと思います。本稿では、以下の[前編]記事の作業が完了していることを前提に進めます。
[前編] SPI通信のサンプルアプリケーションを動かしてみる。
[後編] SPIのモードを変えながら、実際のSPI信号を観測して、変化を見てみる。
(作業時間:20分) ※前編の内容(MCUXpresso for VSC, SDKがインストールされていて、SPIのアプリケーション動作確認)が済んでいる前提。