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通信モジュールの詳細は下記記事で説明しています。(リンク先はこちら)
SPI通信をオシロスコープで確認する
今回はブレッドボード上でSPIの信号を分岐させて、オシロスコープで電圧測定します。
今回のマスターのラズパイ、スレーブのモジュールともに3.3Vで動作しています。
(5Vや1.8VでSPI通信しているケースもあります。)
オシロでCS,SCLK,MOSI,MISOの信号で3.3Vの電圧レベルを確認できました
SPI通信の解析をしてみる
単純に波形だけ見てもSPI通信で何をしているか分かりにくいと思います。
今回のオシロではデコード機能があり、SPIの解析が可能ですので確認してみます。
また今回のオシロではSPIだけではなくUART・RS232CのIFなども解析可能です。
実際に下記記事で実施しています。(リンク先はこちら)
SPI接続のCAN通信の例
今回のSPI通信はCANモジュールと接続しています。
CAN通信を行う場合の最初の一部を解析して紹介してみます。
実際のCAN通信のプログラム・ICに関しては下記記事で紹介したものです。
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通信をロジアナで解析した事例で紹介しています。
よろしければ一緒にご覧ください。(リンク先はこちら)
ラズベリーパイとPythonでSPI通信
今回ラズベリーパイのSPI通信はPythonで動作しています。
Pythonのプログラムを変えればSPI通信の設定も変更可能です。
クロック・CS(チップセレクト)などの設定を変更して波形の測定まで実施します。
PythonでSPI通信を行う
今回はPythonのライブラリ(spidev)を使用して自由にSPI通信を行います
(今まではSPI通信ではなくCAN通信のライブラリを使用していました)
最初にラズベリーパイとPythonでSPI通信を行えるようにライブラリをインストールします。
恐らく既にデフォルトでラズパイにインストール済だと思われます。
Pythonのプログラム
PythonでSPI通信するプログラミングを行っていきます。
ラズベリーパイ(raspberry pi)はPythonがデフォルトでインストールされています。
一度もプログラミング・Pythonを使ったことが無い方でも大丈夫です。
下記記事でラズパイで簡単なプログラムの作成・実行方法を紹介しています
(リンク先はこちらから)
「~~.py」というファイルを作って、Pythonの環境で開けば簡単に作成可能です。
単純なSPI通信は下記プログラムをコピペすれば完了です。
1 2 3 4 5 6 7 8 |
import spidev spi = spidev.SpiDev() spi.open(0,0) # Settings (for example) spi.max_speed_hz = 500000 spi.mode = 0b01 spi.xfer2([0x01,0x01,0x01]) |
プログラム内容としては非常に簡単です
クロック500KHz,、CSが0、SPIモードが1、データ(0x01)を3byte分出力します。
上記プログラムはspidevの公式HPのサンプルプログラムを改造修正したものです。
このプログラムをベースに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通信に関して紹介させていただきました。
記事をまとめますと下記になります。
筆者のRIGOL DS1054ZはSPI通信の測定・解析が十分に測定が可能です。
趣味にちょうど良いオシロスコープだと思います。
下記記事でも紹介していますので、よろしければご覧ください。(リンク先はこちらから)
コメント