どうもミソジです。

今回は筆者が持っているラズベリーパイとSPIデバイスをつなげてSPIのCS,MOSI,MISO,SCLKの波形を見てみた」を紹介します

簡単にアナライザでSPI通信でのを確認するまでの手順を紹介しています。
「自分でSPIを色々解析してみたい!」という方におススメな記事となっています

過去記事の「I2CのACKとNACKの波形を見てみる」でI2Cでも同様に解析しましたので、I2Cのことも調べたいという方はこちらからどうぞ
sP_20180512_095551.jpg

目次
1.ラズベリーパイとSPIデバイスをつなげてみる
2.アナライザを用意する
3.アナライザを使ってSPIの波形を確認する
4.CS,MOSI,MISO,SCLKを見てみる
5.まとめ・感想

1.ラズベリーパイとSPIデバイスをつなげてみる
まずはSPI通信環境をラズベリーパイを使って作っていきます。

ラズベリーパイでのSPIの動かし方は既に先人たちにより多くの記事がありますので省略したいと思います。

※「ラズベリーパイ SPI」とググれば多くの参考になる記事がありますので、そちらを参考にしてください

実際につなげた写真がこちらとなります。
「ラズベリーパイ」「AD変換素子+温度センサ」「アナライザ」を接続しています。(AD変換ICはMCP3008、温度センサはMCP9700を使用しています。)

sP_20180715_014939.jpg

sP_20180715_015018.jpg

筆者のは少し型が古いラズベリーパイですが、SPIをつなぐのは新旧ともに簡単にできます。

AD変換ICと温度センサは下記のキットから使いました。





回路図的には下記の形になります。「3.3V」「GND」「CS」「MOSI」「MISO」「SCLK」をブレッドボードにジャンパー接続するだけで簡単にできます。

※ラズベリーパイのGPIOピン配置は新しい型に合わせています
※「CS」はアクティブローの意味で所々で「_N」を付けています
spi1.PNG

そしてラズベリーパイを設定・起動して無事SPI通信で温度センサの値を読み取れました
Pythonのプログラムで確認できました。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pi@raspberrypi ~ $ cd python_apps/
pi@raspberrypi ~/python_apps $ cd spidev-spike/
pi@raspberrypi ~/python_apps/spidev-spike $ python spi_tmp36.py
adc  :      244 
volts:     0.79
temp :    28.71
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

下記が結果の概要です。
①現在の温度を読み取り温度センサが0.79Vを出力する
②AD変換ICが0.79Vのアナログ値を読み取りデジタルの244と変換して出力する
③ラズベリーパイがデジタル244を読み取り換算して28.71℃と分かる
spi1.PNG

アナライザを使って②の出力した波形を次章から紹介してきたいと思います

2.アナライザを用意する
SPIの波形を見たいと思いますが、今回は「CS」「MOSI」「MISO」「SCLK」を見ますのでアナライザを使って確認していきます。

最近はI2CやSPIなど数MHz,数十MHz程度の解析するアナライザが1000円足らずで買えます。

筆者は色々触りたかったのでモジュール化されていないアナライザの開発ボードを買いました。

(値段は一番安く多くのピンで遊べますが、EEPROMなどの設定が必要ですのでマイコン初心者は少し難しいかもしれません)
sP_20171104_120005.jpg

本当にマイコン(サイプレス製CY7C68013A)が載っているだけのボードです。PCとUSB経由で接続して解析することができます。詳細は下記になります
MiniUSBケーブルとジャンパーワイヤは別で購入が必要です



但し数百円の差ですので下記のようなモジュールになっているアナライザを買った方が直ぐに測定できて楽できるかと思います。

PCとUSB接続してI2C,UART,SPIなど多くの通信を解析できます。
USBケーブル、ジャンパーワイヤまで付いてきますので単に解析するだけならば筆者的には下記をおススメします





「スポンサーリンク」


3.アナライザを使ってSPIの波形を確認する

アナライザを「CS」「MOSI」「MISO」「SCLK」の箇所に接続してプログラムを実行しているときの波形を確認します。ジャンパー接続すればOKです
実際行ったときの写真が下記です
sP_20180715_015018.jpg 


そして実際にとれた波形の一部が下記です。無事「CS」「MOSI」「MISO」「SCLK」の波形を取れました。(しっかり見たい方は画像をクリックして拡大をお願いします)
 spi8.PNG

これだけだと何のデータか分からないので解析の設定でSPIを選択します
正しい波形が取れていれば勝手に解析をしてくれます
spi7.PNG

これで、無事アナライザでSPIの解析ができました。
下記のように各bit、データが視覚的に分かるようになります。

spi10.PNG

SPI解析まで含めると下記が結果となります。
spi6.PNG

では次の章から各信号とSPI解析した結果を確認してきます

4.CS,MOSI,MISO,SCLKを見てみる
①CS(Chip select)
まずCSに関してはSPIが通信する間はLow(1⇒0)になっており問題ありません
(本来は一つのSPIにデバイスを複数接続しているときに使う信号です) 
※デバイス側視点ではSS(Slave Select)と表記されているケースも多いです
spi6.PNG


②SCLK(Serial Clock)
今回のプログラムはネットから拾ってきており、特にクロックについては指定していなかったので実際どうなっていたかを現物確認します。

下記のように各データ幅8bit単位で適切なクロックが出ており、データシート通りの形となっており問題無しです。

※20180813時点のデータシートのリンク先はこちらから。「FIGURE 6-1: SPI Communication with the MCP3004/3008 using 8-bit segments」 の図が一番見やすいかと思います
spi6.PNG


今回のSPIクロックは約480KHzになっていることが下記の波形からも分かります。
(サンプリング含めてある程度適当に測定しましたので「約」となっています)
spi11.PNG


③MOSI,MISO
何の略後というと「MISO: Master In Slave Out」 「MOSI: Master Out Slave In」となっており名前の通りの信号となっています。今回はMasterがラズベリーパイで、SlaveがAD変換ICとなっています
spi1.PNG

実際どのようなデータを送っているかというと下記概要の①②③内容になります
※詳細のデータシートのリンク先はこちらから。「FIGURE 6-1: SPI Communication with the MCP3004/3008 using 8-bit segments」を参考にしてください)

今回は3つの8bitデータでMater・Slave間でSPI通信をしています。3つのブロック事に内容を説明していきます
spi6.PNG


最初に「1」ではSPI通信を始める合図をMater側からSlave側にMOSI信号を出しています
spi12.PNG


次に「2」でSlave側にAD変換ICの「何処のCH」「差動かシングル」とスレーブ側に読み取りたい情報をMaster側のラズベリーパイからMOSIで伝えます
spi13.PNG

最後に「3」でSlave側のAD変換ICから現在の読み取っている値「0xF4」をMater側のラズベリーパイにMISO信号で伝えます。これで完了です
spi14.PNG


そして今回読み取った値[0xF4]は16進数ですので10進数に直すと「244」となります
無事最初に伝えたAD変換ICの「adc:244」が無事読み取っていることが波形で確認できました
spi1.PNG

5.まとめ・感想
どうでしたでしょうか、最近では1000円足らずでSPIを測定・解析することができます。
前回記事のI2Cと同様にSPIでも波形解析を行うことが問題なく可能です。

データシート見て確認するのもいいですが、やはり実物の波形見ることでよりSPIの理解が深まると思います。よろしければ皆様もアナライザを購入して確認してみてください

今日はここまでにしたいと思います
どうもありがとうございました

<<20180813追記>>
SPIとは別にUARTのTX,RX波形を見てみた記事をアップしました。

UART通信のシリアル波形をアナライザで解析してみた」
リンク先はこちらからです。よろしければこちらもご確認ください
sP_20180814_070631.jpg


1000円足らずでアナライザが購入できます
HiLetgo 24MHz 8チャンネル USBロジックアナライザ 8CHロジックアナライザ UART IIC SPI デバッグ MCU FPGA ARMに対応 [並行輸入品]
HiLetgo






ラズベリーパイで簡単にSPI通信ができます。




AD変換ICと温度センサは下記のキットから使いました。