SPI通信について理解が浅かったのでわかりやすくまとめてみた。
CPOL
クロックが正論理なのか負論理なのかをクロックの極性という。(Clock Polarity=CPOL)
SPI通信においては以下のように定義する。
- CPOL=0の場合、クロックは正論理とする。
- CPOL=1の場合、クロックは負論理とする。
- 何も通信しないときは当然0にしておく。(CPOL=0のときはLow, CPOL=1のときはHi)
CPHA
クロックは1クロックで0から1、1から0に切り替わるがその切り替わりのタイミングのことをクロックの位相という。(Clock Phase=CPHA)
SPI通信においては以下のように定義する。
- CPHA=0の場合、0から1に切り替わるタイミングでデータを取り込むこととする。
- CPHA=1の場合、1から0に切り替わるタイミングでデータを取り込むこととする。
モードについて
SPI通信ではCPOLとCPHAの値によって4つのモードを定義する。
CPOL | CPHA | モード |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 2 |
1 | 1 | 3 |
以上
以下の図がわかりやすいだろう。
cf.https://www.diolan.com/dln_doc/spi-transfer-modes.html
(追記:20160113) モードを暗記する場合 、以下のように考えると覚えやすい。 デフォルトをモード0とする。 クロックが1→ 0になるときに取り込みを行う場合、モードに1を足す。 クロックが負論理ならモードに2を足す。 まとめると単にこれだけのことである。
==
余談
ネット上の解説では、CPHAのタイミングについて立ち上がり立下りなどという表現が使われたりしているがHi Lowの切り替わりと勘違いしそうなのでやめた方がいい気がする。
またサンプルされない位相でデータがシフトされるという説明がよくあるが一般的に言い切ってしまうとmode=0のときの1ビット目はどうするんだという話になったり、mode=0の最後では何をシフトしてるんですか?という話になったりするのでやめた方がいい気がする。
そもそもシフトタイミングについてはサンプルのタイミングさえ厳密に決まれば自由のはずなので仕様的には未定義なのではないだろうか?