2370046_ja-JP

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2370046_ja-JP

2370046_ja-JP

NXPのMCXマイコンとSDKを使ったSPI通信の基本:SPIの4つのモードと実際の信号確認 (日本語ブログ)

はじめに


前回は、SPI通信の 前編としてFRDMボード2台用いて、SPI通信のサンプルアプリケーションを動かしてみました。

今回は、4つのSPIモードの設定を変えながら、実際に送受信されるSPI信号を確認してみようと思います。本稿では、以下の[前編]記事の作業が完了していることを前提に進めます。

[前編] SPI通信のサンプルアプリケーションを動かしてみる。

[後編] SPIのモードを変えながら、実際のSPI信号を観測して、変化を見てみる。

(作業時間:20分) ※前編の内容(MCUXpresso for VSC, SDKがインストールされていて、SPIのアプリケーション動作確認)が済んでいる前提。

Keita_Nagashima_0-1780278468791.png


目次 

  1. 準備するもの
  2. SPIモード
  3. CPOL, CPHAの設定確認 (サンプル・コードのどこで設定されている?)
  4. SPI信号を実際に確認
  5. 各SPIモードにおける信号の測定結果
  6. おわりに

1.準備するもの


ハードウェア

FRDM-MCXN947 (USBケーブル付属) x 2枚

・ジャンパ線 : 複数本

・ロジックアナライザー ※SPI信号解析用

Keita_Nagashima_0-1779434896335.png


ソフトウェア

・FRDM-MCXN947用のSDK

 *MCX N947向けのSDK(ver. 26.3.0)をVSCodeにインストールした前提で説明していきます。

  開発環境(MCUXpresso for VSC)の準備、SDKのインストール方法は、以下の記事をご参考ください。

  記事:MCUXpresso for VSCとSDKのインストール (日本語ブログ)

 


2.SPIモード


記事SPIバスの概要 (日本語ブログ)にて、CPOL = 0 or 1, CPHA = 0 or 1の組み合わせ、計4通りのモードがあると説明されています。

  • CPOL(Clock Polarity:クロックの極性):通信していない「アイドル時(=非転送時)」に、クロック線(SCLK)がどちらの電圧レベルになっているかを設定。
    • CPOL=0 : アイドル時Low
    • CPOL=1 : アイドル時High
  • CPHA(Clock Phase:クロックの位相):データ送信とラッチ(サンプリング)タイミングをクロックのエッジ(立ち上がり・立ち下がり)のどちらに合わせるかを設定。
    • CPHA=0 : 1回目のクロックエッジでデータをサンプリング、2回目でデータを出力
    • CPHA=1 : 1回目のクロックエッジでデータを出力、2回目でデータをサンプリング

表1 4つのモードとCPOL,CPHA

  CPOL CPHA
mode=0 0 0
mode=1 0 1
mode=2 1 0
mode=3 1 1

 

Keita_Nagashima_1-1779435101240.png

図1 CPOL,CPHAの設定による挙動

 

3.CPOL, CPHAの設定確認 (サンプル・コードのどこで設定されている?)


先ずは波形を確認していく前に、前回SPI通信のサンプル・アプリケーションをデフォルトの状態でビルドして動かしてみました。デフォルト状態のCPOL、CPHAの設定を確認します。 

CPOLとCPHAは、fsl_lspi.hの中で定義されています。 

SPI_polling_CPOL=0_CPHA=0_code.h.png

図2 CPOLとCPHAの定義(fsl_lspi.h)


次にSPIの初期化は、fsl_lpspi.c内のLPSPI_MasterGetDefaultConfig()内で実施されていました。

下図赤枠内で、コントローラ(マスタ)側のCPOL=0, CPHA=0が設定されていることが分かりました。また同じファイル内にデバイス(スレーブ)側の設定LPSPI_SlaveGetDefaultConfig()も含まれているので、CPOL、CPHAをマスタとスレーブの2カ所ともパラメータを変更しながらテストしていきます。

SPI_polling_CPOL=0_CPHA=0_code.png

図3 マスタ側の設定箇所 LPSPI_MasterGetDefaultConfig()

 

SPI_polling_CPOL=0_CPHA=0_code-slave.png

 図4 スレーブ側の設定箇所 LPSPI_SlaveGetDefaultConfig()

 

4.SPI信号を実際に確認


それでは、「前回の記事」を参考に2つのFRDMボードとPCを接続させてシリアル・モニターも2つ開いてそれぞれのサンプル・アプリケーションが動作していることを確認してください。

Keita_Nagashima_0-1779437949020.png

図5 シリアルモニターでのSPI通信結果


この状態で、2つのFRDMボードのSPIを結線します。

※先に結線してからFRDMボードに電源を入れてしまうと、うまく動かないことがありますので、ご注意ください。

前回の記事と同じ内容ですが、FRDM-MCXN947の回路図を確認してみると、以下のJ2コネクタの#8がMOSI、#10がMISOであることが分かります。

Keita_Nagashima_0-1779436505398.png

図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に相当する端子です。

Keita_Nagashima_0-1780462065843.png

図7 SPI接続図 


※今回はこのMaster - Slave間の信号を確認するためにロジック・アナライザーを接続します。


ではロジック・アナライザが正しく動作しているか実際にSPI信号を送受信して確認してみます。

Keita_Nagashima_1-1779438387576.png

図8 SPIデータ送受信をシリアル・モニターで表示した結果

 

Keita_Nagashima_2-1779438512920.png

図9 SPIデータ送受信をロジック・アナライザーで表示した結果


 上図の文字が小さいのですが、Masterから見た際に、送信、受信共に正しく動作していることが確認できました。

 ここで送信部分(↑画像上半分)を見てみると、MOSI(Master Out Slave In)はデータがインクリメントされていくのに対して、MISO(Master In Slave Out)がずっと"High (=hFF)"であることが分かります。反対に受信部分(↑画像下半分)を見てみると、今度はMOSIが"High (=hFF)"固定で、MISOはデータがインクリメントされています。

これは正しい動きで、SPIバスの概要 (日本語ブログ)にも記載があるとおり、非データ転送時のMOSI,MISOの出力はハイ・インピーダンス状態におかれるためです。


それでは実際の信号を見ていきます。


5.各SPIモードにおける信号の測定結果


ここからは3.CPOL, CPHAの設定確認 (サンプル・コードのどこで設定されている?)を参考にしながら、マスタ、スレーブ両方の「CPOL、CPHAの値を変更→ビルド→書き込み」を行い、測定を行いました。


SPIモード0:CPOL=0, CPHA=0のSPI信号 (デフォルト設定の状態)

SPI_polling_CPOL=0_CPHA=0.png

図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信号

SPI_polling_CPOL=0_CPHA=1.png

図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信号

SPI_polling_CPOL=1_CPHA=0.png

図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信号

SPI_polling_CPOL=1_CPHA=1.png

 図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 立ち下がりエッジでデータを変化 立ち上がりエッジでデータをラッチ

6.おわりに

実際にSPIモードを4通り、CPOLとCPHAを変えながら信号の測定をしてみました。自分で測定しながら、極性と位相が変わると混乱しましたが、期待通りの動作を確認できました。基礎を学ぶ際には、プログラムを変えてビルドして動いたことを確認するだけでなく、実際に信号を見てみると理解が進むかもしれません。是非、みなさんも試してみてください。


参考情報



=========================

本投稿の「Comment」欄にコメントをいただいても、現在返信に対応しておりません。
お手数をおかけしますが、お問い合わせの際には「NXPへの技術質問 問い合わせ方法 (日本語ブログ)」をご参照ください。
(既に弊社NXP代理店、もしくはNXPとお付き合いのある方は、直接担当者へご質問いただいてもかまいません。)


前回は、SPI通信の 前編としてFRDMボード2台用いて、SPI通信のサンプルアプリケーションを動かしてみました。

今回は、4つのSPIモードの設定を変えながら、実際に送受信されるSPI信号を確認してみようと思います。本稿では、以下の[前編]記事の作業が完了していることを前提に進めます。

[前編] SPI通信のサンプルアプリケーションを動かしてみる。

[後編] SPIのモードを変えながら、実際のSPI信号を観測して、変化を見てみる。

(作業時間:20分) ※前編の内容(MCUXpresso for VSC, SDKがインストールされていて、SPIのアプリケーション動作確認)が済んでいる前提。

InterfaceMCUXpressoMCUXpresso SDKMCX日本語ブログ
标记 (1)
无评分
版本历史
最后更新:
1 个月之前
更新人: