🔟

SPI ライブラリに SS の場所を指定していないのに動く理由

2023/05/07に公開

名称とピンの関係

名称1 名称2 ピン Arduino UNO
SCK (Serial ClocK) CLK (CLocK) 13 ハードウェア的に固定
MISO (Master In Slave Out) DO (Data Out) 12 ハードウェア的に固定
MOSI (Master Out Slave In) DIN (Data IN) 11 ハードウェア的に固定
SS (Slave Select) CS (Chip Select) 10 ソフトウェア的に固定
  • 名称1も2も同じ意味
  • 用途やサイトによって微妙に名称が変わるのがややこしい
  • SSピンは任意とされているけどライブラリを使うなら必ず10番を使わなければならない

SS ピンの場所は任意なはずでは?

いろんな技術ブログで SS ピンは任意と書いてある。しかしドキュメントには SPI.begin() が SS ピンを操作する旨が書かれてある。これはどういうことなのか?

SPI.begin() に SS ピンの場所を渡してないけど? ドキュメントが間違っている? と、今の自分と同じ疑問を持った人の Issue が4年前に上がっていた。

https://github.com/arduino/Arduino/issues/8934

この Issue への回答がすべてのもやもやを解決してくれた。ライブラリは** SS を10番固定として扱っている**のだった。つまり文脈が違う。だから、

  • ハードウェアとして見たとき SS ピンの場所は → 決まっていない
  • SPIライブラリも含めて見たとき SS ピンの場所は → 決まっている

となる。

定数を自分で定義する必要はない

https://github.com/arduino/ArduinoCore-avr/blob/1.8.6/variants/standard/pins_arduino.h#L38-L46

これも上の Issue でわかったのだけど自分で毎回定義する必要なかった。この定義を使えばよいだけだった。pins_arduino.h は最初から入っている。SPI.h をインクルードしたら使えるようになるわけではない。const 変数 SS に代入している理由はわからないけど短かく書きたい場合は SS でもよかった。定義ファイルはローカルだと ~/Library/Arduino15 以下の深くにある。

まとめ

  • SSピンの場所が自由なのはハードウェア的に見たときだけ
  • ライブラリの中では SS は 10 番ピンを使うことになっている
  • 10〜13 の定数はすでに Arduino が定義してある

Discussion