🛠️

SPI 操作の原始的な書き方をリファクタリングする

2023/05/10に公開

原始的な書き方

#define PIN_CLK 13
#define PIN_DIN 11
#define PIN_CS  10

void setup() {
  pinMode(PIN_CS, OUTPUT);
  pinMode(PIN_CLK, OUTPUT);
  pinMode(PIN_DIN, OUTPUT);

  digitalWrite(PIN_CS, HIGH);
  digitalWrite(PIN_CLK, LOW);
  digitalWrite(PIN_DIN, LOW);

  digitalWrite(PIN_CS, LOW);
  shiftOut(PIN_DIN, PIN_CLK, MSBFIRST, 123);
  digitalWrite(PIN_CS, HIGH);
}

setup 内の最初の 6 行が初期化処理になるが明瞭性は皆無である。

定数は定義済みのものを使う

void setup() {
  pinMode(SS, OUTPUT);
  pinMode(SCK, OUTPUT);
  pinMode(MOSI, OUTPUT);

  digitalWrite(SS, HIGH);
  digitalWrite(SCK, LOW);
  digitalWrite(MOSI, LOW);

  digitalWrite(SS, LOW);
  shiftOut(MOSI, SCK, MSBFIRST, 123);
  digitalWrite(SS, HIGH);
}

SPI 用のピンの位置はぜんぶ決まっているのでせめて用意された定義を使いたい。

既存ライブラリに置き換える

#include <SPI.h>

void setup() {
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);

  digitalWrite(SS, LOW);
  SPI.transfer(123);
  digitalWrite(SS, HIGH);
}
  • SPI ライブラリは Arduino に標準で入っている
  • setup 内の最初の 6 行は SPI.begin がやってくれる
  • shiftOut は SPI.transfer に置き換える
  • 流す方向は SPI.setBitOrder にあらかじめ指定しておく

参照

https://www.arduino.cc/reference/en/language/functions/communication/spi/

https://synapse.kyoto/glossary/spi/page001.html

Discussion