多チャネル・オシロスコープHaasoscope (3) SPI信号を観測
SPIバスは、一つのデバイスをマスタのマイコンにつなぐとき、MISO、MOSI、CLK、SSの4本の信号をつなぎます。デバイスが増えるとチップ・セレクト信号のSS(CS)を一つ増やして5本の信号でデータのやり取りをします。
●SPIバスの様子を観測
8ビットA-DコンバータMCP3008をラズパイにつなぎました。
Haasoscopeの画面はデフォルトのままです。プローブは1:1、入力は50Ωにすると、見やすい縦軸の電圧になりました。プローブは1:1、入力をハイ・インピーダンスにすると、0-3.3V付近のスイングになるので、多くの入力を重ならずに表示できません。
Haasoscopeでは、画面右上のチャネルと色表示のラインをマウスでクリックしてチャネルを選択して、カーソル・キー上下で縦方向の表示位置をシフトします。カーソル・キー左右で横軸の時間を変更します。
スレーブ・デバイスMCP3008が出力するデータが中途半端な電圧です。
接続です。
MCP3008 | ラズパイ | |||
---|---|---|---|---|
入力CH0 | 1番ピン | 16 | Vdd 3.3V電源 | 1番 |
入力CH1 | 2 | 15 | Vref 基準電圧入力 | 1番 |
入力CH2 | 3 | 14 | AGND アナログ・グラウンド | 6番 |
入力CH3 | 4 | 13 | CLK | 23番 |
入力CH4 | 5 | 12 | Dout | 21番 |
入力CH5 | 6 | 11 | Din | 19番 |
入力CH6 | 7 | 10 | /CS・SHDN | 24番 CE0 |
入力CH7 | 8 | 9 | DGND ディジタル・グラウンド | 6番 |
pythonのテスト・プログラムです。
#!/usr/bin/env python
import spidev
spi = spidev.SpiDev()
spi.open(0,0) #port 0,cs 0
spi.max_speed_hz=(1000000)
while 1:
adc = spi.xfer2([0x01,0x80,0x00])
spi.close()
プローブは1:10、入力をハイ・インピーダンスにします。6チャネル以降はチャネルをセンタした状態でCTRL+clickで表示を消しました。各チャネルはマウス・ホイールを動かして縦方向にずらします。いずれの波形も0-3.3Vをフルスイングしているのがわかります。
測定中の様子です。
●MCP3008を2個にする
デバイスを2個にするには、チップ・セレクト信号SS(CS)を二つ使います。
ラズパイのチップ・セレクト信号CE1(26番)を2個目のMCP3008のCS(10番)につなぎます。Pythonプログラムに二つ目のスレーブ・デバイスのコマンド送信を追加します。
#!/usr/bin/env python
import spidev
Vref = 3.29476
spi = spidev.SpiDev()
spi.open(0,0) #port 0,cs 0
spi.max_speed_hz=(1000000)
spi2 = spidev.SpiDev()
spi2.open(0,1) #port 0,cs 1
spi2.max_speed_hz=(1000000)
while 1:
adc = spi.xfer2([0x01,0x80,0x00])
adc = spi2.xfer2([0x01,0x80,0x00])
spi.close()
実行中の様子です。五つの信号を同時に見れるのは大変ありがたいです。1個目のMCP3008のCH0は開放、2個目のMCP3008のCH0は3.3Vへ接続した状態です。