SPIの罠

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の思うツボなのです。

Top