#SPIをロジックアナライザで確認
こちらの続編で、今度はSPIを試す。
PulseView
今回はWindows版を使う。ここなどからDownload。設定については、その1、その2と同じ。
SPI設定
プロトコルを選択する(下記”Add protocol decode”クリック)。
すると、次のダイアログボックスが表示される。
”SPI”とタイプして検索し、SPIをクリック。
ClockをD7、CSをD0、MOSIをD3、MISOをD4に割りあてる(未使用のピンは”Disable”に設定)。今回用いるSPIデバイス(A/Dコンバータ)のモードは”Mode 0,0”なので、”Clock polarity”および「Clock phase」は両方とも’0’となる。
対象デバイス
以前試したA/DコンバータMCP3008がSPIデバイス、A/Dコンバータの先に温度センサーがある。温度センサーはA/DコンバータのChannel 0に接続。
A/DコンバータMCP3008
データシートで次の部分が大事。
ソースコード
こちらにあったコードを若干修正した程度(ありがとうございます!)。
#include <SPI.h>
#define SPI_CS 10
float Vref = 5.0 ;
SPISettings settings(1000000,MSBFIRST,SPI_MODE0);
void setup() {
Serial.begin(9600);
pinMode(SPI_CS, OUTPUT);
SPI.begin();
}
void loop(){
// SPI setting and write&read
SPI.beginTransaction(settings);
digitalWrite(SPI_CS, LOW);
SPI.transfer(0b00000001); // Start bit 1
byte highByte = SPI.transfer(0b10000000); // SingleEnd Channel 0
byte lowByte = SPI.transfer(0x00); // dummy
digitalWrite(SPI_CS, HIGH);
SPI.endTransaction();
unsigned int dataCh0 = ((highByte & 0x03) << 8) + lowByte;
// Conversion of read data according to MCP9700 spec
float volts = dataCh0 * Vref / 1024;
float temperature = (volts - 0.5) / 0.01; // : 500 mv at 0 degree and 10 mv / degree
Serial.println("dataCh0: " + String(dataCh0,HEX) + " Voltage: " + String(volts,3));
Serial.println("Temperature: " + String(temperature,2) + " degrees");
Serial.println();
delay(3000);
}
上述したデータシートを具現化している。
- SPI設定は1MHz、MSB First、モード0(Mode 0,0)
- CSをLow
- "Start bit" write
- "SingleEnd/Channel 0" write & 1バイトread
- Dummy write & 1バイトread
- CSをHigh
配線の様子
こちらと同じ。見えていないが、VccとGNDとはArduino側に接続されている。
(ロジアナ用に複数のワイヤーあり。)
結果
ロジックアナライザのデコード結果およびシリアルコンソール表示は次のとおり。
デジタル変換された値”9b”がどちらにも見えている。成功。
最後に
実は続きがあります。