ロジックアナライザを試すその3(SPI)


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”がどちらにも見えている。成功。

最後に

実は続きがあります。