SPIとはSerial Peripheral Interfaceの略です。
太字で書きましたが、略などどうでもいいです。
基板上のIC間で使われるシリアル通信の規格の一つです。
この通信は同期型です。
同期型とは時間を計る必要がない通信を意味します。
「同期」というといかにも時間を計ってそうに聞こえますが、これはMicrochipの罠です。
時間を計らないのが同期型です。
通信には3本の線を使います。
3本と聞くと「RS232Cも3本(Tx, Rx, GND)だったから同じ?」と思った人はMicrochipの罠にはまっています。
SPIは同じ基板中のICの通信なのでGNDが共通になっていることが前提になっています。
なのでそういう意味では4本です。
GNDの他に、送信用、受信用の線とクロック用の線があります。
通信をするもののどちらかがクロック信号を出します。
クロックを出す側をマスターと呼びます。
クロックの立ち上がり、または立下りの瞬間に双方が受信データを読みます。
クロックは別に一定周期である必要はありません。
タイミングはいつでもOKです。
時間を制御しなくていいので、マイコンである必要もなく、手押しのスイッチでもOKです。
下の図はSPI入力のDAコンバータにスイッチでデータを送る回路です。
SDIピンがデータ入力、SCKピンはクロック入力です。
SW1でデータをセットして、SW2で送信します。
このDAコンバータは立ち上がりでデータを読むのでSW2を押した瞬間のSDIピンの電圧を読みます。
離したときには何も起こりません。
これを繰り返せばSPI通信完成です。
タイミングを合わせて0.1[ms]毎にボタンを押すというような人間離れした技は必要ありません。
このDAコンバータはSPI出力を出さないので、反対方向の通信は必要ありません。
チャタリングは気にしない方向で(´・ω・`)
このDAコンバータは立上りでデータを読むタイプですが、立下りでデータを読むICもあります。
また、この回路は通常SCKピンは"0"で、ボタンを押して離した時に"1"→"0"と変化しますが、
逆に通常SCKピンは"1"で、ボタンを押して離した時に"0"→"1"と変化する回路も考えられます。
つまり、SPI通信には以下の組み合わせで4つのパターンがあります。
・クロック立上り時に読むか、立下り時に読むか
・クロックは通常時"0"か、通常時"1"か
実は ここにSPI最大の罠が隠されています。
罠はこのパターンの表現です。
なんと各社全く違う表現をします。
以下の表が各表現の対応です。タイミング欄の赤点線の瞬間にデータを送受信します
つまり、仕様書には「SPI通信はMode0,0でよろしく!」と書いてあるものもあれば、
「CKP = 0, CKE = 0 でお願いします_(._.)_」と書いてあるものもあります。
普通に考えると「Mode0,0 って、CKP = 0, CKE = 0 と同じなのかな?」と思います。
だれだってそう思います。僕もそう思います。
でも現実は無情。上の表の通り、全く別のパターンです。
対策は、毎回この表を見ることです。
記憶などに頼ってはいけません!ましてや「なんでこう呼ぶのかな?」などと考えてはいけません。
それこそMicrochipの思うツボなのです。