🔟
SPI ライブラリに SS の場所を指定していないのに動く理由
名称とピンの関係
名称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年前に上がっていた。
この Issue への回答がすべてのもやもやを解決してくれた。ライブラリは** SS を10番固定として扱っている**のだった。つまり文脈が違う。だから、
- ハードウェアとして見たとき SS ピンの場所は → 決まっていない
- SPIライブラリも含めて見たとき SS ピンの場所は → 決まっている
となる。
定数を自分で定義する必要はない
これも上の Issue でわかったのだけど自分で毎回定義する必要なかった。この定義を使えばよいだけだった。pins_arduino.h
は最初から入っている。SPI.h
をインクルードしたら使えるようになるわけではない。const 変数 SS
に代入している理由はわからないけど短かく書きたい場合は SS
でもよかった。定義ファイルはローカルだと ~/Library/Arduino15
以下の深くにある。
まとめ
- SSピンの場所が自由なのはハードウェア的に見たときだけ
- ライブラリの中では SS は 10 番ピンを使うことになっている
- 10〜13 の定数はすでに Arduino が定義してある
Discussion