SPI通信覚え書き

はじめに

EEPROMやセンサとマイコンの通信に使われるインターフェースとして,
I2Cに並んでよく使われるのがSPI.

線の数は増える(I2Cの約2倍)だし,
バイスをつなげばつなぐほどホストのCPUのピンを圧迫するが,
基本的にI2Cよりもずっと高速でかつ仕組みが単純で,
アドレスの衝突を気にしなくても良いため,未だに人気のインターフェースと言えよう.

さて,SPIの通信には4種類のモードがあるのは良く知られている話である.
各々4種類の通信モードには,

  • クロックが立ち上がり先行か,立下り先行か
  • ラッチが立ち上がり時か,立下り時か

の2つのパラメータがあるため,2×2で4種類であると言うことである.
で,このモード,個人的に非常に覚えにくいのでまとめの図と簡単な解説を
ここに覚え書きとして書いておくことにする.

クロック(CPOL)

クロックの立ち上がり先行か立ち下がり先行か,と書くと微妙にわかりにくいが,
要は
「バスオフ時(SPIで何処とも通信していない時)に,クロックラインがHなのかLなのか」
と言うことである.
クロックラインが普段L(CPOL=L)であれば,当然通信を開始するとき(=クロックを生成するとき)は まず最初にクロックラインがL→Hになる.
逆にクロックラインが普段Hであれば,クロックラインはまずH→Lになると言うことである.

また,クロックの論理にもこれは絡んでくる.

普段Lのクロックラインがクロックを生成するのであれば,
それは必ずL→H→L,の順でクロックが生成される.
図を描いてみればわかるが,これは凸型のパルスになるので,
正論理のパルスと考えることができる.
その逆にクロックラインが普段Hであるならば,
クロックは必ずH→L→Hの凹型の負論理のパルスとなる.
このときパルスの前半(正論理ならL→H,負論理ならH→L)をパルスの前縁
パルスの後半(正論理ならH→L,負論理ならL→H)をパルスの後縁
と言い表す.

ラッチ(CPHA)

SPIを実際にCPUに実装する(あるいは,FPGAにSPIインターフェースを実装する)際,
良く使われるのがレジスタと書き込み読み込みを行うヘッダを用意し,
クロックが来た際に1ビットのデータを読み込む/書き込む→ヘッダを一つずらす
と言う実装方法であろう.
このとき,データの読み書き作業をラッチ,ヘッダをずらす動作をシフトと言う

クロックはH->L,L->Hで1セットなのだから,
データの読み書きとヘッダをずらす作業をそれぞれのタイミングで行う形になる.
それぞれ別にすることで,ヘッダをずらしている最中にデータを読みにくい,
など通信が不安定になる要素を排除できる.
つまるところ,ラッチをL→Hで行うのか,H→Lで行うのか(シフトはその逆で行う)
で2通りの通信方法があるわけだが,これをパルスの前縁,後縁のどちらで行うのか?
という書き方で説明しているものが多い.

上のパルスの項で説明したが,パルスの前縁・後縁と言っても,
パルスそのものが正論理なのか負論理なのかで意味するものが逆になってしまう.
正直,図を書くときにわかりにくいので,
ラッチ(読み書きを)L→Hで行うのか?H→Lで行うのか?
で覚えるほうが楽であろう.

まとめ

そんなわけでまとめである.
このエントリはほとんどこの表を書くためだけに存在する.
上の文章は,ただ単に表を張るだけではかっこ悪いと言うだけである.

普段バスがL (CPOL=L) 普段バスがH (CPOL=H)
立上りで読み書き (CPHA=L->H) モード0 モード3
立下りで読み書き (CPHA=H->L) モード1 モード2

それでは,また.