ロジックアナライザを試すその３（SPI）

#SPIをロジックアナライザで確認
[こちら](https://qiita.com/infinite1oop/items/b18197f74864b908a556)の続編で、今度はSPIを試す。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/e4d34e95-5cd4-2871-b269-3f60052ab92e.png", width=30%>

## PulseView
今回はWindows版を使う。[ここ](https://sigrok.org/wiki/Downloads)などからDownload。設定については、[その１](https://qiita.com/infinite1oop/items/508873f660812e52f324)、[その２](https://qiita.com/infinite1oop/items/b18197f74864b908a556)と同じ。

### SPI設定
プロトコルを選択する（下記”Add protocol decode”クリック）。
![Procotol Select.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/05d0749d-bd10-7b9f-33d6-139847648f58.png)
すると、次のダイアログボックスが表示される。
![SPI select.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/8ccdc703-d5da-faba-a00e-de61eb32057a.png)
”SPI”とタイプして検索し、SPIをクリック。
![HardSPI_LogiAnaSetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/c8b6139c-e8d2-3b08-b451-5533300c5db1.png)
ClockをD7、CSをD0、MOSIをD3、MISOをD4に割りあてる（未使用のピンは”Disable”に設定）。今回用いるSPIデバイス（A/Dコンバータ）のモードは”Mode 0,0”なので、”Clock polarity”および「Clock phase」は両方とも’0’となる。

## 対象デバイス
[以前](https://qiita.com/infinite1oop/items/ca2e5dc08d1d916f1a6c)試したA/DコンバータMCP3008がSPIデバイス、A/Dコンバータの先に温度センサーがある。温度センサーはA/DコンバータのChannel 0に接続。

## A/DコンバータMCP3008
[データシート](https://cdn-shop.adafruit.com/datasheets/MCP3008.pdf)で次の部分が大事。
![MCP3008Datasheet_Hard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/37da2af0-3813-5b20-bc4d-9a091882adac.png)

## ソースコード
[こちら](https://www.denshi.club/cookbook/adda/adc/a-d210spi-mcp3008.html)にあったコードを若干修正した程度（ありがとうございます！）。

```c++
#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

## 配線の様子
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/8d1019fb-3bf4-69ef-d7e2-8ef90caa83fd.jpeg", width=50%>
[こちら](https://qiita.com/infinite1oop/items/ca2e5dc08d1d916f1a6c)と同じ。見えていないが、VccとGNDとはArduino側に接続されている。
（ロジアナ用に複数のワイヤーあり。）

## 結果
ロジックアナライザのデコード結果およびシリアルコンソール表示は次のとおり。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/164d482a-4163-3767-0217-22bc3acd4023.png", width=100%>
デジタル変換された値”9b”がどちらにも見えている。成功。

## 最後に
実は続きがあります。