SPI通信に入門!速度・チップセレクト変更時の波形を確認してみた

インターフェース

SPI通信をオシロスコープで測定してみました。

プログラムを変更して、速度やチップセレクトを変えた波形も確認しています

SPI通信の基礎を初心者の方に分かりやすく紹介します。

 

スポンサーリンク

SPI通信に入門!速度・チップセレクト変更時の波形を確認してみた

オシロスコープでSPI通信を測定してみました。

 

ラズベリーパイとPythonでSPI通信を行っています。

 

オシロスコープのデコード機能を使うことで、データの中身まで解析しました。

 

Pythonのプログラムを修正することで、通信速度など変更した波形を確認しています。

 

SPI通信のテスト方法、測定の仕方まで詳細に紹介していきます。

 

今回使用している4chのオシロの詳細は下記記事で紹介しています

よろしければ一緒にご覧ください。(リンク先はこちらから)

オシロスコープはおすすめ!電子工作のために購入してみた
オシロスコープを個人で購入してみました。 オシロがあれば電子工作の測定、電子回路の勉強などに使えて非常に役立ちます。 現役のエンジニアが自宅でオシロを使うメリット・デメリットを説明します。 また実際に通販で購入して、使い始めるまでの一連の流れも紹介します。

 

SPI通信の信号線

SPIは4本の信号線で通信します。

  • CS(Chip select)
  • SCLK(Serial Clock)
  • MOSI(Master Out Slave In)
  • MISO(Master In Slave Out)

 

SPI通信は一般的に4本の信号でデータを送信・受信します。(3線の場合も稀にある)

実際の配線では電源やGNDもありますのでもう少し多くなります。

 

SPI通信のマスターとスレーブ

SPI通信にはマスター(Master)とスレーブ(Slave)があります。

マスター側からCS,SCLK,MOSIを出力して、MISOが入力する形になります。

今回のテストではラズベリーパイがマスターとなります。

 

今回のスレーブのSPI接続のデバイスはCAN通信モジュールです。

 

CAN通信モジュールの詳細は下記記事で説明しています。(リンク先はこちら)

CAN通信に入門!波形とプロトコルを確認してみた
CANの信号波形をオシロスコープとアナライザで確認してみました。 電圧レベルの測定からプロトコルの解析まで実施しています。 CAN通信の基礎を初心者の方に分かりやすく紹介します。

 

SPI通信をオシロスコープで確認する

今回はブレッドボード上でSPIの信号を分岐させて、オシロスコープで電圧測定します。

 

今回のマスターのラズパイ、スレーブのモジュールともに3.3Vで動作しています。

(5Vや1.8VでSPI通信しているケースもあります。)

オシロでCS,SCLK,MOSI,MISOの信号で3.3Vの電圧レベルを確認できました

 

SPI通信の解析をしてみる

単純に波形だけ見てもSPI通信で何をしているか分かりにくいと思います。

今回のオシロではデコード機能があり、SPIの解析が可能ですので確認してみます。

 

また今回のオシロではSPIだけではなくUART・RS232CのIFなども解析可能です。

実際に下記記事で実施しています。(リンク先はこちら)

RS232Cの電圧レベルをオシロスコープで測定してみた
RS232Cの電圧をオシロスコープで測定してみました。また通信プロトコルも確認しています。 USB-RS232C変換ケーブルの電圧波形を実際に確認しています。 RS232C通信の基礎を初心者の方にも分かりやすく紹介します。

 

SPI接続のCAN通信の例

今回のSPI通信はCANモジュールと接続しています。

CAN通信を行う場合の最初の一部を解析して紹介してみます。

 

実際のCAN通信のプログラム・ICに関しては下記記事で紹介したものです。

CAN通信に入門!波形とプロトコルを確認してみた

 

SPIからリセット命令を出す

最初にラズベリーパイから「11000000」をSPIで出力しています。

「11000000」はリセット命令です。

 

ICの内部のレジスタをリセットして、コンフィグレーション(設定)のモードに移行させます。

 

SPIからRead命令を出す

リセットの後はRead(読み込み)命令「00000011」をSPIで出力します。

その後の「00001110」が(読みたい)アドレスを示しています

 

「00001110」はCANSTAT(CAN状態レジスタ)をとなります。

最後に「10000000」のコンフィグレーション中であることをReadできます。

 

つまりSPI通信で「Read」して「CAN状態」が「コンフィグレーション」を確認できました。

 

SPI通信のプロトコルはICで異なります

あくまで今回の解析はSPI-CAN変換ICのMCP2515の仕様となります。

(MCP2515のメーカHPのリンク先はこちらから)

通信プロトコルに関しては各ICのデータシートを確認する必要があります。

 

実際に別のSPIのAD変換ICを解析するとプロトコルが異なっています。

 

下記記事のSPI通信をロジアナで解析した事例で紹介しています。

よろしければ一緒にご覧ください。(リンク先はこちら)

SPIのCS,MOSI,MISO,SCLKの波形を見てみた
今回は筆者が持っているラズベリーパイとSPIデバイスをつなげて「SPIのCS,MOSI,MISO,SCLKの波形を見てみた」を紹介します 簡単にアナライザでSPI通信でのを確認するまでの手順を紹介しています。 「自分でSPI...

 

ラズベリーパイとPythonでSPI通信

今回ラズベリーパイのSPI通信はPythonで動作しています。

Pythonのプログラムを変えればSPI通信の設定も変更可能です。

 

クロック・CS(チップセレクト)などの設定を変更して波形の測定まで実施します。

 

PythonでSPI通信を行う

今回はPythonのライブラリ(spidev)を使用して自由にSPI通信を行います

(今まではSPI通信ではなくCAN通信のライブラリを使用していました)

 

最初にラズベリーパイとPythonでSPI通信を行えるようにライブラリをインストールします。

恐らく既にデフォルトでラズパイにインストール済だと思われます。

pip3 install spidev

 

Pythonのプログラム

PythonでSPI通信するプログラミングを行っていきます。

ラズベリーパイ(raspberry pi)はPythonがデフォルトでインストールされています。

 

一度もプログラミング・Pythonを使ったことが無い方でも大丈夫です。

下記記事でラズパイで簡単なプログラムの作成・実行方法を紹介しています

(リンク先はこちらから)

ラズベリーパイでプログラミング入門!Pythonの簡単な始め方
プログラミングを始めたい方にラズベリーパイを使った簡単な入門方法を紹介します。 プログラミング言語の中でも初心者にもやさしく、人気なPythonがラズパイならば簡単にスタートできます。 ラズベリーパイでプログラミング入門!Pytho...

 

「~~.py」というファイルを作って、Pythonの環境で開けば簡単に作成可能です。

 

単純なSPI通信は下記プログラムをコピペすれば完了です。

 

プログラム内容としては非常に簡単です

クロック500KHz,、CSが0、SPIモードが1、データ(0x01)を3byte分出力します。

 

上記プログラムはspidevの公式HPのサンプルプログラムを改造修正したものです。

spidev
Python bindings for Linux SPI access through spidev

 

このプログラムをベースにSPIの各設定を変更していきます

 

SPI通信のクロックを変更してみる

SPIのクロックの変更方法は簡単です。

spi.max_speed_hzの後の値を認識の数字に変更すればOKです。

今回のテストでは500kHz→50kHzに遅くしてみました。

 

実際のSCLKの波形も50kHzに遅くなっていることを確認できました。

 

SPI通信のチップセレクトを変更してみる

ラズベリーパイにはCS(チップセレクト)の「0」と「1」があります。

CSを切り替えることで、2つのSPIデバイスが接続可能です。

spi.open(0,*)の箇所を0→1に変更するだけで変更可能です

 

波形としてもCS0ではなくCS1で出力されていることを確認できました

 

SPI通信のデータを変更してみる

SPI通信のデータは必要に応じて複数byte分を送信する必要があります。

実際に送るデータの中身に関してはIC・送信内容で異なります。

データ(0x01)を3byteから4byteに増やしてテストしてみます。

 

spi.xfer2の後のデータを変えるだけで簡単に変更可能です。

実際の波形も送信データが3byteから4byteに増えていることが確認できました。

 

SPIモードの変更も可能です

SPIにはデータのシフト・サンプリングするタイミングをモードで選択できます。

モードは4つ(0b00~0b11)あり、今回のテストではSPIモードは1(0b01)です。

データを「立ち上がりでシフト」「立ち下りでサンプリング」します。

 

実際の波形でもSPIモードが1であることを確認できました

 

まとめ

今回はSPI通信に関して紹介させていただきました。

記事をまとめますと下記になります。

SPI通信は(基本的に)CS,SCLK,MOSI,MISOの4本の信号線
ラズパイとPythonで自由にSPI通信の設定を変更できる
オシロスコープを使えば更にSPI通信の理解が深まる

 

筆者のRIGOL DS1054ZはSPI通信の測定・解析が十分に測定が可能です。

趣味にちょうど良いオシロスコープだと思います。

下記記事でも紹介していますので、よろしければご覧ください。(リンク先はこちらから)

オシロスコープはおすすめ!電子工作のために購入してみた
オシロスコープを個人で購入してみました。 オシロがあれば電子工作の測定、電子回路の勉強などに使えて非常に役立ちます。 現役のエンジニアが自宅でオシロを使うメリット・デメリットを説明します。 また実際に通販で購入して、使い始めるまでの一連の流れも紹介します。

コメント